ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBjMDEyNmNkLi4wMzEyZWZlIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjkgQEAKKzIwMDYtMDQtMTggIERKIERlbG9yaWUgIDxkakByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG0zMmMpOiBCdWlsZCBsaWJzdGRjKystdjMuICBQYXNzIGZsYWdzIHRvCisJcmVmZXJlbmNlIGxpYmdsb3NzIHNvIHRoYXQgbGlic3NwIGNhbiBiZSBidWlsdCBpbiBhIGNvbWJpbmVkCisJdHJlZS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAwNi0wNC0xMCAgQmVuIEVsbGlzdG9uICA8YmplQGF1LmlibS5jb20+CisKKwkqIGNvbnRyaWI6IFJlbW92ZSBkaXJlY3RvcnkuCisKKzIwMDYtMDQtMDYgIENhcmxvcyBPJ0RvbmVsbCA8Y2FybG9zQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIE1ha2VmaWxlLnRwbDogQWRkIGluc3RhbGwtaHRtbCB0YXJnZXQuCisJKiBNYWtlZmlsZS5kZWY6IEFkZCBpbnN0YWxsLWh0bWwgdGFyZ2V0LgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBjb25maWd1cmUuaW46IEFkZCAtLXdpdGgtZGF0YXJvb3RkaXIsIC0td2l0aC1kb2NkaXIsCisJYW5kIC0td2l0aC1odG1sZGlyIG9wdGlvbnMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDYtMDMtMzEgIEJlbiBFbGxpc3RvbiAgPGJqZUBhdS5pYm0uY29tPgorCisJUFIgYmludXRpbHMvMTg2MAorCSogY29uZmlndXJlLmluOiBSZXF1aXJlIG1ha2VpbmZvIDQuNCBvciBoaWdoZXIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKIDIwMDYtMDMtMTQgIFBhb2xvIEJvbnppbmkgIDxib256aW5pQGdudS5vcmc+CiAKIAkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuZGVmIGIvTWFrZWZpbGUuZGVmCmluZGV4IDMyMjdhNDQuLjRjNThhYjUgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmRlZgorKysgYi9NYWtlZmlsZS5kZWYKQEAgLTE1NSw2ICsxNTUsOSBAQAogcmVjdXJzaXZlX3RhcmdldHMgPSB7IG1ha2VfdGFyZ2V0PSBpbnN0YWxsLWluZm87IAogICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZD1jb25maWd1cmU7CiAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kPWluZm87IH07CityZWN1cnNpdmVfdGFyZ2V0cyA9IHsgbWFrZV90YXJnZXQ9IGluc3RhbGwtaHRtbDsgCisgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kPWNvbmZpZ3VyZTsKKyAgICAgICAgICAgICAgICAgICAgICBkZXBlbmQ9aHRtbDsgfTsKIHJlY3Vyc2l2ZV90YXJnZXRzID0geyBtYWtlX3RhcmdldD0gaW5zdGFsbGNoZWNrOyAKICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmQ9Y29uZmlndXJlOyB9OwogcmVjdXJzaXZlX3RhcmdldHMgPSB7IG1ha2VfdGFyZ2V0PSBtb3N0bHljbGVhbjsgfTsKQEAgLTE3Miw3ICsxNzUsMTAgQEAKIGZsYWdzX3RvX3Bhc3MgPSB7IGZsYWc9IGRhdGFkaXIgOyB9OwogZmxhZ3NfdG9fcGFzcyA9IHsgZmxhZz0gZXhlY19wcmVmaXggOyB9OwogZmxhZ3NfdG9fcGFzcyA9IHsgZmxhZz0gaW5jbHVkZWRpciA7IH07CitmbGFnc190b19wYXNzID0geyBmbGFnPSBkYXRhcm9vdGRpciA7IH07CitmbGFnc190b19wYXNzID0geyBmbGFnPSBkb2NkaXIgOyB9OwogZmxhZ3NfdG9fcGFzcyA9IHsgZmxhZz0gaW5mb2RpciA7IH07CitmbGFnc190b19wYXNzID0geyBmbGFnPSBodG1sZGlyIDsgfTsKIGZsYWdzX3RvX3Bhc3MgPSB7IGZsYWc9IGxpYmRpciA7IH07CiBmbGFnc190b19wYXNzID0geyBmbGFnPSBsaWJleGVjZGlyIDsgfTsKIGZsYWdzX3RvX3Bhc3MgPSB7IGZsYWc9IGxpc3BkaXIgOyB9OwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCBlYWU3NGE3Li4yZDBkYTJlIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtNTAsNiArNTAsOSBAQAogaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAogb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAogaW5mb2RpciA9IEBpbmZvZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAoraHRtbGRpciA9IEBodG1sZGlyQAogbWFuZGlyID0gQG1hbmRpckAKIG1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQogbWFuMmRpciA9ICQobWFuZGlyKS9tYW4yCkBAIC00MDUsNyArNDA4LDEwIEBACiAJImRhdGFkaXI9JChkYXRhZGlyKSIgXAogCSJleGVjX3ByZWZpeD0kKGV4ZWNfcHJlZml4KSIgXAogCSJpbmNsdWRlZGlyPSQoaW5jbHVkZWRpcikiIFwKKwkiZGF0YXJvb3RkaXI9JChkYXRhcm9vdGRpcikiIFwKKwkiZG9jZGlyPSQoZG9jZGlyKSIgXAogCSJpbmZvZGlyPSQoaW5mb2RpcikiIFwKKwkiaHRtbGRpcj0kKGh0bWxkaXIpIiBcCiAJImxpYmRpcj0kKGxpYmRpcikiIFwKIAkibGliZXhlY2Rpcj0kKGxpYmV4ZWNkaXIpIiBcCiAJImxpc3BkaXI9JChsaXNwZGlyKSIgXApAQCAtMTMwOSw2ICsxMzE1LDExMCBAQAogaW5zdGFsbC1pbmZvLXRhcmdldDogbWF5YmUtaW5zdGFsbC1pbmZvLXRhcmdldC1saWJhZGEKIGluc3RhbGwtaW5mby10YXJnZXQ6IG1heWJlLWluc3RhbGwtaW5mby10YXJnZXQtbGliZ29tcAogCisuUEhPTlk6IGRvLWluc3RhbGwtaHRtbAorZG8taW5zdGFsbC1odG1sOgorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTUFLRSkgJChSRUNVUlNFX0ZMQUdTX1RPX1BBU1MpIGluc3RhbGwtaHRtbC1ob3N0IFwKKwkgIGluc3RhbGwtaHRtbC10YXJnZXQKKworCisuUEhPTlk6IGluc3RhbGwtaHRtbC1ob3N0CisKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtYXNoCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWF1dG9jb25mCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWF1dG9tYWtlCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWJhc2gKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtYmZkCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLW9wY29kZXMKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtYmludXRpbHMKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtYmlzb24KK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtYnlhY2MKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtYnppcDIKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtZGVqYWdudQoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1kaWZmCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWRvc3V0aWxzCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWV0YworaW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1mYXN0amFyCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWZpbGV1dGlscworaW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1maW5kdXRpbHMKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtZmluZAoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1maXhpbmNsdWRlcworaW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1mbGV4CitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWdhcworaW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1nY2MKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtZ2F3aworaW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1nZXR0ZXh0CitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWdudXNlcnYKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtZ3Byb2YKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtZ3ppcAoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1oZWxsbworaW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1pbmRlbnQKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtaW50bAoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC10Y2wKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtaXRjbAoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1sZAoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1saWJjcHAKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtbGliZGVjbnVtYmVyCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWxpYmd1aQoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1saWJpYmVydHkKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtbGlidG9vbAoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1tNAoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1tYWtlCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLW1tYWxsb2MKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtcGF0Y2gKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtcGVybAoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1wcm1zCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLXJjcworaW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1yZWFkbGluZQoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1yZWxlYXNlCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLXJlY29kZQoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1zZWQKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtc2VuZC1wcgoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1zaGVsbHV0aWxzCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLXNpZAoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1zaW0KK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLXRleGluZm8KK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtdGV4dHV0aWxzCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLXRpbWUKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtdXVkZWNvZGUKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtd2RpZmYKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtemlwCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLXpsaWIKK2luc3RhbGwtaHRtbC1ob3N0OiBtYXliZS1pbnN0YWxsLWh0bWwtZ2RiCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWV4cGVjdAoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1ndWlsZQoraW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC10aworaW5zdGFsbC1odG1sLWhvc3Q6IG1heWJlLWluc3RhbGwtaHRtbC1saWJ0ZXJtY2FwCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLXV0aWxzCitpbnN0YWxsLWh0bWwtaG9zdDogbWF5YmUtaW5zdGFsbC1odG1sLWduYXR0b29scworCisuUEhPTlk6IGluc3RhbGwtaHRtbC10YXJnZXQKKworaW5zdGFsbC1odG1sLXRhcmdldDogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJzdGRjKystdjMKK2luc3RhbGwtaHRtbC10YXJnZXQ6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGlibXVkZmxhcAoraW5zdGFsbC1odG1sLXRhcmdldDogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJzc3AKK2luc3RhbGwtaHRtbC10YXJnZXQ6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliZ2NjLW1hdGgKK2luc3RhbGwtaHRtbC10YXJnZXQ6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbmV3bGliCitpbnN0YWxsLWh0bWwtdGFyZ2V0OiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmdmb3J0cmFuCitpbnN0YWxsLWh0bWwtdGFyZ2V0OiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYm9iamMKK2luc3RhbGwtaHRtbC10YXJnZXQ6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGlidGVybWNhcAoraW5zdGFsbC1odG1sLXRhcmdldDogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC13aW5zdXAKK2luc3RhbGwtaHRtbC10YXJnZXQ6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliZ2xvc3MKK2luc3RhbGwtaHRtbC10YXJnZXQ6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliaWJlcnR5CitpbnN0YWxsLWh0bWwtdGFyZ2V0OiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWdwZXJmCitpbnN0YWxsLWh0bWwtdGFyZ2V0OiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWV4YW1wbGVzCitpbnN0YWxsLWh0bWwtdGFyZ2V0OiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmZmaQoraW5zdGFsbC1odG1sLXRhcmdldDogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJqYXZhCitpbnN0YWxsLWh0bWwtdGFyZ2V0OiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LXpsaWIKK2luc3RhbGwtaHRtbC10YXJnZXQ6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtYm9laG0tZ2MKK2luc3RhbGwtaHRtbC10YXJnZXQ6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtcXRocmVhZHMKK2luc3RhbGwtaHRtbC10YXJnZXQ6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtcmRhCitpbnN0YWxsLWh0bWwtdGFyZ2V0OiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmFkYQoraW5zdGFsbC1odG1sLXRhcmdldDogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJnb21wCisKIC5QSE9OWTogZG8taW5zdGFsbGNoZWNrCiBkby1pbnN0YWxsY2hlY2s6CiAJQDogJChNQUtFKTsgJCh1bnN0YWdlKQpAQCAtMTgzMiw3ICsxOTQyLDcgQEAKIAogIyBIZXJlIGFyZSB0aGUgdGFyZ2V0cyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBkby1YIHRhcmdldHMuCiAKLS5QSE9OWTogaW5mbyBpbnN0YWxsY2hlY2sgZHZpIGh0bWwgaW5zdGFsbC1pbmZvCisuUEhPTlk6IGluZm8gaW5zdGFsbGNoZWNrIGR2aSBodG1sIGluc3RhbGwtaW5mbyBpbnN0YWxsLWh0bWwKIC5QSE9OWTogY2xlYW4gZGlzdGNsZWFuIG1vc3RseWNsZWFuIG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuCiAuUEhPTlk6IGxvY2FsLWNsZWFuIGxvY2FsLWRpc3RjbGVhbiBsb2NhbC1tYWludGFpbmVyLWNsZWFuCiBpbmZvOiBkby1pbmZvCkBAIC0xODUwLDYgKzE5NjAsOCBAQAogCSAgJChJTlNUQUxMX0RBVEEpIGRpci5pbmZvICQoREVTVERJUikkKGluZm9kaXIpL2Rpci5pbmZvIDsgXAogCWVsc2UgdHJ1ZSA7IGZpCiAKK2luc3RhbGwtaHRtbDogZG8taW5zdGFsbC1odG1sCisKIGxvY2FsLWNsZWFuOgogCS1ybSAtZiAqLmEgVEVNUCBlcnJzIGNvcmUgKi5vICp+IFwjKiBUQUdTICouRSAqLmxvZwogCkBAIC0yODAxLDYgKzI5MTMsMzMgQEAKIAogQGVuZGlmIGFzaAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1hc2ggaW5zdGFsbC1odG1sLWFzaAorbWF5YmUtaW5zdGFsbC1odG1sLWFzaDoKK0BpZiBhc2gKK21heWJlLWluc3RhbGwtaHRtbC1hc2g6IGluc3RhbGwtaHRtbC1hc2gKKworaW5zdGFsbC1odG1sLWFzaDogXAorICAgIGNvbmZpZ3VyZS1hc2ggXAorICAgIGh0bWwtYXNoIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2FzaC9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gYXNoIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvYXNoICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGFzaAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1hc2ggaW5zdGFsbGNoZWNrLWFzaAogbWF5YmUtaW5zdGFsbGNoZWNrLWFzaDoKIEBpZiBhc2gKQEAgLTMxMzgsNiArMzI3NywzMyBAQAogCiBAZW5kaWYgYXV0b2NvbmYKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtYXV0b2NvbmYgaW5zdGFsbC1odG1sLWF1dG9jb25mCittYXliZS1pbnN0YWxsLWh0bWwtYXV0b2NvbmY6CitAaWYgYXV0b2NvbmYKK21heWJlLWluc3RhbGwtaHRtbC1hdXRvY29uZjogaW5zdGFsbC1odG1sLWF1dG9jb25mCisKK2luc3RhbGwtaHRtbC1hdXRvY29uZjogXAorICAgIGNvbmZpZ3VyZS1hdXRvY29uZiBcCisgICAgaHRtbC1hdXRvY29uZiAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9hdXRvY29uZi9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gYXV0b2NvbmYiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9hdXRvY29uZiAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBhdXRvY29uZgorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1hdXRvY29uZiBpbnN0YWxsY2hlY2stYXV0b2NvbmYKIG1heWJlLWluc3RhbGxjaGVjay1hdXRvY29uZjoKIEBpZiBhdXRvY29uZgpAQCAtMzQ3NSw2ICszNjQxLDMzIEBACiAKIEBlbmRpZiBhdXRvbWFrZQogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1hdXRvbWFrZSBpbnN0YWxsLWh0bWwtYXV0b21ha2UKK21heWJlLWluc3RhbGwtaHRtbC1hdXRvbWFrZToKK0BpZiBhdXRvbWFrZQorbWF5YmUtaW5zdGFsbC1odG1sLWF1dG9tYWtlOiBpbnN0YWxsLWh0bWwtYXV0b21ha2UKKworaW5zdGFsbC1odG1sLWF1dG9tYWtlOiBcCisgICAgY29uZmlndXJlLWF1dG9tYWtlIFwKKyAgICBodG1sLWF1dG9tYWtlIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2F1dG9tYWtlL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBhdXRvbWFrZSIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2F1dG9tYWtlICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGF1dG9tYWtlCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLWF1dG9tYWtlIGluc3RhbGxjaGVjay1hdXRvbWFrZQogbWF5YmUtaW5zdGFsbGNoZWNrLWF1dG9tYWtlOgogQGlmIGF1dG9tYWtlCkBAIC0zODEyLDYgKzQwMDUsMzMgQEAKIAogQGVuZGlmIGJhc2gKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtYmFzaCBpbnN0YWxsLWh0bWwtYmFzaAorbWF5YmUtaW5zdGFsbC1odG1sLWJhc2g6CitAaWYgYmFzaAorbWF5YmUtaW5zdGFsbC1odG1sLWJhc2g6IGluc3RhbGwtaHRtbC1iYXNoCisKK2luc3RhbGwtaHRtbC1iYXNoOiBcCisgICAgY29uZmlndXJlLWJhc2ggXAorICAgIGh0bWwtYmFzaCAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9iYXNoL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBiYXNoIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvYmFzaCAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBiYXNoCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLWJhc2ggaW5zdGFsbGNoZWNrLWJhc2gKIG1heWJlLWluc3RhbGxjaGVjay1iYXNoOgogQGlmIGJhc2gKQEAgLTQ1MDEsNiArNDcyMSwzMiBAQAogCiBAZW5kaWYgYmZkCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWJmZCBpbnN0YWxsLWh0bWwtYmZkCittYXliZS1pbnN0YWxsLWh0bWwtYmZkOgorQGlmIGJmZAorbWF5YmUtaW5zdGFsbC1odG1sLWJmZDogaW5zdGFsbC1odG1sLWJmZAorCitpbnN0YWxsLWh0bWwtYmZkOiBcCisgICAgY29uZmlndXJlLWJmZCBcCisgICAgaHRtbC1iZmQgCisJQFsgLWYgLi9iZmQvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGJmZCIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2JmZCAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBiZmQKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stYmZkIGluc3RhbGxjaGVjay1iZmQKIG1heWJlLWluc3RhbGxjaGVjay1iZmQ6CiBAaWYgYmZkCkBAIC01MTg1LDYgKzU0MzEsMzIgQEAKIAogQGVuZGlmIG9wY29kZXMKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtb3Bjb2RlcyBpbnN0YWxsLWh0bWwtb3Bjb2RlcworbWF5YmUtaW5zdGFsbC1odG1sLW9wY29kZXM6CitAaWYgb3Bjb2RlcworbWF5YmUtaW5zdGFsbC1odG1sLW9wY29kZXM6IGluc3RhbGwtaHRtbC1vcGNvZGVzCisKK2luc3RhbGwtaHRtbC1vcGNvZGVzOiBcCisgICAgY29uZmlndXJlLW9wY29kZXMgXAorICAgIGh0bWwtb3Bjb2RlcyAKKwlAWyAtZiAuL29wY29kZXMvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIG9wY29kZXMiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9vcGNvZGVzICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIG9wY29kZXMKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stb3Bjb2RlcyBpbnN0YWxsY2hlY2stb3Bjb2RlcwogbWF5YmUtaW5zdGFsbGNoZWNrLW9wY29kZXM6CiBAaWYgb3Bjb2RlcwpAQCAtNTg2OSw2ICs2MTQxLDMyIEBACiAKIEBlbmRpZiBiaW51dGlscwogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1iaW51dGlscyBpbnN0YWxsLWh0bWwtYmludXRpbHMKK21heWJlLWluc3RhbGwtaHRtbC1iaW51dGlsczoKK0BpZiBiaW51dGlscworbWF5YmUtaW5zdGFsbC1odG1sLWJpbnV0aWxzOiBpbnN0YWxsLWh0bWwtYmludXRpbHMKKworaW5zdGFsbC1odG1sLWJpbnV0aWxzOiBcCisgICAgY29uZmlndXJlLWJpbnV0aWxzIFwKKyAgICBodG1sLWJpbnV0aWxzIAorCUBbIC1mIC4vYmludXRpbHMvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGJpbnV0aWxzIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvYmludXRpbHMgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgYmludXRpbHMKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stYmludXRpbHMgaW5zdGFsbGNoZWNrLWJpbnV0aWxzCiBtYXliZS1pbnN0YWxsY2hlY2stYmludXRpbHM6CiBAaWYgYmludXRpbHMKQEAgLTYyMDQsNiArNjUwMiwzMyBAQAogCiBAZW5kaWYgYmlzb24KIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtYmlzb24gaW5zdGFsbC1odG1sLWJpc29uCittYXliZS1pbnN0YWxsLWh0bWwtYmlzb246CitAaWYgYmlzb24KK21heWJlLWluc3RhbGwtaHRtbC1iaXNvbjogaW5zdGFsbC1odG1sLWJpc29uCisKK2luc3RhbGwtaHRtbC1iaXNvbjogXAorICAgIGNvbmZpZ3VyZS1iaXNvbiBcCisgICAgaHRtbC1iaXNvbiAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9iaXNvbi9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gYmlzb24iIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9iaXNvbiAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBiaXNvbgorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1iaXNvbiBpbnN0YWxsY2hlY2stYmlzb24KIG1heWJlLWluc3RhbGxjaGVjay1iaXNvbjoKIEBpZiBiaXNvbgpAQCAtNjU0NCw2ICs2ODY5LDMzIEBACiAKIEBlbmRpZiBieWFjYwogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1ieWFjYyBpbnN0YWxsLWh0bWwtYnlhY2MKK21heWJlLWluc3RhbGwtaHRtbC1ieWFjYzoKK0BpZiBieWFjYworbWF5YmUtaW5zdGFsbC1odG1sLWJ5YWNjOiBpbnN0YWxsLWh0bWwtYnlhY2MKKworaW5zdGFsbC1odG1sLWJ5YWNjOiBcCisgICAgY29uZmlndXJlLWJ5YWNjIFwKKyAgICBodG1sLWJ5YWNjIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2J5YWNjL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBieWFjYyIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2J5YWNjICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGJ5YWNjCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLWJ5YWNjIGluc3RhbGxjaGVjay1ieWFjYwogbWF5YmUtaW5zdGFsbGNoZWNrLWJ5YWNjOgogQGlmIGJ5YWNjCkBAIC02ODgxLDYgKzcyMzMsMzMgQEAKIAogQGVuZGlmIGJ6aXAyCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWJ6aXAyIGluc3RhbGwtaHRtbC1iemlwMgorbWF5YmUtaW5zdGFsbC1odG1sLWJ6aXAyOgorQGlmIGJ6aXAyCittYXliZS1pbnN0YWxsLWh0bWwtYnppcDI6IGluc3RhbGwtaHRtbC1iemlwMgorCitpbnN0YWxsLWh0bWwtYnppcDI6IFwKKyAgICBjb25maWd1cmUtYnppcDIgXAorICAgIGh0bWwtYnppcDIgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vYnppcDIvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGJ6aXAyIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvYnppcDIgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgYnppcDIKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stYnppcDIgaW5zdGFsbGNoZWNrLWJ6aXAyCiBtYXliZS1pbnN0YWxsY2hlY2stYnppcDI6CiBAaWYgYnppcDIKQEAgLTcyMTgsNiArNzU5NywzMyBAQAogCiBAZW5kaWYgZGVqYWdudQogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1kZWphZ251IGluc3RhbGwtaHRtbC1kZWphZ251CittYXliZS1pbnN0YWxsLWh0bWwtZGVqYWdudToKK0BpZiBkZWphZ251CittYXliZS1pbnN0YWxsLWh0bWwtZGVqYWdudTogaW5zdGFsbC1odG1sLWRlamFnbnUKKworaW5zdGFsbC1odG1sLWRlamFnbnU6IFwKKyAgICBjb25maWd1cmUtZGVqYWdudSBcCisgICAgaHRtbC1kZWphZ251IAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2RlamFnbnUvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGRlamFnbnUiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9kZWphZ251ICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGRlamFnbnUKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stZGVqYWdudSBpbnN0YWxsY2hlY2stZGVqYWdudQogbWF5YmUtaW5zdGFsbGNoZWNrLWRlamFnbnU6CiBAaWYgZGVqYWdudQpAQCAtNzU1NSw2ICs3OTYxLDMzIEBACiAKIEBlbmRpZiBkaWZmCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWRpZmYgaW5zdGFsbC1odG1sLWRpZmYKK21heWJlLWluc3RhbGwtaHRtbC1kaWZmOgorQGlmIGRpZmYKK21heWJlLWluc3RhbGwtaHRtbC1kaWZmOiBpbnN0YWxsLWh0bWwtZGlmZgorCitpbnN0YWxsLWh0bWwtZGlmZjogXAorICAgIGNvbmZpZ3VyZS1kaWZmIFwKKyAgICBodG1sLWRpZmYgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vZGlmZi9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gZGlmZiIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2RpZmYgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgZGlmZgorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1kaWZmIGluc3RhbGxjaGVjay1kaWZmCiBtYXliZS1pbnN0YWxsY2hlY2stZGlmZjoKIEBpZiBkaWZmCkBAIC03ODg2LDYgKzgzMTksMzMgQEAKIAogQGVuZGlmIGRvc3V0aWxzCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWRvc3V0aWxzIGluc3RhbGwtaHRtbC1kb3N1dGlscworbWF5YmUtaW5zdGFsbC1odG1sLWRvc3V0aWxzOgorQGlmIGRvc3V0aWxzCittYXliZS1pbnN0YWxsLWh0bWwtZG9zdXRpbHM6IGluc3RhbGwtaHRtbC1kb3N1dGlscworCitpbnN0YWxsLWh0bWwtZG9zdXRpbHM6IFwKKyAgICBjb25maWd1cmUtZG9zdXRpbHMgXAorICAgIGh0bWwtZG9zdXRpbHMgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vZG9zdXRpbHMvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGRvc3V0aWxzIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvZG9zdXRpbHMgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgZG9zdXRpbHMKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stZG9zdXRpbHMgaW5zdGFsbGNoZWNrLWRvc3V0aWxzCiBtYXliZS1pbnN0YWxsY2hlY2stZG9zdXRpbHM6CiBAaWYgZG9zdXRpbHMKQEAgLTgyMjMsNiArODY4MywzMyBAQAogCiBAZW5kaWYgZXRjCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWV0YyBpbnN0YWxsLWh0bWwtZXRjCittYXliZS1pbnN0YWxsLWh0bWwtZXRjOgorQGlmIGV0YworbWF5YmUtaW5zdGFsbC1odG1sLWV0YzogaW5zdGFsbC1odG1sLWV0YworCitpbnN0YWxsLWh0bWwtZXRjOiBcCisgICAgY29uZmlndXJlLWV0YyBcCisgICAgaHRtbC1ldGMgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vZXRjL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBldGMiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9ldGMgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgZXRjCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLWV0YyBpbnN0YWxsY2hlY2stZXRjCiBtYXliZS1pbnN0YWxsY2hlY2stZXRjOgogQGlmIGV0YwpAQCAtODU2Myw2ICs5MDUwLDMzIEBACiAKIEBlbmRpZiBmYXN0amFyCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWZhc3RqYXIgaW5zdGFsbC1odG1sLWZhc3RqYXIKK21heWJlLWluc3RhbGwtaHRtbC1mYXN0amFyOgorQGlmIGZhc3RqYXIKK21heWJlLWluc3RhbGwtaHRtbC1mYXN0amFyOiBpbnN0YWxsLWh0bWwtZmFzdGphcgorCitpbnN0YWxsLWh0bWwtZmFzdGphcjogXAorICAgIGNvbmZpZ3VyZS1mYXN0amFyIFwKKyAgICBodG1sLWZhc3RqYXIgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vZmFzdGphci9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gZmFzdGphciIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2Zhc3RqYXIgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgZmFzdGphcgorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1mYXN0amFyIGluc3RhbGxjaGVjay1mYXN0amFyCiBtYXliZS1pbnN0YWxsY2hlY2stZmFzdGphcjoKIEBpZiBmYXN0amFyCkBAIC04OTAwLDYgKzk0MTQsMzMgQEAKIAogQGVuZGlmIGZpbGV1dGlscwogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1maWxldXRpbHMgaW5zdGFsbC1odG1sLWZpbGV1dGlscworbWF5YmUtaW5zdGFsbC1odG1sLWZpbGV1dGlsczoKK0BpZiBmaWxldXRpbHMKK21heWJlLWluc3RhbGwtaHRtbC1maWxldXRpbHM6IGluc3RhbGwtaHRtbC1maWxldXRpbHMKKworaW5zdGFsbC1odG1sLWZpbGV1dGlsczogXAorICAgIGNvbmZpZ3VyZS1maWxldXRpbHMgXAorICAgIGh0bWwtZmlsZXV0aWxzIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2ZpbGV1dGlscy9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gZmlsZXV0aWxzIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvZmlsZXV0aWxzICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGZpbGV1dGlscworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1maWxldXRpbHMgaW5zdGFsbGNoZWNrLWZpbGV1dGlscwogbWF5YmUtaW5zdGFsbGNoZWNrLWZpbGV1dGlsczoKIEBpZiBmaWxldXRpbHMKQEAgLTkyMzcsNiArOTc3OCwzMyBAQAogCiBAZW5kaWYgZmluZHV0aWxzCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWZpbmR1dGlscyBpbnN0YWxsLWh0bWwtZmluZHV0aWxzCittYXliZS1pbnN0YWxsLWh0bWwtZmluZHV0aWxzOgorQGlmIGZpbmR1dGlscworbWF5YmUtaW5zdGFsbC1odG1sLWZpbmR1dGlsczogaW5zdGFsbC1odG1sLWZpbmR1dGlscworCitpbnN0YWxsLWh0bWwtZmluZHV0aWxzOiBcCisgICAgY29uZmlndXJlLWZpbmR1dGlscyBcCisgICAgaHRtbC1maW5kdXRpbHMgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vZmluZHV0aWxzL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBmaW5kdXRpbHMiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9maW5kdXRpbHMgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgZmluZHV0aWxzCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLWZpbmR1dGlscyBpbnN0YWxsY2hlY2stZmluZHV0aWxzCiBtYXliZS1pbnN0YWxsY2hlY2stZmluZHV0aWxzOgogQGlmIGZpbmR1dGlscwpAQCAtOTU3NCw2ICsxMDE0MiwzMyBAQAogCiBAZW5kaWYgZmluZAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1maW5kIGluc3RhbGwtaHRtbC1maW5kCittYXliZS1pbnN0YWxsLWh0bWwtZmluZDoKK0BpZiBmaW5kCittYXliZS1pbnN0YWxsLWh0bWwtZmluZDogaW5zdGFsbC1odG1sLWZpbmQKKworaW5zdGFsbC1odG1sLWZpbmQ6IFwKKyAgICBjb25maWd1cmUtZmluZCBcCisgICAgaHRtbC1maW5kIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2ZpbmQvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGZpbmQiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9maW5kICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGZpbmQKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stZmluZCBpbnN0YWxsY2hlY2stZmluZAogbWF5YmUtaW5zdGFsbGNoZWNrLWZpbmQ6CiBAaWYgZmluZApAQCAtOTg0Niw2ICsxMDQ0MSwzMyBAQAogCiBAZW5kaWYgZml4aW5jbHVkZXMKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtZml4aW5jbHVkZXMgaW5zdGFsbC1odG1sLWZpeGluY2x1ZGVzCittYXliZS1pbnN0YWxsLWh0bWwtZml4aW5jbHVkZXM6CitAaWYgZml4aW5jbHVkZXMKK21heWJlLWluc3RhbGwtaHRtbC1maXhpbmNsdWRlczogaW5zdGFsbC1odG1sLWZpeGluY2x1ZGVzCisKK2luc3RhbGwtaHRtbC1maXhpbmNsdWRlczogXAorICAgIGNvbmZpZ3VyZS1maXhpbmNsdWRlcyBcCisgICAgaHRtbC1maXhpbmNsdWRlcyAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9maXhpbmNsdWRlcy9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gZml4aW5jbHVkZXMiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9maXhpbmNsdWRlcyAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBmaXhpbmNsdWRlcworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1maXhpbmNsdWRlcyBpbnN0YWxsY2hlY2stZml4aW5jbHVkZXMKIG1heWJlLWluc3RhbGxjaGVjay1maXhpbmNsdWRlczoKIEBpZiBmaXhpbmNsdWRlcwpAQCAtMTAxNzAsNiArMTA3OTIsMzMgQEAKIAogQGVuZGlmIGZsZXgKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtZmxleCBpbnN0YWxsLWh0bWwtZmxleAorbWF5YmUtaW5zdGFsbC1odG1sLWZsZXg6CitAaWYgZmxleAorbWF5YmUtaW5zdGFsbC1odG1sLWZsZXg6IGluc3RhbGwtaHRtbC1mbGV4CisKK2luc3RhbGwtaHRtbC1mbGV4OiBcCisgICAgY29uZmlndXJlLWZsZXggXAorICAgIGh0bWwtZmxleCAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9mbGV4L01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBmbGV4IiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvZmxleCAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBmbGV4CisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLWZsZXggaW5zdGFsbGNoZWNrLWZsZXgKIG1heWJlLWluc3RhbGxjaGVjay1mbGV4OgogQGlmIGZsZXgKQEAgLTEwODU5LDYgKzExNTA4LDMyIEBACiAKIEBlbmRpZiBnYXMKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtZ2FzIGluc3RhbGwtaHRtbC1nYXMKK21heWJlLWluc3RhbGwtaHRtbC1nYXM6CitAaWYgZ2FzCittYXliZS1pbnN0YWxsLWh0bWwtZ2FzOiBpbnN0YWxsLWh0bWwtZ2FzCisKK2luc3RhbGwtaHRtbC1nYXM6IFwKKyAgICBjb25maWd1cmUtZ2FzIFwKKyAgICBodG1sLWdhcyAKKwlAWyAtZiAuL2dhcy9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gZ2FzIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvZ2FzICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGdhcworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1nYXMgaW5zdGFsbGNoZWNrLWdhcwogbWF5YmUtaW5zdGFsbGNoZWNrLWdhczoKIEBpZiBnYXMKQEAgLTExNTQzLDYgKzEyMjE4LDMyIEBACiAKIEBlbmRpZiBnY2MKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtZ2NjIGluc3RhbGwtaHRtbC1nY2MKK21heWJlLWluc3RhbGwtaHRtbC1nY2M6CitAaWYgZ2NjCittYXliZS1pbnN0YWxsLWh0bWwtZ2NjOiBpbnN0YWxsLWh0bWwtZ2NjCisKK2luc3RhbGwtaHRtbC1nY2M6IFwKKyAgICBjb25maWd1cmUtZ2NjIFwKKyAgICBodG1sLWdjYyAKKwlAWyAtZiAuL2djYy9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgJChFWFRSQV9HQ0NfRkxBR1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gZ2NjIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvZ2NjICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGdjYworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1nY2MgaW5zdGFsbGNoZWNrLWdjYwogbWF5YmUtaW5zdGFsbGNoZWNrLWdjYzoKIEBpZiBnY2MKQEAgLTExODc1LDYgKzEyNTc2LDMzIEBACiAKIEBlbmRpZiBnYXdrCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWdhd2sgaW5zdGFsbC1odG1sLWdhd2sKK21heWJlLWluc3RhbGwtaHRtbC1nYXdrOgorQGlmIGdhd2sKK21heWJlLWluc3RhbGwtaHRtbC1nYXdrOiBpbnN0YWxsLWh0bWwtZ2F3aworCitpbnN0YWxsLWh0bWwtZ2F3azogXAorICAgIGNvbmZpZ3VyZS1nYXdrIFwKKyAgICBodG1sLWdhd2sgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vZ2F3ay9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gZ2F3ayIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2dhd2sgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgZ2F3aworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1nYXdrIGluc3RhbGxjaGVjay1nYXdrCiBtYXliZS1pbnN0YWxsY2hlY2stZ2F3azoKIEBpZiBnYXdrCkBAIC0xMjIxMiw2ICsxMjk0MCwzMyBAQAogCiBAZW5kaWYgZ2V0dGV4dAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1nZXR0ZXh0IGluc3RhbGwtaHRtbC1nZXR0ZXh0CittYXliZS1pbnN0YWxsLWh0bWwtZ2V0dGV4dDoKK0BpZiBnZXR0ZXh0CittYXliZS1pbnN0YWxsLWh0bWwtZ2V0dGV4dDogaW5zdGFsbC1odG1sLWdldHRleHQKKworaW5zdGFsbC1odG1sLWdldHRleHQ6IFwKKyAgICBjb25maWd1cmUtZ2V0dGV4dCBcCisgICAgaHRtbC1nZXR0ZXh0IAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2dldHRleHQvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGdldHRleHQiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9nZXR0ZXh0ICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGdldHRleHQKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stZ2V0dGV4dCBpbnN0YWxsY2hlY2stZ2V0dGV4dAogbWF5YmUtaW5zdGFsbGNoZWNrLWdldHRleHQ6CiBAaWYgZ2V0dGV4dApAQCAtMTI1NDksNiArMTMzMDQsMzMgQEAKIAogQGVuZGlmIGdudXNlcnYKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtZ251c2VydiBpbnN0YWxsLWh0bWwtZ251c2VydgorbWF5YmUtaW5zdGFsbC1odG1sLWdudXNlcnY6CitAaWYgZ251c2VydgorbWF5YmUtaW5zdGFsbC1odG1sLWdudXNlcnY6IGluc3RhbGwtaHRtbC1nbnVzZXJ2CisKK2luc3RhbGwtaHRtbC1nbnVzZXJ2OiBcCisgICAgY29uZmlndXJlLWdudXNlcnYgXAorICAgIGh0bWwtZ251c2VydiAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9nbnVzZXJ2L01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBnbnVzZXJ2IiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvZ251c2VydiAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBnbnVzZXJ2CisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLWdudXNlcnYgaW5zdGFsbGNoZWNrLWdudXNlcnYKIG1heWJlLWluc3RhbGxjaGVjay1nbnVzZXJ2OgogQGlmIGdudXNlcnYKQEAgLTEyODg2LDYgKzEzNjY4LDMzIEBACiAKIEBlbmRpZiBncHJvZgogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1ncHJvZiBpbnN0YWxsLWh0bWwtZ3Byb2YKK21heWJlLWluc3RhbGwtaHRtbC1ncHJvZjoKK0BpZiBncHJvZgorbWF5YmUtaW5zdGFsbC1odG1sLWdwcm9mOiBpbnN0YWxsLWh0bWwtZ3Byb2YKKworaW5zdGFsbC1odG1sLWdwcm9mOiBcCisgICAgY29uZmlndXJlLWdwcm9mIFwKKyAgICBodG1sLWdwcm9mIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2dwcm9mL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBncHJvZiIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2dwcm9mICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGdwcm9mCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLWdwcm9mIGluc3RhbGxjaGVjay1ncHJvZgogbWF5YmUtaW5zdGFsbGNoZWNrLWdwcm9mOgogQGlmIGdwcm9mCkBAIC0xMzIyMyw2ICsxNDAzMiwzMyBAQAogCiBAZW5kaWYgZ3ppcAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1nemlwIGluc3RhbGwtaHRtbC1nemlwCittYXliZS1pbnN0YWxsLWh0bWwtZ3ppcDoKK0BpZiBnemlwCittYXliZS1pbnN0YWxsLWh0bWwtZ3ppcDogaW5zdGFsbC1odG1sLWd6aXAKKworaW5zdGFsbC1odG1sLWd6aXA6IFwKKyAgICBjb25maWd1cmUtZ3ppcCBcCisgICAgaHRtbC1nemlwIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2d6aXAvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGd6aXAiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9nemlwICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGd6aXAKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stZ3ppcCBpbnN0YWxsY2hlY2stZ3ppcAogbWF5YmUtaW5zdGFsbGNoZWNrLWd6aXA6CiBAaWYgZ3ppcApAQCAtMTM1NjAsNiArMTQzOTYsMzMgQEAKIAogQGVuZGlmIGhlbGxvCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWhlbGxvIGluc3RhbGwtaHRtbC1oZWxsbworbWF5YmUtaW5zdGFsbC1odG1sLWhlbGxvOgorQGlmIGhlbGxvCittYXliZS1pbnN0YWxsLWh0bWwtaGVsbG86IGluc3RhbGwtaHRtbC1oZWxsbworCitpbnN0YWxsLWh0bWwtaGVsbG86IFwKKyAgICBjb25maWd1cmUtaGVsbG8gXAorICAgIGh0bWwtaGVsbG8gCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vaGVsbG8vTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGhlbGxvIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvaGVsbG8gJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgaGVsbG8KKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2staGVsbG8gaW5zdGFsbGNoZWNrLWhlbGxvCiBtYXliZS1pbnN0YWxsY2hlY2staGVsbG86CiBAaWYgaGVsbG8KQEAgLTEzODk3LDYgKzE0NzYwLDMzIEBACiAKIEBlbmRpZiBpbmRlbnQKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtaW5kZW50IGluc3RhbGwtaHRtbC1pbmRlbnQKK21heWJlLWluc3RhbGwtaHRtbC1pbmRlbnQ6CitAaWYgaW5kZW50CittYXliZS1pbnN0YWxsLWh0bWwtaW5kZW50OiBpbnN0YWxsLWh0bWwtaW5kZW50CisKK2luc3RhbGwtaHRtbC1pbmRlbnQ6IFwKKyAgICBjb25maWd1cmUtaW5kZW50IFwKKyAgICBodG1sLWluZGVudCAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9pbmRlbnQvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGluZGVudCIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2luZGVudCAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBpbmRlbnQKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2staW5kZW50IGluc3RhbGxjaGVjay1pbmRlbnQKIG1heWJlLWluc3RhbGxjaGVjay1pbmRlbnQ6CiBAaWYgaW5kZW50CkBAIC0xNDU4Niw2ICsxNTQ3NiwzMiBAQAogCiBAZW5kaWYgaW50bAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1pbnRsIGluc3RhbGwtaHRtbC1pbnRsCittYXliZS1pbnN0YWxsLWh0bWwtaW50bDoKK0BpZiBpbnRsCittYXliZS1pbnN0YWxsLWh0bWwtaW50bDogaW5zdGFsbC1odG1sLWludGwKKworaW5zdGFsbC1odG1sLWludGw6IFwKKyAgICBjb25maWd1cmUtaW50bCBcCisgICAgaHRtbC1pbnRsIAorCUBbIC1mIC4vaW50bC9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gaW50bCIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2ludGwgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgaW50bAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1pbnRsIGluc3RhbGxjaGVjay1pbnRsCiBtYXliZS1pbnN0YWxsY2hlY2staW50bDoKIEBpZiBpbnRsCkBAIC0xNDkxOCw2ICsxNTgzNCwzMyBAQAogCiBAZW5kaWYgdGNsCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRjbCBpbnN0YWxsLWh0bWwtdGNsCittYXliZS1pbnN0YWxsLWh0bWwtdGNsOgorQGlmIHRjbAorbWF5YmUtaW5zdGFsbC1odG1sLXRjbDogaW5zdGFsbC1odG1sLXRjbAorCitpbnN0YWxsLWh0bWwtdGNsOiBcCisgICAgY29uZmlndXJlLXRjbCBcCisgICAgaHRtbC10Y2wgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vdGNsL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiB0Y2wiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS90Y2wgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgdGNsCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXRjbCBpbnN0YWxsY2hlY2stdGNsCiBtYXliZS1pbnN0YWxsY2hlY2stdGNsOgogQGlmIHRjbApAQCAtMTUyNDAsNiArMTYxODMsMzMgQEAKIAogQGVuZGlmIGl0Y2wKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtaXRjbCBpbnN0YWxsLWh0bWwtaXRjbAorbWF5YmUtaW5zdGFsbC1odG1sLWl0Y2w6CitAaWYgaXRjbAorbWF5YmUtaW5zdGFsbC1odG1sLWl0Y2w6IGluc3RhbGwtaHRtbC1pdGNsCisKK2luc3RhbGwtaHRtbC1pdGNsOiBcCisgICAgY29uZmlndXJlLWl0Y2wgXAorICAgIGh0bWwtaXRjbCAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9pdGNsL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBpdGNsIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvaXRjbCAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBpdGNsCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLWl0Y2wgaW5zdGFsbGNoZWNrLWl0Y2wKIG1heWJlLWluc3RhbGxjaGVjay1pdGNsOgogQGlmIGl0Y2wKQEAgLTE1OTI5LDYgKzE2ODk5LDMyIEBACiAKIEBlbmRpZiBsZAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1sZCBpbnN0YWxsLWh0bWwtbGQKK21heWJlLWluc3RhbGwtaHRtbC1sZDoKK0BpZiBsZAorbWF5YmUtaW5zdGFsbC1odG1sLWxkOiBpbnN0YWxsLWh0bWwtbGQKKworaW5zdGFsbC1odG1sLWxkOiBcCisgICAgY29uZmlndXJlLWxkIFwKKyAgICBodG1sLWxkIAorCUBbIC1mIC4vbGQvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGxkIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvbGQgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgbGQKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stbGQgaW5zdGFsbGNoZWNrLWxkCiBtYXliZS1pbnN0YWxsY2hlY2stbGQ6CiBAaWYgbGQKQEAgLTE2NjEzLDYgKzE3NjA5LDMyIEBACiAKIEBlbmRpZiBsaWJjcHAKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtbGliY3BwIGluc3RhbGwtaHRtbC1saWJjcHAKK21heWJlLWluc3RhbGwtaHRtbC1saWJjcHA6CitAaWYgbGliY3BwCittYXliZS1pbnN0YWxsLWh0bWwtbGliY3BwOiBpbnN0YWxsLWh0bWwtbGliY3BwCisKK2luc3RhbGwtaHRtbC1saWJjcHA6IFwKKyAgICBjb25maWd1cmUtbGliY3BwIFwKKyAgICBodG1sLWxpYmNwcCAKKwlAWyAtZiAuL2xpYmNwcC9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gbGliY3BwIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvbGliY3BwICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGxpYmNwcAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1saWJjcHAgaW5zdGFsbGNoZWNrLWxpYmNwcAogbWF5YmUtaW5zdGFsbGNoZWNrLWxpYmNwcDoKIEBpZiBsaWJjcHAKQEAgLTE3Mjk3LDYgKzE4MzE5LDMyIEBACiAKIEBlbmRpZiBsaWJkZWNudW1iZXIKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtbGliZGVjbnVtYmVyIGluc3RhbGwtaHRtbC1saWJkZWNudW1iZXIKK21heWJlLWluc3RhbGwtaHRtbC1saWJkZWNudW1iZXI6CitAaWYgbGliZGVjbnVtYmVyCittYXliZS1pbnN0YWxsLWh0bWwtbGliZGVjbnVtYmVyOiBpbnN0YWxsLWh0bWwtbGliZGVjbnVtYmVyCisKK2luc3RhbGwtaHRtbC1saWJkZWNudW1iZXI6IFwKKyAgICBjb25maWd1cmUtbGliZGVjbnVtYmVyIFwKKyAgICBodG1sLWxpYmRlY251bWJlciAKKwlAWyAtZiAuL2xpYmRlY251bWJlci9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gbGliZGVjbnVtYmVyIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvbGliZGVjbnVtYmVyICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGxpYmRlY251bWJlcgorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1saWJkZWNudW1iZXIgaW5zdGFsbGNoZWNrLWxpYmRlY251bWJlcgogbWF5YmUtaW5zdGFsbGNoZWNrLWxpYmRlY251bWJlcjoKIEBpZiBsaWJkZWNudW1iZXIKQEAgLTE3NjI5LDYgKzE4Njc3LDMzIEBACiAKIEBlbmRpZiBsaWJndWkKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtbGliZ3VpIGluc3RhbGwtaHRtbC1saWJndWkKK21heWJlLWluc3RhbGwtaHRtbC1saWJndWk6CitAaWYgbGliZ3VpCittYXliZS1pbnN0YWxsLWh0bWwtbGliZ3VpOiBpbnN0YWxsLWh0bWwtbGliZ3VpCisKK2luc3RhbGwtaHRtbC1saWJndWk6IFwKKyAgICBjb25maWd1cmUtbGliZ3VpIFwKKyAgICBodG1sLWxpYmd1aSAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9saWJndWkvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGxpYmd1aSIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2xpYmd1aSAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBsaWJndWkKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stbGliZ3VpIGluc3RhbGxjaGVjay1saWJndWkKIG1heWJlLWluc3RhbGxjaGVjay1saWJndWk6CiBAaWYgbGliZ3VpCkBAIC0xODMxOCw2ICsxOTM5MywzMiBAQAogCiBAZW5kaWYgbGliaWJlcnR5CiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWxpYmliZXJ0eSBpbnN0YWxsLWh0bWwtbGliaWJlcnR5CittYXliZS1pbnN0YWxsLWh0bWwtbGliaWJlcnR5OgorQGlmIGxpYmliZXJ0eQorbWF5YmUtaW5zdGFsbC1odG1sLWxpYmliZXJ0eTogaW5zdGFsbC1odG1sLWxpYmliZXJ0eQorCitpbnN0YWxsLWh0bWwtbGliaWJlcnR5OiBcCisgICAgY29uZmlndXJlLWxpYmliZXJ0eSBcCisgICAgaHRtbC1saWJpYmVydHkgCisJQFsgLWYgLi9saWJpYmVydHkvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGxpYmliZXJ0eSIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2xpYmliZXJ0eSAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBsaWJpYmVydHkKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stbGliaWJlcnR5IGluc3RhbGxjaGVjay1saWJpYmVydHkKIG1heWJlLWluc3RhbGxjaGVjay1saWJpYmVydHk6CiBAaWYgbGliaWJlcnR5CkBAIC0xODY1MCw2ICsxOTc1MSwzMyBAQAogCiBAZW5kaWYgbGlidG9vbAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1saWJ0b29sIGluc3RhbGwtaHRtbC1saWJ0b29sCittYXliZS1pbnN0YWxsLWh0bWwtbGlidG9vbDoKK0BpZiBsaWJ0b29sCittYXliZS1pbnN0YWxsLWh0bWwtbGlidG9vbDogaW5zdGFsbC1odG1sLWxpYnRvb2wKKworaW5zdGFsbC1odG1sLWxpYnRvb2w6IFwKKyAgICBjb25maWd1cmUtbGlidG9vbCBcCisgICAgaHRtbC1saWJ0b29sIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2xpYnRvb2wvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGxpYnRvb2wiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9saWJ0b29sICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGxpYnRvb2wKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stbGlidG9vbCBpbnN0YWxsY2hlY2stbGlidG9vbAogbWF5YmUtaW5zdGFsbGNoZWNrLWxpYnRvb2w6CiBAaWYgbGlidG9vbApAQCAtMTg5ODcsNiArMjAxMTUsMzMgQEAKIAogQGVuZGlmIG00CiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLW00IGluc3RhbGwtaHRtbC1tNAorbWF5YmUtaW5zdGFsbC1odG1sLW00OgorQGlmIG00CittYXliZS1pbnN0YWxsLWh0bWwtbTQ6IGluc3RhbGwtaHRtbC1tNAorCitpbnN0YWxsLWh0bWwtbTQ6IFwKKyAgICBjb25maWd1cmUtbTQgXAorICAgIGh0bWwtbTQgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vbTQvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIG00IiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvbTQgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgbTQKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stbTQgaW5zdGFsbGNoZWNrLW00CiBtYXliZS1pbnN0YWxsY2hlY2stbTQ6CiBAaWYgbTQKQEAgLTE5MzI0LDYgKzIwNDc5LDMzIEBACiAKIEBlbmRpZiBtYWtlCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLW1ha2UgaW5zdGFsbC1odG1sLW1ha2UKK21heWJlLWluc3RhbGwtaHRtbC1tYWtlOgorQGlmIG1ha2UKK21heWJlLWluc3RhbGwtaHRtbC1tYWtlOiBpbnN0YWxsLWh0bWwtbWFrZQorCitpbnN0YWxsLWh0bWwtbWFrZTogXAorICAgIGNvbmZpZ3VyZS1tYWtlIFwKKyAgICBodG1sLW1ha2UgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vbWFrZS9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gbWFrZSIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL21ha2UgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgbWFrZQorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1tYWtlIGluc3RhbGxjaGVjay1tYWtlCiBtYXliZS1pbnN0YWxsY2hlY2stbWFrZToKIEBpZiBtYWtlCkBAIC0xOTY1NSw2ICsyMDgzNywzMyBAQAogCiBAZW5kaWYgbW1hbGxvYwogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1tbWFsbG9jIGluc3RhbGwtaHRtbC1tbWFsbG9jCittYXliZS1pbnN0YWxsLWh0bWwtbW1hbGxvYzoKK0BpZiBtbWFsbG9jCittYXliZS1pbnN0YWxsLWh0bWwtbW1hbGxvYzogaW5zdGFsbC1odG1sLW1tYWxsb2MKKworaW5zdGFsbC1odG1sLW1tYWxsb2M6IFwKKyAgICBjb25maWd1cmUtbW1hbGxvYyBcCisgICAgaHRtbC1tbWFsbG9jIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL21tYWxsb2MvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIG1tYWxsb2MiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9tbWFsbG9jICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIG1tYWxsb2MKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stbW1hbGxvYyBpbnN0YWxsY2hlY2stbW1hbGxvYwogbWF5YmUtaW5zdGFsbGNoZWNrLW1tYWxsb2M6CiBAaWYgbW1hbGxvYwpAQCAtMTk5OTIsNiArMjEyMDEsMzMgQEAKIAogQGVuZGlmIHBhdGNoCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXBhdGNoIGluc3RhbGwtaHRtbC1wYXRjaAorbWF5YmUtaW5zdGFsbC1odG1sLXBhdGNoOgorQGlmIHBhdGNoCittYXliZS1pbnN0YWxsLWh0bWwtcGF0Y2g6IGluc3RhbGwtaHRtbC1wYXRjaAorCitpbnN0YWxsLWh0bWwtcGF0Y2g6IFwKKyAgICBjb25maWd1cmUtcGF0Y2ggXAorICAgIGh0bWwtcGF0Y2ggCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vcGF0Y2gvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIHBhdGNoIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvcGF0Y2ggJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgcGF0Y2gKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stcGF0Y2ggaW5zdGFsbGNoZWNrLXBhdGNoCiBtYXliZS1pbnN0YWxsY2hlY2stcGF0Y2g6CiBAaWYgcGF0Y2gKQEAgLTIwMzI5LDYgKzIxNTY1LDMzIEBACiAKIEBlbmRpZiBwZXJsCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXBlcmwgaW5zdGFsbC1odG1sLXBlcmwKK21heWJlLWluc3RhbGwtaHRtbC1wZXJsOgorQGlmIHBlcmwKK21heWJlLWluc3RhbGwtaHRtbC1wZXJsOiBpbnN0YWxsLWh0bWwtcGVybAorCitpbnN0YWxsLWh0bWwtcGVybDogXAorICAgIGNvbmZpZ3VyZS1wZXJsIFwKKyAgICBodG1sLXBlcmwgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vcGVybC9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gcGVybCIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL3BlcmwgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgcGVybAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1wZXJsIGluc3RhbGxjaGVjay1wZXJsCiBtYXliZS1pbnN0YWxsY2hlY2stcGVybDoKIEBpZiBwZXJsCkBAIC0yMDY2Niw2ICsyMTkyOSwzMyBAQAogCiBAZW5kaWYgcHJtcwogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1wcm1zIGluc3RhbGwtaHRtbC1wcm1zCittYXliZS1pbnN0YWxsLWh0bWwtcHJtczoKK0BpZiBwcm1zCittYXliZS1pbnN0YWxsLWh0bWwtcHJtczogaW5zdGFsbC1odG1sLXBybXMKKworaW5zdGFsbC1odG1sLXBybXM6IFwKKyAgICBjb25maWd1cmUtcHJtcyBcCisgICAgaHRtbC1wcm1zIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL3BybXMvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIHBybXMiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9wcm1zICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHBybXMKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stcHJtcyBpbnN0YWxsY2hlY2stcHJtcwogbWF5YmUtaW5zdGFsbGNoZWNrLXBybXM6CiBAaWYgcHJtcwpAQCAtMjEwMDMsNiArMjIyOTMsMzMgQEAKIAogQGVuZGlmIHJjcwogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1yY3MgaW5zdGFsbC1odG1sLXJjcworbWF5YmUtaW5zdGFsbC1odG1sLXJjczoKK0BpZiByY3MKK21heWJlLWluc3RhbGwtaHRtbC1yY3M6IGluc3RhbGwtaHRtbC1yY3MKKworaW5zdGFsbC1odG1sLXJjczogXAorICAgIGNvbmZpZ3VyZS1yY3MgXAorICAgIGh0bWwtcmNzIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL3Jjcy9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gcmNzIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvcmNzICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHJjcworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1yY3MgaW5zdGFsbGNoZWNrLXJjcwogbWF5YmUtaW5zdGFsbGNoZWNrLXJjczoKIEBpZiByY3MKQEAgLTIxMzQwLDYgKzIyNjU3LDMzIEBACiAKIEBlbmRpZiByZWFkbGluZQogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1yZWFkbGluZSBpbnN0YWxsLWh0bWwtcmVhZGxpbmUKK21heWJlLWluc3RhbGwtaHRtbC1yZWFkbGluZToKK0BpZiByZWFkbGluZQorbWF5YmUtaW5zdGFsbC1odG1sLXJlYWRsaW5lOiBpbnN0YWxsLWh0bWwtcmVhZGxpbmUKKworaW5zdGFsbC1odG1sLXJlYWRsaW5lOiBcCisgICAgY29uZmlndXJlLXJlYWRsaW5lIFwKKyAgICBodG1sLXJlYWRsaW5lIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL3JlYWRsaW5lL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiByZWFkbGluZSIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL3JlYWRsaW5lICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHJlYWRsaW5lCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXJlYWRsaW5lIGluc3RhbGxjaGVjay1yZWFkbGluZQogbWF5YmUtaW5zdGFsbGNoZWNrLXJlYWRsaW5lOgogQGlmIHJlYWRsaW5lCkBAIC0yMTY2NSw2ICsyMzAwOSwzMyBAQAogCiBAZW5kaWYgcmVsZWFzZQogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1yZWxlYXNlIGluc3RhbGwtaHRtbC1yZWxlYXNlCittYXliZS1pbnN0YWxsLWh0bWwtcmVsZWFzZToKK0BpZiByZWxlYXNlCittYXliZS1pbnN0YWxsLWh0bWwtcmVsZWFzZTogaW5zdGFsbC1odG1sLXJlbGVhc2UKKworaW5zdGFsbC1odG1sLXJlbGVhc2U6IFwKKyAgICBjb25maWd1cmUtcmVsZWFzZSBcCisgICAgaHRtbC1yZWxlYXNlIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL3JlbGVhc2UvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIHJlbGVhc2UiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9yZWxlYXNlICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHJlbGVhc2UKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stcmVsZWFzZSBpbnN0YWxsY2hlY2stcmVsZWFzZQogbWF5YmUtaW5zdGFsbGNoZWNrLXJlbGVhc2U6CiBAaWYgcmVsZWFzZQpAQCAtMjIwMDIsNiArMjMzNzMsMzMgQEAKIAogQGVuZGlmIHJlY29kZQogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1yZWNvZGUgaW5zdGFsbC1odG1sLXJlY29kZQorbWF5YmUtaW5zdGFsbC1odG1sLXJlY29kZToKK0BpZiByZWNvZGUKK21heWJlLWluc3RhbGwtaHRtbC1yZWNvZGU6IGluc3RhbGwtaHRtbC1yZWNvZGUKKworaW5zdGFsbC1odG1sLXJlY29kZTogXAorICAgIGNvbmZpZ3VyZS1yZWNvZGUgXAorICAgIGh0bWwtcmVjb2RlIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL3JlY29kZS9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gcmVjb2RlIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvcmVjb2RlICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHJlY29kZQorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1yZWNvZGUgaW5zdGFsbGNoZWNrLXJlY29kZQogbWF5YmUtaW5zdGFsbGNoZWNrLXJlY29kZToKIEBpZiByZWNvZGUKQEAgLTIyMzM5LDYgKzIzNzM3LDMzIEBACiAKIEBlbmRpZiBzZWQKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtc2VkIGluc3RhbGwtaHRtbC1zZWQKK21heWJlLWluc3RhbGwtaHRtbC1zZWQ6CitAaWYgc2VkCittYXliZS1pbnN0YWxsLWh0bWwtc2VkOiBpbnN0YWxsLWh0bWwtc2VkCisKK2luc3RhbGwtaHRtbC1zZWQ6IFwKKyAgICBjb25maWd1cmUtc2VkIFwKKyAgICBodG1sLXNlZCAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9zZWQvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIHNlZCIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL3NlZCAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBzZWQKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stc2VkIGluc3RhbGxjaGVjay1zZWQKIG1heWJlLWluc3RhbGxjaGVjay1zZWQ6CiBAaWYgc2VkCkBAIC0yMjY3Niw2ICsyNDEwMSwzMyBAQAogCiBAZW5kaWYgc2VuZC1wcgogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1zZW5kLXByIGluc3RhbGwtaHRtbC1zZW5kLXByCittYXliZS1pbnN0YWxsLWh0bWwtc2VuZC1wcjoKK0BpZiBzZW5kLXByCittYXliZS1pbnN0YWxsLWh0bWwtc2VuZC1wcjogaW5zdGFsbC1odG1sLXNlbmQtcHIKKworaW5zdGFsbC1odG1sLXNlbmQtcHI6IFwKKyAgICBjb25maWd1cmUtc2VuZC1wciBcCisgICAgaHRtbC1zZW5kLXByIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL3NlbmQtcHIvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIHNlbmQtcHIiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9zZW5kLXByICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHNlbmQtcHIKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stc2VuZC1wciBpbnN0YWxsY2hlY2stc2VuZC1wcgogbWF5YmUtaW5zdGFsbGNoZWNrLXNlbmQtcHI6CiBAaWYgc2VuZC1wcgpAQCAtMjMwMTMsNiArMjQ0NjUsMzMgQEAKIAogQGVuZGlmIHNoZWxsdXRpbHMKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtc2hlbGx1dGlscyBpbnN0YWxsLWh0bWwtc2hlbGx1dGlscworbWF5YmUtaW5zdGFsbC1odG1sLXNoZWxsdXRpbHM6CitAaWYgc2hlbGx1dGlscworbWF5YmUtaW5zdGFsbC1odG1sLXNoZWxsdXRpbHM6IGluc3RhbGwtaHRtbC1zaGVsbHV0aWxzCisKK2luc3RhbGwtaHRtbC1zaGVsbHV0aWxzOiBcCisgICAgY29uZmlndXJlLXNoZWxsdXRpbHMgXAorICAgIGh0bWwtc2hlbGx1dGlscyAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9zaGVsbHV0aWxzL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBzaGVsbHV0aWxzIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvc2hlbGx1dGlscyAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBzaGVsbHV0aWxzCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXNoZWxsdXRpbHMgaW5zdGFsbGNoZWNrLXNoZWxsdXRpbHMKIG1heWJlLWluc3RhbGxjaGVjay1zaGVsbHV0aWxzOgogQGlmIHNoZWxsdXRpbHMKQEAgLTIzMzUwLDYgKzI0ODI5LDMzIEBACiAKIEBlbmRpZiBzaWQKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtc2lkIGluc3RhbGwtaHRtbC1zaWQKK21heWJlLWluc3RhbGwtaHRtbC1zaWQ6CitAaWYgc2lkCittYXliZS1pbnN0YWxsLWh0bWwtc2lkOiBpbnN0YWxsLWh0bWwtc2lkCisKK2luc3RhbGwtaHRtbC1zaWQ6IFwKKyAgICBjb25maWd1cmUtc2lkIFwKKyAgICBodG1sLXNpZCAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9zaWQvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpIDsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIHNpZCIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL3NpZCAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiBzaWQKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stc2lkIGluc3RhbGxjaGVjay1zaWQKIG1heWJlLWluc3RhbGxjaGVjay1zaWQ6CiBAaWYgc2lkCkBAIC0yMzY4Nyw2ICsyNTE5MywzMyBAQAogCiBAZW5kaWYgc2ltCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXNpbSBpbnN0YWxsLWh0bWwtc2ltCittYXliZS1pbnN0YWxsLWh0bWwtc2ltOgorQGlmIHNpbQorbWF5YmUtaW5zdGFsbC1odG1sLXNpbTogaW5zdGFsbC1odG1sLXNpbQorCitpbnN0YWxsLWh0bWwtc2ltOiBcCisgICAgY29uZmlndXJlLXNpbSBcCisgICAgaHRtbC1zaW0gCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vc2ltL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiBzaW0iIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS9zaW0gJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgc2ltCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXNpbSBpbnN0YWxsY2hlY2stc2ltCiBtYXliZS1pbnN0YWxsY2hlY2stc2ltOgogQGlmIHNpbQpAQCAtMjQwMjQsNiArMjU1NTcsMzMgQEAKIAogQGVuZGlmIHRhcgogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC10YXIgaW5zdGFsbC1odG1sLXRhcgorbWF5YmUtaW5zdGFsbC1odG1sLXRhcjoKK0BpZiB0YXIKK21heWJlLWluc3RhbGwtaHRtbC10YXI6IGluc3RhbGwtaHRtbC10YXIKKworaW5zdGFsbC1odG1sLXRhcjogXAorICAgIGNvbmZpZ3VyZS10YXIgXAorICAgIGh0bWwtdGFyIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL3Rhci9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gdGFyIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvdGFyICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHRhcgorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXIgaW5zdGFsbGNoZWNrLXRhcgogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcjoKIEBpZiB0YXIKQEAgLTI0MzU1LDYgKzI1OTE1LDMzIEBACiAKIEBlbmRpZiB0ZXhpbmZvCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRleGluZm8gaW5zdGFsbC1odG1sLXRleGluZm8KK21heWJlLWluc3RhbGwtaHRtbC10ZXhpbmZvOgorQGlmIHRleGluZm8KK21heWJlLWluc3RhbGwtaHRtbC10ZXhpbmZvOiBpbnN0YWxsLWh0bWwtdGV4aW5mbworCitpbnN0YWxsLWh0bWwtdGV4aW5mbzogXAorICAgIGNvbmZpZ3VyZS10ZXhpbmZvIFwKKyAgICBodG1sLXRleGluZm8gCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vdGV4aW5mby9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gdGV4aW5mbyIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL3RleGluZm8gJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgdGV4aW5mbworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10ZXhpbmZvIGluc3RhbGxjaGVjay10ZXhpbmZvCiBtYXliZS1pbnN0YWxsY2hlY2stdGV4aW5mbzoKIEBpZiB0ZXhpbmZvCkBAIC0yNDY5Miw2ICsyNjI3OSwzMyBAQAogCiBAZW5kaWYgdGV4dHV0aWxzCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRleHR1dGlscyBpbnN0YWxsLWh0bWwtdGV4dHV0aWxzCittYXliZS1pbnN0YWxsLWh0bWwtdGV4dHV0aWxzOgorQGlmIHRleHR1dGlscworbWF5YmUtaW5zdGFsbC1odG1sLXRleHR1dGlsczogaW5zdGFsbC1odG1sLXRleHR1dGlscworCitpbnN0YWxsLWh0bWwtdGV4dHV0aWxzOiBcCisgICAgY29uZmlndXJlLXRleHR1dGlscyBcCisgICAgaHRtbC10ZXh0dXRpbHMgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vdGV4dHV0aWxzL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiB0ZXh0dXRpbHMiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS90ZXh0dXRpbHMgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgdGV4dHV0aWxzCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXRleHR1dGlscyBpbnN0YWxsY2hlY2stdGV4dHV0aWxzCiBtYXliZS1pbnN0YWxsY2hlY2stdGV4dHV0aWxzOgogQGlmIHRleHR1dGlscwpAQCAtMjUwMjksNiArMjY2NDMsMzMgQEAKIAogQGVuZGlmIHRpbWUKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtdGltZSBpbnN0YWxsLWh0bWwtdGltZQorbWF5YmUtaW5zdGFsbC1odG1sLXRpbWU6CitAaWYgdGltZQorbWF5YmUtaW5zdGFsbC1odG1sLXRpbWU6IGluc3RhbGwtaHRtbC10aW1lCisKK2luc3RhbGwtaHRtbC10aW1lOiBcCisgICAgY29uZmlndXJlLXRpbWUgXAorICAgIGh0bWwtdGltZSAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi90aW1lL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiB0aW1lIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvdGltZSAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB0aW1lCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXRpbWUgaW5zdGFsbGNoZWNrLXRpbWUKIG1heWJlLWluc3RhbGxjaGVjay10aW1lOgogQGlmIHRpbWUKQEAgLTI1MzY2LDYgKzI3MDA3LDMzIEBACiAKIEBlbmRpZiB1dWRlY29kZQogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC11dWRlY29kZSBpbnN0YWxsLWh0bWwtdXVkZWNvZGUKK21heWJlLWluc3RhbGwtaHRtbC11dWRlY29kZToKK0BpZiB1dWRlY29kZQorbWF5YmUtaW5zdGFsbC1odG1sLXV1ZGVjb2RlOiBpbnN0YWxsLWh0bWwtdXVkZWNvZGUKKworaW5zdGFsbC1odG1sLXV1ZGVjb2RlOiBcCisgICAgY29uZmlndXJlLXV1ZGVjb2RlIFwKKyAgICBodG1sLXV1ZGVjb2RlIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL3V1ZGVjb2RlL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiB1dWRlY29kZSIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL3V1ZGVjb2RlICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHV1ZGVjb2RlCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXV1ZGVjb2RlIGluc3RhbGxjaGVjay11dWRlY29kZQogbWF5YmUtaW5zdGFsbGNoZWNrLXV1ZGVjb2RlOgogQGlmIHV1ZGVjb2RlCkBAIC0yNTcwMyw2ICsyNzM3MSwzMyBAQAogCiBAZW5kaWYgd2RpZmYKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtd2RpZmYgaW5zdGFsbC1odG1sLXdkaWZmCittYXliZS1pbnN0YWxsLWh0bWwtd2RpZmY6CitAaWYgd2RpZmYKK21heWJlLWluc3RhbGwtaHRtbC13ZGlmZjogaW5zdGFsbC1odG1sLXdkaWZmCisKK2luc3RhbGwtaHRtbC13ZGlmZjogXAorICAgIGNvbmZpZ3VyZS13ZGlmZiBcCisgICAgaHRtbC13ZGlmZiAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi93ZGlmZi9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gd2RpZmYiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS93ZGlmZiAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB3ZGlmZgorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay13ZGlmZiBpbnN0YWxsY2hlY2std2RpZmYKIG1heWJlLWluc3RhbGxjaGVjay13ZGlmZjoKIEBpZiB3ZGlmZgpAQCAtMjYwNDMsNiArMjc3MzgsMzMgQEAKIAogQGVuZGlmIHppcAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC16aXAgaW5zdGFsbC1odG1sLXppcAorbWF5YmUtaW5zdGFsbC1odG1sLXppcDoKK0BpZiB6aXAKK21heWJlLWluc3RhbGwtaHRtbC16aXA6IGluc3RhbGwtaHRtbC16aXAKKworaW5zdGFsbC1odG1sLXppcDogXAorICAgIGNvbmZpZ3VyZS16aXAgXAorICAgIGh0bWwtemlwIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL3ppcC9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gemlwIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvemlwICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHppcAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay16aXAgaW5zdGFsbGNoZWNrLXppcAogbWF5YmUtaW5zdGFsbGNoZWNrLXppcDoKIEBpZiB6aXAKQEAgLTI2NzIwLDYgKzI4NDQyLDMyIEBACiAKIEBlbmRpZiB6bGliCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXpsaWIgaW5zdGFsbC1odG1sLXpsaWIKK21heWJlLWluc3RhbGwtaHRtbC16bGliOgorQGlmIHpsaWIKK21heWJlLWluc3RhbGwtaHRtbC16bGliOiBpbnN0YWxsLWh0bWwtemxpYgorCitpbnN0YWxsLWh0bWwtemxpYjogXAorICAgIGNvbmZpZ3VyZS16bGliIFwKKyAgICBodG1sLXpsaWIgCisJQFsgLWYgLi96bGliL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSA7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiB6bGliIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvemxpYiAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB6bGliCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXpsaWIgaW5zdGFsbGNoZWNrLXpsaWIKIG1heWJlLWluc3RhbGxjaGVjay16bGliOgogQGlmIHpsaWIKQEAgLTI3MDUyLDYgKzI4ODAwLDMzIEBACiAKIEBlbmRpZiBnZGIKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtZ2RiIGluc3RhbGwtaHRtbC1nZGIKK21heWJlLWluc3RhbGwtaHRtbC1nZGI6CitAaWYgZ2RiCittYXliZS1pbnN0YWxsLWh0bWwtZ2RiOiBpbnN0YWxsLWh0bWwtZ2RiCisKK2luc3RhbGwtaHRtbC1nZGI6IFwKKyAgICBjb25maWd1cmUtZ2RiIFwKKyAgICBodG1sLWdkYiAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9nZGIvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpICQoWDExX0ZMQUdTX1RPX1BBU1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gZ2RiIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvZ2RiICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGdkYgorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1nZGIgaW5zdGFsbGNoZWNrLWdkYgogbWF5YmUtaW5zdGFsbGNoZWNrLWdkYjoKIEBpZiBnZGIKQEAgLTI3Mzg5LDYgKzI5MTY0LDMzIEBACiAKIEBlbmRpZiBleHBlY3QKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtZXhwZWN0IGluc3RhbGwtaHRtbC1leHBlY3QKK21heWJlLWluc3RhbGwtaHRtbC1leHBlY3Q6CitAaWYgZXhwZWN0CittYXliZS1pbnN0YWxsLWh0bWwtZXhwZWN0OiBpbnN0YWxsLWh0bWwtZXhwZWN0CisKK2luc3RhbGwtaHRtbC1leHBlY3Q6IFwKKyAgICBjb25maWd1cmUtZXhwZWN0IFwKKyAgICBodG1sLWV4cGVjdCAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi9leHBlY3QvTWFrZWZpbGUgXSB8fCBleGl0IDA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChIT1NUX0VYUE9SVFMpIFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpICQoWDExX0ZMQUdTX1RPX1BBU1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gZXhwZWN0IiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvZXhwZWN0ICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGV4cGVjdAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1leHBlY3QgaW5zdGFsbGNoZWNrLWV4cGVjdAogbWF5YmUtaW5zdGFsbGNoZWNrLWV4cGVjdDoKIEBpZiBleHBlY3QKQEAgLTI3NzI2LDYgKzI5NTI4LDMzIEBACiAKIEBlbmRpZiBndWlsZQogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1ndWlsZSBpbnN0YWxsLWh0bWwtZ3VpbGUKK21heWJlLWluc3RhbGwtaHRtbC1ndWlsZToKK0BpZiBndWlsZQorbWF5YmUtaW5zdGFsbC1odG1sLWd1aWxlOiBpbnN0YWxsLWh0bWwtZ3VpbGUKKworaW5zdGFsbC1odG1sLWd1aWxlOiBcCisgICAgY29uZmlndXJlLWd1aWxlIFwKKyAgICBodG1sLWd1aWxlIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2d1aWxlL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSAkKFgxMV9GTEFHU19UT19QQVNTKTsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIGd1aWxlIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvZ3VpbGUgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgZ3VpbGUKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stZ3VpbGUgaW5zdGFsbGNoZWNrLWd1aWxlCiBtYXliZS1pbnN0YWxsY2hlY2stZ3VpbGU6CiBAaWYgZ3VpbGUKQEAgLTI4MDYzLDYgKzI5ODkyLDMzIEBACiAKIEBlbmRpZiB0awogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC10ayBpbnN0YWxsLWh0bWwtdGsKK21heWJlLWluc3RhbGwtaHRtbC10azoKK0BpZiB0aworbWF5YmUtaW5zdGFsbC1odG1sLXRrOiBpbnN0YWxsLWh0bWwtdGsKKworaW5zdGFsbC1odG1sLXRrOiBcCisgICAgY29uZmlndXJlLXRrIFwKKyAgICBodG1sLXRrIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL3RrL01ha2VmaWxlIF0gfHwgZXhpdCAwOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoSE9TVF9FWFBPUlRTKSBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKSAkKFgxMV9GTEFHU19UT19QQVNTKTsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluIHRrIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvdGsgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgdGsKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stdGsgaW5zdGFsbGNoZWNrLXRrCiBtYXliZS1pbnN0YWxsY2hlY2stdGs6CiBAaWYgdGsKQEAgLTI4Mzk0LDYgKzMwMjUwLDMzIEBACiAKIEBlbmRpZiBsaWJ0ZXJtY2FwCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLWxpYnRlcm1jYXAgaW5zdGFsbC1odG1sLWxpYnRlcm1jYXAKK21heWJlLWluc3RhbGwtaHRtbC1saWJ0ZXJtY2FwOgorQGlmIGxpYnRlcm1jYXAKK21heWJlLWluc3RhbGwtaHRtbC1saWJ0ZXJtY2FwOiBpbnN0YWxsLWh0bWwtbGlidGVybWNhcAorCitpbnN0YWxsLWh0bWwtbGlidGVybWNhcDogXAorICAgIGNvbmZpZ3VyZS1saWJ0ZXJtY2FwIFwKKyAgICBodG1sLWxpYnRlcm1jYXAgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mIC4vbGlidGVybWNhcC9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gbGlidGVybWNhcCIgOyBcCisJKGNkICQoSE9TVF9TVUJESVIpL2xpYnRlcm1jYXAgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgbGlidGVybWNhcAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1saWJ0ZXJtY2FwIGluc3RhbGxjaGVjay1saWJ0ZXJtY2FwCiBtYXliZS1pbnN0YWxsY2hlY2stbGlidGVybWNhcDoKIEBpZiBsaWJ0ZXJtY2FwCkBAIC0yODY2NSw2ICszMDU0OCwzMyBAQAogCiBAZW5kaWYgdXRpbHMKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtdXRpbHMgaW5zdGFsbC1odG1sLXV0aWxzCittYXliZS1pbnN0YWxsLWh0bWwtdXRpbHM6CitAaWYgdXRpbHMKK21heWJlLWluc3RhbGwtaHRtbC11dGlsczogaW5zdGFsbC1odG1sLXV0aWxzCisKK2luc3RhbGwtaHRtbC11dGlsczogXAorICAgIGNvbmZpZ3VyZS11dGlscyBcCisgICAgaHRtbC11dGlscyAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgLi91dGlscy9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gdXRpbHMiIDsgXAorCShjZCAkKEhPU1RfU1VCRElSKS91dGlscyAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB1dGlscworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay11dGlscyBpbnN0YWxsY2hlY2stdXRpbHMKIG1heWJlLWluc3RhbGxjaGVjay11dGlsczoKIEBpZiB1dGlscwpAQCAtMjkwMDIsNiArMzA5MTIsMzMgQEAKIAogQGVuZGlmIGduYXR0b29scwogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC1nbmF0dG9vbHMgaW5zdGFsbC1odG1sLWduYXR0b29scworbWF5YmUtaW5zdGFsbC1odG1sLWduYXR0b29sczoKK0BpZiBnbmF0dG9vbHMKK21heWJlLWluc3RhbGwtaHRtbC1nbmF0dG9vbHM6IGluc3RhbGwtaHRtbC1nbmF0dG9vbHMKKworaW5zdGFsbC1odG1sLWduYXR0b29sczogXAorICAgIGNvbmZpZ3VyZS1nbmF0dG9vbHMgXAorICAgIGh0bWwtZ25hdHRvb2xzIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAuL2duYXR0b29scy9NYWtlZmlsZSBdIHx8IGV4aXQgMDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKEhPU1RfRVhQT1JUUykgXAorCWZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUykgOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gZ25hdHRvb2xzIiA7IFwKKwkoY2QgJChIT1NUX1NVQkRJUikvZ25hdHRvb2xzICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIGduYXR0b29scworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay1nbmF0dG9vbHMgaW5zdGFsbGNoZWNrLWduYXR0b29scwogbWF5YmUtaW5zdGFsbGNoZWNrLWduYXR0b29sczoKIEBpZiBnbmF0dG9vbHMKQEAgLTI5MzYxLDYgKzMxMjk4LDMzIEBACiAKIEBlbmRpZiB0YXJnZXQtbGlic3RkYysrLXYzCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJzdGRjKystdjMgaW5zdGFsbC1odG1sLXRhcmdldC1saWJzdGRjKystdjMKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGlic3RkYysrLXYzOgorQGlmIHRhcmdldC1saWJzdGRjKystdjMKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGlic3RkYysrLXYzOiBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYnN0ZGMrKy12MworCitpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYnN0ZGMrKy12MzogXAorICAgIGNvbmZpZ3VyZS10YXJnZXQtbGlic3RkYysrLXYzIFwKKyAgICBodG1sLXRhcmdldC1saWJzdGRjKystdjMgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mICQoVEFSR0VUX1NVQkRJUikvbGlic3RkYysrLXYzL01ha2VmaWxlIF0gfHwgZXhpdCAwIDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKFJBV19DWFhfVEFSR0VUX0VYUE9SVFMpIFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gJChUQVJHRVRfU1VCRElSKS9saWJzdGRjKystdjMiIDsgXAorCWZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJKGNkICQoVEFSR0VUX1NVQkRJUikvbGlic3RkYysrLXYzICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB0YXJnZXQtbGlic3RkYysrLXYzCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC1saWJzdGRjKystdjMgaW5zdGFsbGNoZWNrLXRhcmdldC1saWJzdGRjKystdjMKIG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGlic3RkYysrLXYzOgogQGlmIHRhcmdldC1saWJzdGRjKystdjMKQEAgLTI5NzE1LDYgKzMxNjc5LDMzIEBACiAKIEBlbmRpZiB0YXJnZXQtbGlibXVkZmxhcAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGlibXVkZmxhcCBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYm11ZGZsYXAKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGlibXVkZmxhcDoKK0BpZiB0YXJnZXQtbGlibXVkZmxhcAorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJtdWRmbGFwOiBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYm11ZGZsYXAKKworaW5zdGFsbC1odG1sLXRhcmdldC1saWJtdWRmbGFwOiBcCisgICAgY29uZmlndXJlLXRhcmdldC1saWJtdWRmbGFwIFwKKyAgICBodG1sLXRhcmdldC1saWJtdWRmbGFwIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAkKFRBUkdFVF9TVUJESVIpL2xpYm11ZGZsYXAvTWFrZWZpbGUgXSB8fCBleGl0IDAgOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTk9STUFMX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvbGlibXVkZmxhcCIgOyBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9UQVJHRVRfRkxBR1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwkoY2QgJChUQVJHRVRfU1VCRElSKS9saWJtdWRmbGFwICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB0YXJnZXQtbGlibXVkZmxhcAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGlibXVkZmxhcCBpbnN0YWxsY2hlY2stdGFyZ2V0LWxpYm11ZGZsYXAKIG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGlibXVkZmxhcDoKIEBpZiB0YXJnZXQtbGlibXVkZmxhcApAQCAtMzAwNjksNiArMzIwNjAsMzMgQEAKIAogQGVuZGlmIHRhcmdldC1saWJzc3AKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYnNzcCBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYnNzcAorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJzc3A6CitAaWYgdGFyZ2V0LWxpYnNzcAorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJzc3A6IGluc3RhbGwtaHRtbC10YXJnZXQtbGlic3NwCisKK2luc3RhbGwtaHRtbC10YXJnZXQtbGlic3NwOiBcCisgICAgY29uZmlndXJlLXRhcmdldC1saWJzc3AgXAorICAgIGh0bWwtdGFyZ2V0LWxpYnNzcCAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgJChUQVJHRVRfU1VCRElSKS9saWJzc3AvTWFrZWZpbGUgXSB8fCBleGl0IDAgOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTk9STUFMX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvbGlic3NwIiA7IFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX1RBUkdFVF9GTEFHUyk7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCShjZCAkKFRBUkdFVF9TVUJESVIpL2xpYnNzcCAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgdGFyZ2V0LWxpYnNzcAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGlic3NwIGluc3RhbGxjaGVjay10YXJnZXQtbGlic3NwCiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LWxpYnNzcDoKIEBpZiB0YXJnZXQtbGlic3NwCkBAIC0zMDQyMyw2ICszMjQ0MSwzMyBAQAogCiBAZW5kaWYgdGFyZ2V0LWxpYmdjYy1tYXRoCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJnY2MtbWF0aCBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmdjYy1tYXRoCittYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmdjYy1tYXRoOgorQGlmIHRhcmdldC1saWJnY2MtbWF0aAorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJnY2MtbWF0aDogaW5zdGFsbC1odG1sLXRhcmdldC1saWJnY2MtbWF0aAorCitpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmdjYy1tYXRoOiBcCisgICAgY29uZmlndXJlLXRhcmdldC1saWJnY2MtbWF0aCBcCisgICAgaHRtbC10YXJnZXQtbGliZ2NjLW1hdGggCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mICQoVEFSR0VUX1NVQkRJUikvbGliZ2NjLW1hdGgvTWFrZWZpbGUgXSB8fCBleGl0IDAgOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTk9STUFMX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvbGliZ2NjLW1hdGgiIDsgXAorCWZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJKGNkICQoVEFSR0VUX1NVQkRJUikvbGliZ2NjLW1hdGggJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHRhcmdldC1saWJnY2MtbWF0aAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGliZ2NjLW1hdGggaW5zdGFsbGNoZWNrLXRhcmdldC1saWJnY2MtbWF0aAogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC1saWJnY2MtbWF0aDoKIEBpZiB0YXJnZXQtbGliZ2NjLW1hdGgKQEAgLTMwNzc3LDYgKzMyODIyLDMzIEBACiAKIEBlbmRpZiB0YXJnZXQtbmV3bGliCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1uZXdsaWIgaW5zdGFsbC1odG1sLXRhcmdldC1uZXdsaWIKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbmV3bGliOgorQGlmIHRhcmdldC1uZXdsaWIKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbmV3bGliOiBpbnN0YWxsLWh0bWwtdGFyZ2V0LW5ld2xpYgorCitpbnN0YWxsLWh0bWwtdGFyZ2V0LW5ld2xpYjogXAorICAgIGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliIFwKKyAgICBodG1sLXRhcmdldC1uZXdsaWIgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mICQoVEFSR0VUX1NVQkRJUikvbmV3bGliL01ha2VmaWxlIF0gfHwgZXhpdCAwIDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKE5PUk1BTF9UQVJHRVRfRVhQT1JUUykgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiAkKFRBUkdFVF9TVUJESVIpL25ld2xpYiIgOyBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9UQVJHRVRfRkxBR1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwkoY2QgJChUQVJHRVRfU1VCRElSKS9uZXdsaWIgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHRhcmdldC1uZXdsaWIKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LW5ld2xpYiBpbnN0YWxsY2hlY2stdGFyZ2V0LW5ld2xpYgogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC1uZXdsaWI6CiBAaWYgdGFyZ2V0LW5ld2xpYgpAQCAtMzExMzEsNiArMzMyMDMsMzMgQEAKIAogQGVuZGlmIHRhcmdldC1saWJnZm9ydHJhbgogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliZ2ZvcnRyYW4gaW5zdGFsbC1odG1sLXRhcmdldC1saWJnZm9ydHJhbgorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJnZm9ydHJhbjoKK0BpZiB0YXJnZXQtbGliZ2ZvcnRyYW4KK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliZ2ZvcnRyYW46IGluc3RhbGwtaHRtbC10YXJnZXQtbGliZ2ZvcnRyYW4KKworaW5zdGFsbC1odG1sLXRhcmdldC1saWJnZm9ydHJhbjogXAorICAgIGNvbmZpZ3VyZS10YXJnZXQtbGliZ2ZvcnRyYW4gXAorICAgIGh0bWwtdGFyZ2V0LWxpYmdmb3J0cmFuIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAkKFRBUkdFVF9TVUJESVIpL2xpYmdmb3J0cmFuL01ha2VmaWxlIF0gfHwgZXhpdCAwIDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKE5PUk1BTF9UQVJHRVRfRVhQT1JUUykgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiAkKFRBUkdFVF9TVUJESVIpL2xpYmdmb3J0cmFuIiA7IFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX1RBUkdFVF9GTEFHUyk7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCShjZCAkKFRBUkdFVF9TVUJESVIpL2xpYmdmb3J0cmFuICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB0YXJnZXQtbGliZ2ZvcnRyYW4KKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LWxpYmdmb3J0cmFuIGluc3RhbGxjaGVjay10YXJnZXQtbGliZ2ZvcnRyYW4KIG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGliZ2ZvcnRyYW46CiBAaWYgdGFyZ2V0LWxpYmdmb3J0cmFuCkBAIC0zMTQ4NSw2ICszMzU4NCwzMyBAQAogCiBAZW5kaWYgdGFyZ2V0LWxpYm9iamMKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYm9iamMgaW5zdGFsbC1odG1sLXRhcmdldC1saWJvYmpjCittYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYm9iamM6CitAaWYgdGFyZ2V0LWxpYm9iamMKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGlib2JqYzogaW5zdGFsbC1odG1sLXRhcmdldC1saWJvYmpjCisKK2luc3RhbGwtaHRtbC10YXJnZXQtbGlib2JqYzogXAorICAgIGNvbmZpZ3VyZS10YXJnZXQtbGlib2JqYyBcCisgICAgaHRtbC10YXJnZXQtbGlib2JqYyAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgJChUQVJHRVRfU1VCRElSKS9saWJvYmpjL01ha2VmaWxlIF0gfHwgZXhpdCAwIDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKE5PUk1BTF9UQVJHRVRfRVhQT1JUUykgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiAkKFRBUkdFVF9TVUJESVIpL2xpYm9iamMiIDsgXAorCWZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJKGNkICQoVEFSR0VUX1NVQkRJUikvbGlib2JqYyAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgdGFyZ2V0LWxpYm9iamMKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LWxpYm9iamMgaW5zdGFsbGNoZWNrLXRhcmdldC1saWJvYmpjCiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LWxpYm9iamM6CiBAaWYgdGFyZ2V0LWxpYm9iamMKQEAgLTMxODM0LDYgKzMzOTYwLDMzIEBACiAKIEBlbmRpZiB0YXJnZXQtbGlidGVybWNhcAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGlidGVybWNhcCBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYnRlcm1jYXAKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGlidGVybWNhcDoKK0BpZiB0YXJnZXQtbGlidGVybWNhcAorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJ0ZXJtY2FwOiBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYnRlcm1jYXAKKworaW5zdGFsbC1odG1sLXRhcmdldC1saWJ0ZXJtY2FwOiBcCisgICAgY29uZmlndXJlLXRhcmdldC1saWJ0ZXJtY2FwIFwKKyAgICBodG1sLXRhcmdldC1saWJ0ZXJtY2FwIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAkKFRBUkdFVF9TVUJESVIpL2xpYnRlcm1jYXAvTWFrZWZpbGUgXSB8fCBleGl0IDAgOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTk9STUFMX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvbGlidGVybWNhcCIgOyBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9UQVJHRVRfRkxBR1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwkoY2QgJChUQVJHRVRfU1VCRElSKS9saWJ0ZXJtY2FwICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB0YXJnZXQtbGlidGVybWNhcAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGlidGVybWNhcCBpbnN0YWxsY2hlY2stdGFyZ2V0LWxpYnRlcm1jYXAKIG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGlidGVybWNhcDoKIEBpZiB0YXJnZXQtbGlidGVybWNhcApAQCAtMzIxMjgsNiArMzQyODEsMzMgQEAKIAogQGVuZGlmIHRhcmdldC13aW5zdXAKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LXdpbnN1cCBpbnN0YWxsLWh0bWwtdGFyZ2V0LXdpbnN1cAorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC13aW5zdXA6CitAaWYgdGFyZ2V0LXdpbnN1cAorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC13aW5zdXA6IGluc3RhbGwtaHRtbC10YXJnZXQtd2luc3VwCisKK2luc3RhbGwtaHRtbC10YXJnZXQtd2luc3VwOiBcCisgICAgY29uZmlndXJlLXRhcmdldC13aW5zdXAgXAorICAgIGh0bWwtdGFyZ2V0LXdpbnN1cCAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgJChUQVJHRVRfU1VCRElSKS93aW5zdXAvTWFrZWZpbGUgXSB8fCBleGl0IDAgOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTk9STUFMX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvd2luc3VwIiA7IFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX1RBUkdFVF9GTEFHUyk7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCShjZCAkKFRBUkdFVF9TVUJESVIpL3dpbnN1cCAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgdGFyZ2V0LXdpbnN1cAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtd2luc3VwIGluc3RhbGxjaGVjay10YXJnZXQtd2luc3VwCiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LXdpbnN1cDoKIEBpZiB0YXJnZXQtd2luc3VwCkBAIC0zMjQ3Nyw2ICszNDY1NywzMyBAQAogCiBAZW5kaWYgdGFyZ2V0LWxpYmdsb3NzCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJnbG9zcyBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmdsb3NzCittYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmdsb3NzOgorQGlmIHRhcmdldC1saWJnbG9zcworbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJnbG9zczogaW5zdGFsbC1odG1sLXRhcmdldC1saWJnbG9zcworCitpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmdsb3NzOiBcCisgICAgY29uZmlndXJlLXRhcmdldC1saWJnbG9zcyBcCisgICAgaHRtbC10YXJnZXQtbGliZ2xvc3MgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mICQoVEFSR0VUX1NVQkRJUikvbGliZ2xvc3MvTWFrZWZpbGUgXSB8fCBleGl0IDAgOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTk9STUFMX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvbGliZ2xvc3MiIDsgXAorCWZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJKGNkICQoVEFSR0VUX1NVQkRJUikvbGliZ2xvc3MgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHRhcmdldC1saWJnbG9zcworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGliZ2xvc3MgaW5zdGFsbGNoZWNrLXRhcmdldC1saWJnbG9zcwogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC1saWJnbG9zczoKIEBpZiB0YXJnZXQtbGliZ2xvc3MKQEAgLTMyODMxLDYgKzM1MDM4LDMzIEBACiAKIEBlbmRpZiB0YXJnZXQtbGliaWJlcnR5CiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJpYmVydHkgaW5zdGFsbC1odG1sLXRhcmdldC1saWJpYmVydHkKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliaWJlcnR5OgorQGlmIHRhcmdldC1saWJpYmVydHkKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliaWJlcnR5OiBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmliZXJ0eQorCitpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmliZXJ0eTogXAorICAgIGNvbmZpZ3VyZS10YXJnZXQtbGliaWJlcnR5IFwKKyAgICBodG1sLXRhcmdldC1saWJpYmVydHkgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mICQoVEFSR0VUX1NVQkRJUikvbGliaWJlcnR5L01ha2VmaWxlIF0gfHwgZXhpdCAwIDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKE5PUk1BTF9UQVJHRVRfRVhQT1JUUykgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiAkKFRBUkdFVF9TVUJESVIpL2xpYmliZXJ0eSIgOyBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9UQVJHRVRfRkxBR1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwkoY2QgJChUQVJHRVRfU1VCRElSKS9saWJpYmVydHkgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHRhcmdldC1saWJpYmVydHkKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LWxpYmliZXJ0eSBpbnN0YWxsY2hlY2stdGFyZ2V0LWxpYmliZXJ0eQogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC1saWJpYmVydHk6CiBAaWYgdGFyZ2V0LWxpYmliZXJ0eQpAQCAtMzMxODUsNiArMzU0MTksMzMgQEAKIAogQGVuZGlmIHRhcmdldC1ncGVyZgogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtZ3BlcmYgaW5zdGFsbC1odG1sLXRhcmdldC1ncGVyZgorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1ncGVyZjoKK0BpZiB0YXJnZXQtZ3BlcmYKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtZ3BlcmY6IGluc3RhbGwtaHRtbC10YXJnZXQtZ3BlcmYKKworaW5zdGFsbC1odG1sLXRhcmdldC1ncGVyZjogXAorICAgIGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYgXAorICAgIGh0bWwtdGFyZ2V0LWdwZXJmIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAkKFRBUkdFVF9TVUJESVIpL2dwZXJmL01ha2VmaWxlIF0gfHwgZXhpdCAwIDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKE5PUk1BTF9UQVJHRVRfRVhQT1JUUykgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiAkKFRBUkdFVF9TVUJESVIpL2dwZXJmIiA7IFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX1RBUkdFVF9GTEFHUyk7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCShjZCAkKFRBUkdFVF9TVUJESVIpL2dwZXJmICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB0YXJnZXQtZ3BlcmYKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LWdwZXJmIGluc3RhbGxjaGVjay10YXJnZXQtZ3BlcmYKIG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtZ3BlcmY6CiBAaWYgdGFyZ2V0LWdwZXJmCkBAIC0zMzUyOSw2ICszNTc5MCwzMyBAQAogCiBAZW5kaWYgdGFyZ2V0LWV4YW1wbGVzCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1leGFtcGxlcyBpbnN0YWxsLWh0bWwtdGFyZ2V0LWV4YW1wbGVzCittYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWV4YW1wbGVzOgorQGlmIHRhcmdldC1leGFtcGxlcworbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1leGFtcGxlczogaW5zdGFsbC1odG1sLXRhcmdldC1leGFtcGxlcworCitpbnN0YWxsLWh0bWwtdGFyZ2V0LWV4YW1wbGVzOiBcCisgICAgY29uZmlndXJlLXRhcmdldC1leGFtcGxlcyBcCisgICAgaHRtbC10YXJnZXQtZXhhbXBsZXMgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mICQoVEFSR0VUX1NVQkRJUikvZXhhbXBsZXMvTWFrZWZpbGUgXSB8fCBleGl0IDAgOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTk9STUFMX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvZXhhbXBsZXMiIDsgXAorCWZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJKGNkICQoVEFSR0VUX1NVQkRJUikvZXhhbXBsZXMgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHRhcmdldC1leGFtcGxlcworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtZXhhbXBsZXMgaW5zdGFsbGNoZWNrLXRhcmdldC1leGFtcGxlcwogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC1leGFtcGxlczoKIEBpZiB0YXJnZXQtZXhhbXBsZXMKQEAgLTMzODgzLDYgKzM2MTcxLDMzIEBACiAKIEBlbmRpZiB0YXJnZXQtbGliZmZpCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJmZmkgaW5zdGFsbC1odG1sLXRhcmdldC1saWJmZmkKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliZmZpOgorQGlmIHRhcmdldC1saWJmZmkKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliZmZpOiBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmZmaQorCitpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmZmaTogXAorICAgIGNvbmZpZ3VyZS10YXJnZXQtbGliZmZpIFwKKyAgICBodG1sLXRhcmdldC1saWJmZmkgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mICQoVEFSR0VUX1NVQkRJUikvbGliZmZpL01ha2VmaWxlIF0gfHwgZXhpdCAwIDsgXAorCXI9YCR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7ICR7UFdEX0NPTU1BTkR9YDsgZXhwb3J0IHM7IFwKKwkkKE5PUk1BTF9UQVJHRVRfRVhQT1JUUykgXAorCWVjaG8gIkRvaW5nIGluc3RhbGwtaHRtbCBpbiAkKFRBUkdFVF9TVUJESVIpL2xpYmZmaSIgOyBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9UQVJHRVRfRkxBR1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwkoY2QgJChUQVJHRVRfU1VCRElSKS9saWJmZmkgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHRhcmdldC1saWJmZmkKKwogLlBIT05ZOiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LWxpYmZmaSBpbnN0YWxsY2hlY2stdGFyZ2V0LWxpYmZmaQogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC1saWJmZmk6CiBAaWYgdGFyZ2V0LWxpYmZmaQpAQCAtMzQyMzcsNiArMzY1NTIsMzMgQEAKIAogQGVuZGlmIHRhcmdldC1saWJqYXZhCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJqYXZhIGluc3RhbGwtaHRtbC10YXJnZXQtbGliamF2YQorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJqYXZhOgorQGlmIHRhcmdldC1saWJqYXZhCittYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmphdmE6IGluc3RhbGwtaHRtbC10YXJnZXQtbGliamF2YQorCitpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmphdmE6IFwKKyAgICBjb25maWd1cmUtdGFyZ2V0LWxpYmphdmEgXAorICAgIGh0bWwtdGFyZ2V0LWxpYmphdmEgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mICQoVEFSR0VUX1NVQkRJUikvbGliamF2YS9NYWtlZmlsZSBdIHx8IGV4aXQgMCA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChSQVdfQ1hYX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvbGliamF2YSIgOyBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9UQVJHRVRfRkxBR1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwkoY2QgJChUQVJHRVRfU1VCRElSKS9saWJqYXZhICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB0YXJnZXQtbGliamF2YQorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGliamF2YSBpbnN0YWxsY2hlY2stdGFyZ2V0LWxpYmphdmEKIG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGliamF2YToKIEBpZiB0YXJnZXQtbGliamF2YQpAQCAtMzQ1OTEsNiArMzY5MzMsMzMgQEAKIAogQGVuZGlmIHRhcmdldC16bGliCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC16bGliIGluc3RhbGwtaHRtbC10YXJnZXQtemxpYgorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC16bGliOgorQGlmIHRhcmdldC16bGliCittYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LXpsaWI6IGluc3RhbGwtaHRtbC10YXJnZXQtemxpYgorCitpbnN0YWxsLWh0bWwtdGFyZ2V0LXpsaWI6IFwKKyAgICBjb25maWd1cmUtdGFyZ2V0LXpsaWIgXAorICAgIGh0bWwtdGFyZ2V0LXpsaWIgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mICQoVEFSR0VUX1NVQkRJUikvemxpYi9NYWtlZmlsZSBdIHx8IGV4aXQgMCA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChOT1JNQUxfVEFSR0VUX0VYUE9SVFMpIFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gJChUQVJHRVRfU1VCRElSKS96bGliIiA7IFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX1RBUkdFVF9GTEFHUyk7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCShjZCAkKFRBUkdFVF9TVUJESVIpL3psaWIgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHRhcmdldC16bGliCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC16bGliIGluc3RhbGxjaGVjay10YXJnZXQtemxpYgogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC16bGliOgogQGlmIHRhcmdldC16bGliCkBAIC0zNDk0NSw2ICszNzMxNCwzMyBAQAogCiBAZW5kaWYgdGFyZ2V0LWJvZWhtLWdjCiAKKy5QSE9OWTogbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1ib2VobS1nYyBpbnN0YWxsLWh0bWwtdGFyZ2V0LWJvZWhtLWdjCittYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWJvZWhtLWdjOgorQGlmIHRhcmdldC1ib2VobS1nYworbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1ib2VobS1nYzogaW5zdGFsbC1odG1sLXRhcmdldC1ib2VobS1nYworCitpbnN0YWxsLWh0bWwtdGFyZ2V0LWJvZWhtLWdjOiBcCisgICAgY29uZmlndXJlLXRhcmdldC1ib2VobS1nYyBcCisgICAgaHRtbC10YXJnZXQtYm9laG0tZ2MgCisJQDogJChNQUtFKTsgJCh1bnN0YWdlKQorCUBbIC1mICQoVEFSR0VUX1NVQkRJUikvYm9laG0tZ2MvTWFrZWZpbGUgXSB8fCBleGl0IDAgOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTk9STUFMX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvYm9laG0tZ2MiIDsgXAorCWZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJKGNkICQoVEFSR0VUX1NVQkRJUikvYm9laG0tZ2MgJiYgXAorCSAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCSAgICAgICAgICAiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKKwkgICAgICAgICAgIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJICAgICAgICAgICJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCSAgICAgICAgICAgaW5zdGFsbC1odG1sKSBcCisJICB8fCBleGl0IDEKKworQGVuZGlmIHRhcmdldC1ib2VobS1nYworCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtYm9laG0tZ2MgaW5zdGFsbGNoZWNrLXRhcmdldC1ib2VobS1nYwogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC1ib2VobS1nYzoKIEBpZiB0YXJnZXQtYm9laG0tZ2MKQEAgLTM1Mjk5LDYgKzM3Njk1LDMzIEBACiAKIEBlbmRpZiB0YXJnZXQtcXRocmVhZHMKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LXF0aHJlYWRzIGluc3RhbGwtaHRtbC10YXJnZXQtcXRocmVhZHMKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtcXRocmVhZHM6CitAaWYgdGFyZ2V0LXF0aHJlYWRzCittYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LXF0aHJlYWRzOiBpbnN0YWxsLWh0bWwtdGFyZ2V0LXF0aHJlYWRzCisKK2luc3RhbGwtaHRtbC10YXJnZXQtcXRocmVhZHM6IFwKKyAgICBjb25maWd1cmUtdGFyZ2V0LXF0aHJlYWRzIFwKKyAgICBodG1sLXRhcmdldC1xdGhyZWFkcyAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgJChUQVJHRVRfU1VCRElSKS9xdGhyZWFkcy9NYWtlZmlsZSBdIHx8IGV4aXQgMCA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChOT1JNQUxfVEFSR0VUX0VYUE9SVFMpIFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gJChUQVJHRVRfU1VCRElSKS9xdGhyZWFkcyIgOyBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9UQVJHRVRfRkxBR1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwkoY2QgJChUQVJHRVRfU1VCRElSKS9xdGhyZWFkcyAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgdGFyZ2V0LXF0aHJlYWRzCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC1xdGhyZWFkcyBpbnN0YWxsY2hlY2stdGFyZ2V0LXF0aHJlYWRzCiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LXF0aHJlYWRzOgogQGlmIHRhcmdldC1xdGhyZWFkcwpAQCAtMzU2NTMsNiArMzgwNzYsMzMgQEAKIAogQGVuZGlmIHRhcmdldC1yZGEKIAorLlBIT05ZOiBtYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LXJkYSBpbnN0YWxsLWh0bWwtdGFyZ2V0LXJkYQorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1yZGE6CitAaWYgdGFyZ2V0LXJkYQorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1yZGE6IGluc3RhbGwtaHRtbC10YXJnZXQtcmRhCisKK2luc3RhbGwtaHRtbC10YXJnZXQtcmRhOiBcCisgICAgY29uZmlndXJlLXRhcmdldC1yZGEgXAorICAgIGh0bWwtdGFyZ2V0LXJkYSAKKwlAOiAkKE1BS0UpOyAkKHVuc3RhZ2UpCisJQFsgLWYgJChUQVJHRVRfU1VCRElSKS9yZGEvTWFrZWZpbGUgXSB8fCBleGl0IDAgOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTk9STUFMX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvcmRhIiA7IFwKKwlmb3IgZmxhZyBpbiAkKEVYVFJBX1RBUkdFVF9GTEFHUyk7IGRvIFwKKwkgIGV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJzsgZXhwb3J0IFwxfCJgOyBcCisJZG9uZTsgXAorCShjZCAkKFRBUkdFVF9TVUJESVIpL3JkYSAmJiBcCisJICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCisJICAgICAgICAgICJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCSAgICAgICAgICAiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkgICAgICAgICAgIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCisJICAgICAgICAgICBpbnN0YWxsLWh0bWwpIFwKKwkgIHx8IGV4aXQgMQorCitAZW5kaWYgdGFyZ2V0LXJkYQorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtcmRhIGluc3RhbGxjaGVjay10YXJnZXQtcmRhCiBtYXliZS1pbnN0YWxsY2hlY2stdGFyZ2V0LXJkYToKIEBpZiB0YXJnZXQtcmRhCkBAIC0zNjAwNyw2ICszODQ1NywzMyBAQAogCiBAZW5kaWYgdGFyZ2V0LWxpYmFkYQogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliYWRhIGluc3RhbGwtaHRtbC10YXJnZXQtbGliYWRhCittYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmFkYToKK0BpZiB0YXJnZXQtbGliYWRhCittYXliZS1pbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmFkYTogaW5zdGFsbC1odG1sLXRhcmdldC1saWJhZGEKKworaW5zdGFsbC1odG1sLXRhcmdldC1saWJhZGE6IFwKKyAgICBjb25maWd1cmUtdGFyZ2V0LWxpYmFkYSBcCisgICAgaHRtbC10YXJnZXQtbGliYWRhIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAkKFRBUkdFVF9TVUJESVIpL2xpYmFkYS9NYWtlZmlsZSBdIHx8IGV4aXQgMCA7IFwKKwlyPWAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyAke1BXRF9DT01NQU5EfWA7IGV4cG9ydCBzOyBcCisJJChOT1JNQUxfVEFSR0VUX0VYUE9SVFMpIFwKKwllY2hvICJEb2luZyBpbnN0YWxsLWh0bWwgaW4gJChUQVJHRVRfU1VCRElSKS9saWJhZGEiIDsgXAorCWZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAorCSAgZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInOyBleHBvcnQgXDF8ImA7IFwKKwlkb25lOyBcCisJKGNkICQoVEFSR0VUX1NVQkRJUikvbGliYWRhICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB0YXJnZXQtbGliYWRhCisKIC5QSE9OWTogbWF5YmUtaW5zdGFsbGNoZWNrLXRhcmdldC1saWJhZGEgaW5zdGFsbGNoZWNrLXRhcmdldC1saWJhZGEKIG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGliYWRhOgogQGlmIHRhcmdldC1saWJhZGEKQEAgLTM2MzYxLDYgKzM4ODM4LDMzIEBACiAKIEBlbmRpZiB0YXJnZXQtbGliZ29tcAogCisuUEhPTlk6IG1heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliZ29tcCBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmdvbXAKK21heWJlLWluc3RhbGwtaHRtbC10YXJnZXQtbGliZ29tcDoKK0BpZiB0YXJnZXQtbGliZ29tcAorbWF5YmUtaW5zdGFsbC1odG1sLXRhcmdldC1saWJnb21wOiBpbnN0YWxsLWh0bWwtdGFyZ2V0LWxpYmdvbXAKKworaW5zdGFsbC1odG1sLXRhcmdldC1saWJnb21wOiBcCisgICAgY29uZmlndXJlLXRhcmdldC1saWJnb21wIFwKKyAgICBodG1sLXRhcmdldC1saWJnb21wIAorCUA6ICQoTUFLRSk7ICQodW5zdGFnZSkKKwlAWyAtZiAkKFRBUkdFVF9TVUJESVIpL2xpYmdvbXAvTWFrZWZpbGUgXSB8fCBleGl0IDAgOyBcCisJcj1gJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgJHtQV0RfQ09NTUFORH1gOyBleHBvcnQgczsgXAorCSQoTk9STUFMX1RBUkdFVF9FWFBPUlRTKSBcCisJZWNobyAiRG9pbmcgaW5zdGFsbC1odG1sIGluICQoVEFSR0VUX1NVQkRJUikvbGliZ29tcCIgOyBcCisJZm9yIGZsYWcgaW4gJChFWFRSQV9UQVJHRVRfRkxBR1MpOyBkbyBcCisJICBldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMic7IGV4cG9ydCBcMXwiYDsgXAorCWRvbmU7IFwKKwkoY2QgJChUQVJHRVRfU1VCRElSKS9saWJnb21wICYmIFwKKwkgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkgICAgICAgICAgIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJICAgICAgICAgICJSQU5MSUI9JCR7UkFOTElCfSIgXAorCSAgICAgICAgICAiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkgICAgICAgICAgIGluc3RhbGwtaHRtbCkgXAorCSAgfHwgZXhpdCAxCisKK0BlbmRpZiB0YXJnZXQtbGliZ29tcAorCiAuUEhPTlk6IG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGliZ29tcCBpbnN0YWxsY2hlY2stdGFyZ2V0LWxpYmdvbXAKIG1heWJlLWluc3RhbGxjaGVjay10YXJnZXQtbGliZ29tcDoKIEBpZiB0YXJnZXQtbGliZ29tcApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUudHBsIGIvTWFrZWZpbGUudHBsCmluZGV4IDI3NDQ3NGEuLmI4M2Q4ZDUgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLnRwbAorKysgYi9NYWtlZmlsZS50cGwKQEAgLTUzLDYgKzUzLDkgQEAKIGluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKIG9sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKIGluZm9kaXIgPSBAaW5mb2RpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKIG1hbmRpciA9IEBtYW5kaXJACiBtYW4xZGlyID0gJChtYW5kaXIpL21hbjEKIG1hbjJkaXIgPSAkKG1hbmRpcikvbWFuMgpAQCAtNTMyLDcgKzUzNSw3IEBACiAKICMgSGVyZSBhcmUgdGhlIHRhcmdldHMgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgZG8tWCB0YXJnZXRzLgogCi0uUEhPTlk6IGluZm8gaW5zdGFsbGNoZWNrIGR2aSBodG1sIGluc3RhbGwtaW5mbworLlBIT05ZOiBpbmZvIGluc3RhbGxjaGVjayBkdmkgaHRtbCBpbnN0YWxsLWluZm8gaW5zdGFsbC1odG1sCiAuUEhPTlk6IGNsZWFuIGRpc3RjbGVhbiBtb3N0bHljbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbgogLlBIT05ZOiBsb2NhbC1jbGVhbiBsb2NhbC1kaXN0Y2xlYW4gbG9jYWwtbWFpbnRhaW5lci1jbGVhbgogaW5mbzogZG8taW5mbwpAQCAtNTUwLDYgKzU1Myw4IEBACiAJICAkKElOU1RBTExfREFUQSkgZGlyLmluZm8gJChERVNURElSKSQoaW5mb2RpcikvZGlyLmluZm8gOyBcCiAJZWxzZSB0cnVlIDsgZmkKIAoraW5zdGFsbC1odG1sOiBkby1pbnN0YWxsLWh0bWwKKwogbG9jYWwtY2xlYW46CiAJLXJtIC1mICouYSBURU1QIGVycnMgY29yZSAqLm8gKn4gXCMqIFRBR1MgKi5FICoubG9nCiAKZGlmZiAtLWdpdCBhL2JmZC9DaGFuZ2VMb2cgYi9iZmQvQ2hhbmdlTG9nCmluZGV4IDUxMTU3YzAuLjFlYTYwNjEgMTAwNjQ0Ci0tLSBhL2JmZC9DaGFuZ2VMb2cKKysrIGIvYmZkL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3NSBAQAorMjAwNi0wNC0xOSAgQWxhbiBNb2RyYSAgPGFtb2RyYUBiaWdwb25kLm5ldC5hdT4KKworCSogTWFrZWZpbGUuYW06IFJ1biAibWFrZSBkZXAtYW0iLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKKzIwMDYtMDQtMTkgIEFsYW4gTW9kcmEgIDxhbW9kcmFAYmlncG9uZC5uZXQuYXU+CisKKwkqIHdhcm5pbmcubTQgKC0tZW5hYmxlLXdlcnJvcik6IEZvcm1hdCBoZWxwIG1lc3NhZ2UuCisJKC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzKTogTGlrZXdpc2UuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDYtMDQtMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQHJlZGhhdC5jb20+CisKKwlQUiAyMjU3CisJKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IEFsbG93IGZpbGVzIHdpdGggY29ycnVwdCBlX3Noc3RybmR4CisJZmllbGRzIHRvIHN0aWxsIGJlIGhhbmRsZWQgYXMgRUxGIGZpbGVzLgorCisyMDA2LTA0LTE2ICBEYW5pZWwgSmFjb2Jvd2l0eiAgPGRhbkBjb2Rlc291cmNlcnkuY29tPgorCisJKiBwby9TUkMtUE9URklMRVMuaW46IFJlZ2VuZXJhdGVkLgorCisyMDA2LTA0LTE2ICBEYW5pZWwgSmFjb2Jvd2l0eiAgPGRhbkBjb2Rlc291cmNlcnkuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVwZGF0ZSB2ZXJzaW9uIHRvIDIuMTcuNTAuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisyMDA2LTA0LTE0ICBEYXZpZCBIZWluZSAgPGRsaGVpbmVAdGVuc2lsaWNhLmNvbT4KKworCSogZWxmMzIteHRlbnNhLmMgKGJ1aWxkX3JlbG9jX29wY29kZXMpOiBOZXcuCisJKGNvbXB1dGVfdGV4dF9hY3Rpb25zKTogVXNlIGl0IHRvIGRlY29kZSBvcGNvZGVzIG91dHNpZGUgaW5uZXIgbG9vcC4KKwkoY2hlY2tfc2VjdGlvbl9lYmJfcGNyZWxzX2ZpdCk6IEFkZCAicmVsb2Nfb3Bjb2RlcyIgYXJndW1lbnQsIGFuZCBpZgorCWl0IGlzIHNldCwgdXNlIGl0IHRvIGdldCB0aGUgb3Bjb2RlcyBmb3IgcmVsb2NhdGlvbnMuCisJKG1vdmVfc2hhcmVkX2xpdGVyYWwpOiBBZGp1c3QgY2FsbCB0byBjaGVja19zZWN0aW9uX2ViYl9wY3JlbHNfZml0LgorCisyMDA2LTA0LTA4ICBILkouIEx1ICA8aG9uZ2ppdS5sdUBpbnRlbC5jb20+CisKKwlQUiBsZC8yNTEzCisJKiBlbGYzMi1pMzg2LmMgKEdPVF9UTFNfTUFTSyk6IE5ldyBtYWNybyBmb3IgdGxzX3R5cGUuCisJKEdPVF9UTFNfSUVfSUUpOiBMaWtld2lzZS4KKwkoR09UX1RMU19JRV9HRCk6IExpa2V3aXNlLgorCShHT1RfVExTX0lFX01BU0spOiBMaWtld2lzZS4KKwkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRm9yIGdsb2JhbCBzeW1ib2xzLCBzZXQgR09UX1RMU19JRV9HRAorCWFuZCBHT1RfVExTX0lFX0lFIGZvciBSXzM4Nl9UTFNfR0QgYW5kIFJfMzg2X1RMU19JRQorCXJlc3BlY3RpdmVseS4KKwkoYWxsb2NhdGVfZHlucmVsb2NzKTogSWYgYm90aCBHT1RfVExTX0lFX0lFIGFuZCBHT1RfVExTX0lFX0dECisJYXJlIHNldCwgdHJlYXQgdGxzX3R5cGUgYXMgR09UX1RMU19JRV9CT1RILgorCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisKKzIwMDYtMDQtMDcgIFJhbmRvbHBoIENodW5nICA8dGF1c3FAZGViaWFuLm9yZz4KKworCSogZWxmNjQtaHBwYS5jIChlbGY2NF9ocHBhX2dyb2tfcHJzdGF0dXMpOiBOZXcgZnVuY3Rpb24uCisJKGVsZjY0X2hwcGFfZ3Jva19wc2luZm8pOiBMaWtld2lzZS4KKwkoZWxmX2JhY2tlbmRfZ3Jva19wc3RhdHVzLCBlbGZfYmFja2VuZF9ncm9rX3BzaW5mbyk6IERlZmluZS4KKworMjAwNi0wNC0wNiAgREogRGVsb3JpZSAgPGRqQHJlZGhhdC5jb20+CisKKwkqIGVsZjMyLW0zMmMuYyAobTMyY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEdlbmVyYXRlIGEgc3ltYm9sIGZvcgorCWVhY2ggcGx0IGVudHJ5IHdlIGNyZWF0ZS4KKworMjAwNi0wNC0wNiAgQ2FybG9zIE8nRG9uZWxsICA8Y2FybG9zQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIHBvL01ha2UtaW46IEFkZCBpbnN0YWxsLWh0bWwgdGFyZ2V0LgorCSogTWFrZWZpbGUuYW06IFJlbmFtZSBkb2NkaXIgdG8gYmZkZG9jZGlyLiBBZGQgZGF0YXJvb3RkaXIsIGRvY2RpcgorCWh0bWxkaXIuIEFkZCBpbnN0YWxsLWh0bWwgYW5kIGluc3RhbGwtaHRtbC1yZWN1cnNpdmUgdGFyZ2V0cy4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogY29uZmlndXJlLmluOiBBQ19TVUJTVCBmb3IgZGF0YXJvb3RkaXIsIGRvY2RpciBhbmQgaHRtbGRpci4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAwNi0wNC0wNiAgSC5KLiBMdSAgPGhvbmdqaXUubHVAaW50ZWwuY29tPgorCisJKiBlbGZ4eC1pYTY0LmMgKGVsZk5OX2lhNjRfcmVsYXhfc2VjdGlvbik6IFNraXAgdW5uZWVkZWQgcGFzc2VzCisJd2l0aCB0aGUgc2tpcF9yZWxheF9wYXNzXzAgYW5kIHNraXBfcmVsYXhfcGFzc18xIGJpdHMgaW4gdGhlCisJc2VjdGlvbiBzdHJ1Y3R1cmUuCisKKzIwMDYtMDQtMDUgIEJlcm5kIFNjaG1pZHQgIDxiZXJuZC5zY2htaWR0QGFuYWxvZy5jb20+CisKKwkqIGVsZjMyLWJmaW4uYyAoYmZpbmZkcGljX3JlbG9jc19pbmZvX2hhc2gpOiBTcHJpbmtsZSBjYXN0cyB0bworCWVsaW1pbmF0ZSB3YXJuaW5ncy4KKworMjAwNi0wNC0wNSAgSC5KLiBMdSAgPGhvbmdqaXUubHVAaW50ZWwuY29tPgorCSAgICBKYW1lcyBFIFdpbHNvbiAgPHdpbHNvbkBzcGVjaWZpeGluYy5jb20+CisKKwlQUiBsZC8yNDQyCisJKiBlbGZ4eC1pYTY0LmMgKGVsZk5OX2lhNjRfZHluX3N5bV9pbmZvKTogUmVtb3ZlIG5leHQuCisJKGVsZk5OX2lhNjRfbG9jYWxfaGFzaF9lbnRyeSk6IEFkZCBjb3VudCwgc29ydGVkX2NvdW50IGFuZAorCXNpemUuCisJKGVsZk5OX2lhNjRfbGlua19oYXNoX2VudHJ5KTogTGlrZXdpc2UuCisJKGVsZk5OX2lhNjRfbmV3X2VsZl9oYXNoX2VudHJ5KTogSW5pdGlhbGl6ZSBjb3VudCwgc29ydGVkX2NvdW50CisJYW5kIHNpemUuCisJKGVsZk5OX2lhNjRfaGFzaF9jb3B5X2luZGlyZWN0KTogVXBkYXRlZCBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbworCXByb2Nlc3NpbmcuCisJKGVsZk5OX2lhNjRfaGFzaF9oaWRlX3N5bWJvbCk6IExpa2V3aXNlLgorCShlbGZOTl9pYTY0X2dsb2JhbF9keW5fc3ltX3RodW5rKTogTGlrZXdpc2UuCisJKGVsZk5OX2lhNjRfbG9jYWxfZHluX3N5bV90aHVuayk6IExpa2V3aXNlLgorCShlbGZOTl9pYTY0X2dsb2JhbF9keW5faW5mb19mcmVlKTogTmV3IGZ1bmN0aW9uLgorCShlbGZOTl9pYTY0X2xvY2FsX2R5bl9pbmZvX2ZyZWUpOiBMaWtld2lzZS4KKwkoZWxmTk5faWE2NF9oYXNoX3RhYmxlX2ZyZWUpOiBGcmVlIGxvY2FsIGFuZCBnbG9iYWwKKwllbGZOTl9pYTY0X2R5bl9zeW1faW5mby4KKwkoYWRkZW5kX2NvbXBhcmUpOiBOZXcgZnVuY3Rpb24uCisJKHNvcnRfZHluX3N5bV9pbmZvKTogTGlrZXdpc2UuCisJKGdldF9keW5fc3ltX2luZm8pOiBVcGRhdGVkIHRvIHVzZSBiaW5hcnkgc2VhcmNoIGZvciBhZGRlbmQuCisJKGVsZk5OX2lhNjRfY2hlY2tfcmVsb2NzKTogU2NhbiByZWxvY2F0aW9ucyB0byBjcmVhdGUgZHluYW1pYworCXJlbG9jYXRpb24gYXJyYXlzIGZpcnN0LgorCisyMDA2LTA0LTA1ICBCZXJuZCBTY2htaWR0ICA8YmVybmQuc2NobWlkdEBhbmFsb2cuY29tPgorCisJKiBlbGYzMi1iZmluLmMgKF9iZmluX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IERvbid0IGdlbmVyYXRlIGEgX2dwCisJc3ltYm9sLgorCisyMDA2LTA0LTA1ICBILkouIEx1ICA8aG9uZ2ppdS5sdUBpbnRlbC5jb20+CisKKwlQUiBsZC8yNDExCisJKiBlbGZsaW5rLmMgKGNoZWNrX2R5bnN5bSk6IE5ldy4KKwkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFVzZSBpdC4KKwkoYmZkX2VsZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCisKKzIwMDYtMDQtMDUgIEguSi4gTHUgIDxob25naml1Lmx1QGludGVsLmNvbT4KKworCVBSIGxkLzI0MDQKKwkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbWVyZ2Vfc3ltYm9sKTogU2tpcCB0aGUgZGVmYXVsdCBpbmRpcmVjdAorCXN5bWJvbCBmcm9tIHRoZSBkeW5hbWljIGRlZmluaXRpb24gd2l0aCB0aGUgZGVmYXVsdCB2ZXJzaW9uIGlmCisJaXRzIHR5cGUgYW5kIHRoZSB0eXBlIG9mIGV4aXN0aW5nIHJlZ3VsYXIgZGVmaW5pdGlvbiBtaXNtYXRjaC4KKworMjAwNi0wNC0wNSAgUmljaGFyZCBTYW5kaWZvcmQgIDxyaWNoYXJkQGNvZGVzb3VyY2VyeS5jb20+CisJICAgIERhbmllbCBKYWNvYm93aXR6ICA8ZGFuQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIGNvbmZpZy5iZmQgKHNwYXJjLSotdnh3b3JrcyopOiBOZXcgc3RhbnphLgorCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfc3BhcmNfdnh3b3Jrc192ZWMpOiBOZXcgc3RhbnphLgorCShiZmRfZWxmMzJfc3BhcmNfdmVjLCBiZmRfZWxmNjRfc3BhcmNfdmVjKTogQWRkIGVsZi12eHdvcmtzLmxvLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogZWxmMzItc3BhcmMuYzogSW5jbHVkZSBlbGYtdnh3b3Jrcy5oLgorCShlbGYzMl9zcGFyY192eHdvcmtzX2xpbmtfaGFzaF90YWJsZV9jcmVhdGU6IE5ldy4KKwkoZWxmMzJfc3BhcmNfdnh3b3Jrc19maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTmV3LgorCShUQVJHRVRfQklHX1NZTSk6IE92ZXJyaWRlIGZvciBWeFdvcmtzLgorCShUQVJHRVRfQklHX05BTUUsIEVMRl9NSU5QQUdFU0laRSk6IExpa2V3aXNlLgorCShiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KKwkoZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0LCBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBMaWtld2lzZS4KKwkoZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplLCBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KKwkoZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KKwkoZWxmX2JhY2tlbmRfZW1pdF9yZWxvY3MpOiBMaWtld2lzZS4KKwkoZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywgZWxmMzJfYmVkKTogTGlrZXdpc2UuCisJKiBlbGZ4eC1zcGFyYy5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oIGFuZCBlbGYtdnh3b3Jrcy5oLgorCShzcGFyY192eHdvcmtzX2V4ZWNfcGx0MF9lbnRyeSwgc3BhcmNfdnh3b3Jrc19leGVjX3BsdF9lbnRyeSk6IE5ldy4KKwkoc3BhcmNfdnh3b3Jrc19zaGFyZWRfcGx0MF9lbnRyeSwgc3BhcmNfdnh3b3Jrc19zaGFyZWRfcGx0X2VudHJ5KTogTmV3LgorCShfYmZkX3NwYXJjX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRG9uJ3QgaW5pdGlhbGl6ZQorCWJ1aWxkX3BsdF9lbnRyeSBoZXJlLgorCShjcmVhdGVfZ290X3NlY3Rpb24pOiBJbml0aWFsaXplIHNnb3RwbHQgZm9yIFZ4V29ya3MuCisJKF9iZmRfc3BhcmNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSBidWlsZF9wbHRfZW50cnksCisJcGx0X2hlYWRlcl9zaXplIGFuZCBwbHRfZW50cnlfc2l6ZSwgd2l0aCBuZXcgVnhXb3Jrcy1zcGVjaWZpYyBzZXR0aW5ncy4KKwlDYWxsIGVsZl92eHdvcmtzX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIGZvciBWeFdvcmtzLgorCShhbGxvY2F0ZV9keW5yZWxvY3MpOiBVc2UgcGx0X2hlYWRlcl9zaXplIGFuZCBwbHRfZW50cnlfc2l6ZS4KKwlBbGxvY2F0ZSByb29tIGZvciAuZ290LnBsdCBhbmQgLnJlbGEucGx0LnVubG9hZGVkIGVudHJpZXMgb24gVnhXb3Jrcy4KKwkoX2JmZF9zcGFyY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgYWxsb2NhdGUgYSBub3AgaW4gLnBsdAorCWZvciBWeFdvcmtzLiAgQ2hlY2sgZm9yIHRoZSAuZ290LnBsdCBzZWN0aW9uLgorCShzcGFyY192eHdvcmtzX2J1aWxkX3BsdF9lbnRyeSk6IE5ldyBmdW5jdGlvbi4KKwkoX2JmZF9zcGFyY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQWRkIGhhbmRsaW5nIG9mIFZ4V29ya3MgUExUcy4KKwlEb24ndCBtYWtlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhbmQgX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXworCWFic29sdXRlIG9uIFZ4V29ya3MuCisJKHNwYXJjMzJfZmluaXNoX2R5bik6IEFkZCBzcGVjaWFsIGhhbmRsaW5nIGZvciBEVF9SRUxBU1oKKwlhbmQgRFRfUExUR09UIG9uIFZ4V29ya3MuCisJKHNwYXJjX3Z4d29ya3NfZmluaXNoX2V4ZWNfcGx0KTogTmV3LgorCShzcGFyY192eHdvcmtzX2ZpbmlzaF9zaGFyZWRfcGx0KTogTmV3LgorCShfYmZkX3NwYXJjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgdGhlbS4KKwlVc2UgcGx0X2hlYWRlcl9zaXplIGFuZCBwbHRfZW50cnlfc2l6ZS4KKwkqIGVsZnh4LXNwYXJjLmggKF9iZmRfc3BhcmNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBpc192eHdvcmtzLAorCXNyZWxwbHQyLCBzZ290cGx0LCBwbHRfaGVhZGVyX3NpemUgYW5kIHBsdF9lbnRyeV9zaXplIGZpZWxkcy4KKwkqIE1ha2VmaWxlLmFtIChlbGZ4eC1zcGFyYy5sbyk6IERlcGVuZCBvbiBlbGYtdnh3b3Jrcy5oLgorCShlbGYzMi1zcGFyYy5sbyk6IExpa2V3aXNlLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9zcGFyY192eHdvcmtzX3ZlYyk6IERlY2xhcmUuCisJKF9iZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBhIHBvaW50ZXIgdG8gaXQuCisKIDIwMDYtMDMtMzAgIEJlbiBFbGxpc3RvbiAgPGJqZUBhdS5pYm0uY29tPgogCiAJUFIgbGQvMjI2NwpAQCAtNDA1LDggKzU3Nyw3IEBACiAyMDA2LTAzLTExICBILkouIEx1ICA8aG9uZ2ppdS5sdUBpbnRlbC5jb20+CiAKIAlQUiBsZC8yNDQzCi0JKiBkd2FyZjIuYyAoY29uY2F0X2ZpbGVuYW1lKTogRG9uJ3QgaXNzdWUgYW4gZXJyb3IgaWYgZmlsZSBpcwotCTAuCisJKiBkd2FyZjIuYyAoY29uY2F0X2ZpbGVuYW1lKTogRG9uJ3QgaXNzdWUgYW4gZXJyb3IgaWYgZmlsZSBpcyAwLgogCiAyMDA2LTAzLTEwICBQYXVsIEJyb29rICA8cGF1bEBjb2Rlc291cmNlcnkuY29tPgogCmRpZmYgLS1naXQgYS9iZmQvTWFrZWZpbGUuYW0gYi9iZmQvTWFrZWZpbGUuYW0KaW5kZXggYTBkNWVkZi4uNDRhNDIwMSAxMDA2NDQKLS0tIGEvYmZkL01ha2VmaWxlLmFtCisrKyBiL2JmZC9NYWtlZmlsZS5hbQpAQCAtMTEsMTAgKzExLDE0IEBACiAKIFNVQkRJUlMgPSBkb2MgcG8KIAotZG9jZGlyID0gZG9jCitiZmRkb2NkaXIgPSBkb2MKIGJmZGxpYmRpciA9IEBiZmRsaWJkaXJACiBiZmRpbmNsdWRlZGlyID0gQGJmZGluY2x1ZGVkaXJACiAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKKwogYmZkbGliX0xUTElCUkFSSUVTID0gbGliYmZkLmxhCiAKIFdBUk5fQ0ZMQUdTID0gQFdBUk5fQ0ZMQUdTQApAQCAtNjYxLDYgKzY2NSwzNSBAQAogCiBhbGwgZGlzdHN0dWZmOiBpbmZvCiAKKy5QSE9OWTogaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCisKK2luc3RhbGwtaHRtbDoJaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWh0bWwtcmVjdXJzaXZlOgorCUBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKICMgVmFyaW91cyBraW5kcyBvZiAubyBmaWxlcyB0byBwdXQgaW4gbGliYmZkLmE6CiAjIEJGRF9CQUNLRU5EUwlSb3V0aW5lcyB0aGUgY29uZmlndXJlZCB0YXJnZXRzIG5lZWQuCiAjIEJGRF9NQUNISU5FUwlBcmNoaXRlY3R1cmUtc3BlY2lmaWMgcm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgpAQCAtODU5LDEyICs4OTIsMTIgQEAKIAogIyBDb3VsZCByZWFsbHkgdXNlIGEgImNvcHktaWYtY2hhbmdlIi4uLgogaGVhZGVyczoKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpIHByb3RvcyAkKEZMQUdTX1RPX1BBU1MpKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3CisJKGNkICQoYmZkZG9jZGlyKTsgJChNQUtFKSBwcm90b3MgJChGTEFHU19UT19QQVNTKSkKKwljcCAkKGJmZGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwogCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3CisJY3AgJChiZmRkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldwogCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQuaC1uZXcgJChzcmNkaXIpL2xpYmJmZC5oCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3CisJY3AgJChiZmRkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3CiAJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAogCiAjIFdlIG9ubHkgcmVidWlsZCB0aGUgaGVhZGVyIGZpbGVzIGF1dG9tYXRpY2FsbHkgaWYgd2UgaGF2ZSBiZWVuCkBAIC04NzIsMjIgKzkwNSwyMiBAQAogCiAkKHNyY2RpcikvYmZkLWluMi5oOiBATUFJTlRAIHN0bXAtYmluMi1oIDsgQHRydWUKIHN0bXAtYmluMi1oOiAkKEJGRF9IX0ZJTEVTKSAkKEJGRDY0X0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGJmZC5oKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3CisJKGNkICQoYmZkZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGJmZC5oKQorCWNwICQoYmZkZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3CiAJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAogCXRvdWNoIHN0bXAtYmluMi1oCiAKICQoc3JjZGlyKS9saWJiZmQuaDogQE1BSU5UQCBzdG1wLWxiZmQtaCA7IEB0cnVlCiBzdG1wLWxiZmQtaDogJChMSUJCRkRfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgbGliYmZkLmgpCi0JY3AgJChkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldworCShjZCAkKGJmZGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJiZmQuaCkKKwljcCAkKGJmZGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3CiAJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKIAl0b3VjaCBzdG1wLWxiZmQtaAogCiAkKHNyY2RpcikvbGliY29mZi5oOiBATUFJTlRAIHN0bXAtbGNvZmYtaCA7IEB0cnVlCiBzdG1wLWxjb2ZmLWg6ICQoTElCQ09GRl9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJjb2ZmLmgpCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3CisJKGNkICQoYmZkZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmNvZmYuaCkKKwljcCAkKGJmZGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKIAkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCiAJdG91Y2ggc3RtcC1sY29mZi1oCiAKQEAgLTEyMzEsNyArMTI2NCw4IEBACiBlbGYzMi1iZmluLmxvOiBlbGYzMi1iZmluLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9oYXNodGFiLmggXAogICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAogICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2JmaW4uaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKKyAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCAkKElOQ0RJUikvZWxmL2R3YXJmMi5oIFwKKyAgZWxmMzItdGFyZ2V0LmgKIGVsZjMyLWNyMTZjLmxvOiBlbGYzMi1jcjE2Yy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCiAgICQoSU5DRElSKS9oYXNodGFiLmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2NyMTZjLmggXAogICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKQEAgLTEzNDksMTUgKzEzODMsMTUgQEAKICAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKICAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKICAgZWxmeHgtbWlwcy5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9taXBzLmggJChJTkNESVIpL2NvZmYvZXh0ZXJuYWwuaCBlbGYtdnh3b3Jrcy5oCisgIGVsZi12eHdvcmtzLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCisgICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvbWlwcy5oICQoSU5DRElSKS9jb2ZmL2V4dGVybmFsLmgKIGVsZjMyLW1pcHMubG86IGVsZjMyLW1pcHMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2hhc2h0YWIuaCBcCiAgICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKICAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBlbGZ4eC1taXBzLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYtdnh3b3Jrcy5oIFwKKyAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKICAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9taXBzLmggJChJTkNESVIpL2NvZmYvZXh0ZXJuYWwuaCBcCi0gIGVjb2Zmc3dhcC5oIGVsZjMyLXRhcmdldC5oIGVsZi12eHdvcmtzLmgKKyAgZWNvZmZzd2FwLmggZWxmMzItdGFyZ2V0LmgKIGVsZjMyLW10LmxvOiBlbGYzMi1tdC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvaGFzaHRhYi5oIFwKICAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKICAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9tdC5oIFwKQEAgLTE0MTMsMTUgKzE0NDcsMTUgQEAKICAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3NoLW9wYy5oIFwKICAgZWxmMzItdGFyZ2V0LmgKIGVsZnh4LXNwYXJjLmxvOiBlbGZ4eC1zcGFyYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2hhc2h0YWIuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggXAotICBlbGZ4eC1zcGFyYy5oCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2hhc2h0YWIuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggZWxmeHgtc3BhcmMuaCBlbGYtdnh3b3Jrcy5oCiBlbGYzMi1zcGFyYy5sbzogZWxmMzItc3BhcmMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAogICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9oYXNodGFiLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAogICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvc3BhcmMuaCBcCiAgICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oIFwKLSAgZWxmeHgtc3BhcmMuaCBlbGYzMi10YXJnZXQuaAorICBlbGZ4eC1zcGFyYy5oIGVsZi12eHdvcmtzLmggZWxmMzItdGFyZ2V0LmgKIGVsZjMyLXY4NTAubG86IGVsZjMyLXY4NTAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCiAgICQoSU5DRElSKS9oYXNodGFiLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAogICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvdjg1MC5oIFwKZGlmZiAtLWdpdCBhL2JmZC9NYWtlZmlsZS5pbiBiL2JmZC9NYWtlZmlsZS5pbgppbmRleCA2Yjc4MzMzLi40ZTIyMTY3IDEwMDY0NAotLS0gYS9iZmQvTWFrZWZpbGUuaW4KKysrIGIvYmZkL01ha2VmaWxlLmluCkBAIC0yLDcgKzIsNyBAQAogIyBAY29uZmlndXJlX2lucHV0QAogCiAjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIDIwMDMsIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKICMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgpAQCAtMjE3LDYgKzIxNyw4IEBACiBidWlsZF9vcyA9IEBidWlsZF9vc0AKIGJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACiBkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACiBleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKIGhvc3QgPSBAaG9zdEAKIGhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKQEAgLTIyNCw2ICsyMjYsNyBAQAogaG9zdF9ub25jYW5vbmljYWwgPSBAaG9zdF9ub25jYW5vbmljYWxACiBob3N0X29zID0gQGhvc3Rfb3NACiBob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKIGluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKIGluZm9kaXIgPSBAaW5mb2RpckAKIGluc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKQEAgLTI1NSw3ICsyNTgsNyBAQAogQ1NFQVJDSCA9IC1JLiAtSSQoc3JjZGlyKSAtSSQoSU5DRElSKQogTUtERVAgPSBnY2MgLU1NCiBTVUJESVJTID0gZG9jIHBvCi1kb2NkaXIgPSBkb2MKK2JmZGRvY2RpciA9IGRvYwogYmZkbGliX0xUTElCUkFSSUVTID0gbGliYmZkLmxhCiBBTV9DRkxBR1MgPSAkKFdBUk5fQ0ZMQUdTKQogCkBAIC0xMjY1LDYgKzEyNjgsMzUgQEAKIAogYWxsIGRpc3RzdHVmZjogaW5mbwogCisuUEhPTlk6IGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWh0bWw6CWluc3RhbGwtaHRtbC1yZWN1cnNpdmUKKworaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZToKKwlAZmFpbGNvbT0nZXhpdCAxJzsgXAorCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKKwkgIGNhc2UgJCRmIGluIFwKKwkgICAgKj0qIHwgLS1bIWtdKik7OyBcCisJICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGRvdF9zZWVuPXllczsgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCiBzdGFtcC1vZmlsZXM6IE1ha2VmaWxlCiAJcm0gLWYgdG9maWxlcwogCWY9IiI7IFwKQEAgLTE0MzMsMTIgKzE0NjUsMTIgQEAKIAogIyBDb3VsZCByZWFsbHkgdXNlIGEgImNvcHktaWYtY2hhbmdlIi4uLgogaGVhZGVyczoKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpIHByb3RvcyAkKEZMQUdTX1RPX1BBU1MpKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3CisJKGNkICQoYmZkZG9jZGlyKTsgJChNQUtFKSBwcm90b3MgJChGTEFHU19UT19QQVNTKSkKKwljcCAkKGJmZGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwogCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3CisJY3AgJChiZmRkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldwogCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQuaC1uZXcgJChzcmNkaXIpL2xpYmJmZC5oCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3CisJY3AgJChiZmRkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3CiAJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAogCiAjIFdlIG9ubHkgcmVidWlsZCB0aGUgaGVhZGVyIGZpbGVzIGF1dG9tYXRpY2FsbHkgaWYgd2UgaGF2ZSBiZWVuCkBAIC0xNDQ2LDIyICsxNDc4LDIyIEBACiAKICQoc3JjZGlyKS9iZmQtaW4yLmg6IEBNQUlOVEAgc3RtcC1iaW4yLWggOyBAdHJ1ZQogc3RtcC1iaW4yLWg6ICQoQkZEX0hfRklMRVMpICQoQkZENjRfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgYmZkLmgpCi0JY3AgJChkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKKwkoY2QgJChiZmRkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgYmZkLmgpCisJY3AgJChiZmRkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKIAkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLWluMi5oLW5ldyAkKHNyY2RpcikvYmZkLWluMi5oCiAJdG91Y2ggc3RtcC1iaW4yLWgKIAogJChzcmNkaXIpL2xpYmJmZC5oOiBATUFJTlRAIHN0bXAtbGJmZC1oIDsgQHRydWUKIHN0bXAtbGJmZC1oOiAkKExJQkJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJiZmQuaCkKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3CisJKGNkICQoYmZkZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmJmZC5oKQorCWNwICQoYmZkZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKIAkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAogCXRvdWNoIHN0bXAtbGJmZC1oCiAKICQoc3JjZGlyKS9saWJjb2ZmLmg6IEBNQUlOVEAgc3RtcC1sY29mZi1oIDsgQHRydWUKIHN0bXAtbGNvZmYtaDogJChMSUJDT0ZGX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmNvZmYuaCkKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKKwkoY2QgJChiZmRkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgbGliY29mZi5oKQorCWNwICQoYmZkZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwogCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKIAl0b3VjaCBzdG1wLWxjb2ZmLWgKIApAQCAtMTc5OCw3ICsxODMwLDggQEAKIGVsZjMyLWJmaW4ubG86IGVsZjMyLWJmaW4uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2hhc2h0YWIuaCBcCiAgIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCiAgICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvYmZpbi5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAorICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9lbGYvZHdhcmYyLmggXAorICBlbGYzMi10YXJnZXQuaAogZWxmMzItY3IxNmMubG86IGVsZjMyLWNyMTZjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKICAgJChJTkNESVIpL2hhc2h0YWIuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvY3IxNmMuaCBcCiAgICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXApAQCAtMTkxNiwxNSArMTk0OSwxNSBAQAogICAkKElOQ0RJUikvbGliaWJlcnR5LmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAogICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAogICBlbGZ4eC1taXBzLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL21pcHMuaCAkKElOQ0RJUikvY29mZi9leHRlcm5hbC5oIGVsZi12eHdvcmtzLmgKKyAgZWxmLXZ4d29ya3MuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKKyAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9taXBzLmggJChJTkNESVIpL2NvZmYvZXh0ZXJuYWwuaAogZWxmMzItbWlwcy5sbzogZWxmMzItbWlwcy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvaGFzaHRhYi5oIFwKICAgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAogICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIGVsZnh4LW1pcHMuaCBcCi0gICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggJChJTkNESVIpL2NvZmYvc3ltLmggXAotICAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZi12eHdvcmtzLmggXAorICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAogICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL21pcHMuaCAkKElOQ0RJUikvY29mZi9leHRlcm5hbC5oIFwKLSAgZWNvZmZzd2FwLmggZWxmMzItdGFyZ2V0LmggZWxmLXZ4d29ya3MuaAorICBlY29mZnN3YXAuaCBlbGYzMi10YXJnZXQuaAogZWxmMzItbXQubG86IGVsZjMyLW10LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9oYXNodGFiLmggXAogICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAogICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL210LmggXApAQCAtMTk4MCwxNSArMjAxMywxNSBAQAogICAkKElOQ0RJUikvbGliaWJlcnR5LmggJChzcmNkaXIpLy4uL29wY29kZXMvc2gtb3BjLmggXAogICBlbGYzMi10YXJnZXQuaAogZWxmeHgtc3BhcmMubG86IGVsZnh4LXNwYXJjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvaGFzaHRhYi5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL3NwYXJjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaCBcCi0gIGVsZnh4LXNwYXJjLmgKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvaGFzaHRhYi5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCisgICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaCBlbGZ4eC1zcGFyYy5oIGVsZi12eHdvcmtzLmgKIGVsZjMyLXNwYXJjLmxvOiBlbGYzMi1zcGFyYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCiAgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2hhc2h0YWIuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCiAgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9zcGFyYy5oIFwKICAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggXAotICBlbGZ4eC1zcGFyYy5oIGVsZjMyLXRhcmdldC5oCisgIGVsZnh4LXNwYXJjLmggZWxmLXZ4d29ya3MuaCBlbGYzMi10YXJnZXQuaAogZWxmMzItdjg1MC5sbzogZWxmMzItdjg1MC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKICAgJChJTkNESVIpL2hhc2h0YWIuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCiAgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi92ODUwLmggXApkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZy5iZmQgYi9iZmQvY29uZmlnLmJmZAppbmRleCBjY2QwZGU4Li40ZmQ3MmMxIDEwMDY0NAotLS0gYS9iZmQvY29uZmlnLmJmZAorKysgYi9iZmQvY29uZmlnLmJmZApAQCAtMTI4NCw2ICsxMjg0LDEwIEBACiAgIHNwYXJjLSotc3lzdjQqKQogICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKICAgICA7OworICBzcGFyYy0qLXZ4d29ya3MqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192eHdvcmtzX3ZlYworICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3NwYXJjX3ZlYyBzdW5vc19iaWdfdmVjIgorICAgIDs7CiAgIHNwYXJjLSotbmV0d2FyZSopCiAgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwogICAgIHRhcmdfc2VsdmVjcz0ibmxtMzJfc3BhcmNfdmVjIHN1bm9zX2JpZ192ZWMiCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlIGIvYmZkL2NvbmZpZ3VyZQppbmRleCA1YWQyYmM0Li5mZmUyNTU2IDEwMDc1NQotLS0gYS9iZmQvY29uZmlndXJlCisrKyBiL2JmZC9jb25maWd1cmUKQEAgLTMwOSw3ICszMDksNyBAQAogIyBpbmNsdWRlIDx1bmlzdGQuaD4KICNlbmRpZiIKIAotYWNfc3Vic3RfdmFycz0nU0hFTEwgUEFUSF9TRVBBUkFUT1IgUEFDS0FHRV9OQU1FIFBBQ0tBR0VfVEFSTkFNRSBQQUNLQUdFX1ZFUlNJT04gUEFDS0FHRV9TVFJJTkcgUEFDS0FHRV9CVUdSRVBPUlQgZXhlY19wcmVmaXggcHJlZml4IHByb2dyYW1fdHJhbnNmb3JtX25hbWUgYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBsaWJkaXIgaW5jbHVkZWRpciBvbGRpbmNsdWRlZGlyIGluZm9kaXIgbWFuZGlyIGJ1aWxkX2FsaWFzIGhvc3RfYWxpYXMgdGFyZ2V0X2FsaWFzIERFRlMgRUNIT19DIEVDSE9fTiBFQ0hPX1QgTElCUyBidWlsZCBidWlsZF9jcHUgYnVpbGRfdmVuZG9yIGJ1aWxkX29zIGhvc3QgaG9zdF9jcHUgaG9zdF92ZW5kb3IgaG9zdF9vcyB0YXJnZXQgdGFyZ2V0X2NwdSB0YXJnZXRfdmVuZG9yIHRhcmdldF9vcyBDQyBDRkxBR1MgTERGTEFHUyBDUFBGTEFHUyBhY19jdF9DQyBFWEVFWFQgT0JKRVhUIElOU1RBTExfUFJPR1JBTSBJTlNUQUxMX1NDUklQVCBJTlNUQUxMX0RBVEEgQ1lHUEFUSF9XIFBBQ0tBR0UgVkVSU0lPTiBBQ0xPQ0FMIEFVVE9DT05GIEFVVE9NQUtFIEFVVE9IRUFERVIgTUFLRUlORk8gaW5zdGFsbF9zaCBTVFJJUCBhY19jdF9TVFJJUCBJTlNUQUxMX1NUUklQX1BST0dSQU0gbWtkaXJfcCBBV0sgU0VUX01BS0UgYW1fX2xlYWRpbmdfZG90IEFNVEFSIGFtX190YXIgYW1fX3VudGFyIERFUERJUiBhbV9faW5jbHVkZSBhbV9fcXVvdGUgQU1ERVBfVFJVRSBBTURFUF9GQUxTRSBBTURFUEJBQ0tTTEFTSCBDQ0RFUE1PREUgYW1fX2Zhc3RkZXBDQ19UUlVFIGFtX19mYXN0ZGVwQ0NfRkFMU0UgQVIgYWNfY3RfQVIgUkFOTElCIGFjX2N0X1JBTkxJQiBMTl9TIExJQlRPT0wgV0FSTl9DRkxBR1MgTk9fV0VSUk9SIE1BSU5UQUlORVJfTU9ERV9UUlVFIE1BSU5UQUlORVJfTU9ERV9GQUxTRSBNQUlOVCBJTlNUQUxMX0xJQkJGRF9UUlVFIElOU1RBTExfTElCQkZEX0ZBTFNFIGhvc3Rfbm9uY2Fub25pY2FsIHRhcmdldF9ub25jYW5vbmljYWwgYmZkbGliZGlyIGJmZGluY2x1ZGVkaXIgQ1BQIEVHUkVQIEFMTE9DQSBVU0VfTkxTIE1TR0ZNVCBHTVNHRk1UIFhHRVRURVhUIFVTRV9JTkNMVURFRF9MSUJJTlRMIENBVEFMT0dTIENBVE9CSkVYVCBEQVRBRElSTkFNRSBHTU9GSUxFUyBJTlNUT0JKRVhUIElOVExERVBTIElOVExMSUJTIElOVExPQkpTIFBPRklMRVMgUE9TVUIgSU5DTFVERV9MT0NBTEVfSCBHVF9OTyBHVF9ZRVMgTUtJTlNUQUxMRElSUyBsIEhERUZJTkVTIEJGRF9IT1NUXzY0QklUX0xPTkcgQkZEX0hPU1RfTE9OR19MT05HIEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEIEJGRF9IT1NUXzY0X0JJVCBCRkRfSE9TVF9VXzY0X0JJVCBDQ19GT1JfQlVJTEQgRVhFRVhUX0ZPUl9CVUlMRCBDT1JFRklMRSBDT1JFRkxBRyBXSU4zMkxERkxBR1MgV0lOMzJMSUJBREQgVERFRklORVMgd29yZHNpemUgYmZkX2xpYnMgYWxsX2JhY2tlbmRzIGJmZF9iYWNrZW5kcyBiZmRfbWFjaGluZXMgYmZkX2RlZmF1bHRfdGFyZ2V0X3NpemUgYmZkX2ZpbGVfcHRyIGJmZF91ZmlsZV9wdHIgdGRlZmF1bHRzIExJQk9CSlMgTFRMSUJPQkpTJworYWNfc3Vic3RfdmFycz0nU0hFTEwgUEFUSF9TRVBBUkFUT1IgUEFDS0FHRV9OQU1FIFBBQ0tBR0VfVEFSTkFNRSBQQUNLQUdFX1ZFUlNJT04gUEFDS0FHRV9TVFJJTkcgUEFDS0FHRV9CVUdSRVBPUlQgZXhlY19wcmVmaXggcHJlZml4IHByb2dyYW1fdHJhbnNmb3JtX25hbWUgYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBsaWJkaXIgaW5jbHVkZWRpciBvbGRpbmNsdWRlZGlyIGluZm9kaXIgbWFuZGlyIGJ1aWxkX2FsaWFzIGhvc3RfYWxpYXMgdGFyZ2V0X2FsaWFzIERFRlMgRUNIT19DIEVDSE9fTiBFQ0hPX1QgTElCUyBidWlsZCBidWlsZF9jcHUgYnVpbGRfdmVuZG9yIGJ1aWxkX29zIGhvc3QgaG9zdF9jcHUgaG9zdF92ZW5kb3IgaG9zdF9vcyB0YXJnZXQgdGFyZ2V0X2NwdSB0YXJnZXRfdmVuZG9yIHRhcmdldF9vcyBDQyBDRkxBR1MgTERGTEFHUyBDUFBGTEFHUyBhY19jdF9DQyBFWEVFWFQgT0JKRVhUIElOU1RBTExfUFJPR1JBTSBJTlNUQUxMX1NDUklQVCBJTlNUQUxMX0RBVEEgQ1lHUEFUSF9XIFBBQ0tBR0UgVkVSU0lPTiBBQ0xPQ0FMIEFVVE9DT05GIEFVVE9NQUtFIEFVVE9IRUFERVIgTUFLRUlORk8gaW5zdGFsbF9zaCBTVFJJUCBhY19jdF9TVFJJUCBJTlNUQUxMX1NUUklQX1BST0dSQU0gbWtkaXJfcCBBV0sgU0VUX01BS0UgYW1fX2xlYWRpbmdfZG90IEFNVEFSIGFtX190YXIgYW1fX3VudGFyIERFUERJUiBhbV9faW5jbHVkZSBhbV9fcXVvdGUgQU1ERVBfVFJVRSBBTURFUF9GQUxTRSBBTURFUEJBQ0tTTEFTSCBDQ0RFUE1PREUgYW1fX2Zhc3RkZXBDQ19UUlVFIGFtX19mYXN0ZGVwQ0NfRkFMU0UgQVIgYWNfY3RfQVIgUkFOTElCIGFjX2N0X1JBTkxJQiBMTl9TIExJQlRPT0wgV0FSTl9DRkxBR1MgTk9fV0VSUk9SIE1BSU5UQUlORVJfTU9ERV9UUlVFIE1BSU5UQUlORVJfTU9ERV9GQUxTRSBNQUlOVCBJTlNUQUxMX0xJQkJGRF9UUlVFIElOU1RBTExfTElCQkZEX0ZBTFNFIGhvc3Rfbm9uY2Fub25pY2FsIHRhcmdldF9ub25jYW5vbmljYWwgYmZkbGliZGlyIGJmZGluY2x1ZGVkaXIgQ1BQIEVHUkVQIEFMTE9DQSBVU0VfTkxTIE1TR0ZNVCBHTVNHRk1UIFhHRVRURVhUIFVTRV9JTkNMVURFRF9MSUJJTlRMIENBVEFMT0dTIENBVE9CSkVYVCBEQVRBRElSTkFNRSBHTU9GSUxFUyBJTlNUT0JKRVhUIElOVExERVBTIElOVExMSUJTIElOVExPQkpTIFBPRklMRVMgUE9TVUIgSU5DTFVERV9MT0NBTEVfSCBHVF9OTyBHVF9ZRVMgTUtJTlNUQUxMRElSUyBsIEhERUZJTkVTIEJGRF9IT1NUXzY0QklUX0xPTkcgQkZEX0hPU1RfTE9OR19MT05HIEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEIEJGRF9IT1NUXzY0X0JJVCBCRkRfSE9TVF9VXzY0X0JJVCBDQ19GT1JfQlVJTEQgRVhFRVhUX0ZPUl9CVUlMRCBDT1JFRklMRSBDT1JFRkxBRyBXSU4zMkxERkxBR1MgV0lOMzJMSUJBREQgVERFRklORVMgd29yZHNpemUgYmZkX2xpYnMgYWxsX2JhY2tlbmRzIGJmZF9iYWNrZW5kcyBiZmRfbWFjaGluZXMgYmZkX2RlZmF1bHRfdGFyZ2V0X3NpemUgYmZkX2ZpbGVfcHRyIGJmZF91ZmlsZV9wdHIgdGRlZmF1bHRzIGRhdGFyb290ZGlyIGRvY2RpciBodG1sZGlyIExJQk9CSlMgTFRMSUJPQkpTJwogYWNfc3Vic3RfZmlsZXM9JycKIAogIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgpAQCAtODYwLDggKzg2MCw4IEBACiAgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucwogICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkKICAgLS1lbmFibGUtc2VjdXJlcGx0ICAgICAgRGVmYXVsdCB0byBjcmVhdGluZyByZWFkLW9ubHkgcGx0IGVudHJpZXMKLSAgLS1lbmFibGUtd2Vycm9yICAgIHRyZWF0IGNvbXBpbGUgd2FybmluZ3MgYXMgZXJyb3JzCi0gIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIEVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzCisgIC0tZW5hYmxlLXdlcnJvciAgICAgICAgIHRyZWF0IGNvbXBpbGUgd2FybmluZ3MgYXMgZXJyb3JzCisgIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIGVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzCiAgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSAgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCiAJCQkgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIKICAgLS1lbmFibGUtaW5zdGFsbC1saWJiZmQgY29udHJvbHMgaW5zdGFsbGF0aW9uIG9mIGxpYmJmZCBhbmQgcmVsYXRlZCBoZWFkZXJzCkBAIC0yODM2LDcgKzI4MzYsNyBAQAogCiAjIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCiAgUEFDS0FHRT1iZmQKLSBWRVJTSU9OPTIuMTYuOTEKKyBWRVJTSU9OPTIuMTcuNTAKIAogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCkBAIC0xMzE1OSw3ICsxMzE1OSw4IEBACiAgICAgYmZkX2VsZjMyX3NobGluX3ZlYykJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7CiAgICAgYmZkX2VsZjMyX3NobG5ic2RfdmVjKQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKICAgICBiZmRfZWxmMzJfc2huYnNkX3ZlYykJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NwYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1zcGFyYy5sbyBlbGZ4eC1zcGFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9zcGFyY192ZWMpCXRiPSIkdGIgZWxmMzItc3BhcmMubG8gZWxmeHgtc3BhcmMubG8gZWxmLXZ4d29ya3MubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfc3BhcmNfdnh3b3Jrc192ZWMpIHRiPSIkdGIgZWxmMzItc3BhcmMubG8gZWxmeHgtc3BhcmMubG8gZWxmLXZ4d29ya3MubG8gZWxmMzIubG8gJGVsZiIgOzsKICAgICBiZmRfZWxmMzJfdHJhZGJpZ21pcHNfdmVjKSAgdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZnh4LW1pcHMubG8gZWxmLXZ4d29ya3MubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7CiAgICAgYmZkX2VsZjMyX3RyYWRsaXR0bGVtaXBzX3ZlYykgdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZnh4LW1pcHMubG8gZWxmLXZ4d29ya3MubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7CiAgICAgYmZkX2VsZjMyX3VzX2NyaXNfdmVjKQl0Yj0iJHRiIGVsZjMyLWNyaXMubG8gZWxmMzIubG8gJGVsZiIgOzsKQEAgLTEzMTkwLDcgKzEzMTkxLDcgQEAKICAgICBiZmRfZWxmNjRfc2g2NGJsaW5fdmVjKQl0Yj0iJHRiIGVsZjY0LXNoNjQubG8gZWxmNjQubG8gJGVsZiIgdGFyZ2V0X3NpemU9NjQgOzsKICAgICBiZmRfZWxmNjRfc2g2NGxuYnNkX3ZlYykJdGI9IiR0YiBlbGY2NC1zaDY0LmxvIGVsZjY0LmxvICRlbGYiIHRhcmdldF9zaXplPTY0IDs7CiAgICAgYmZkX2VsZjY0X3NoNjRuYnNkX3ZlYykJdGI9IiR0YiBlbGY2NC1zaDY0LmxvIGVsZjY0LmxvICRlbGYiIHRhcmdldF9zaXplPTY0IDs7Ci0gICAgYmZkX2VsZjY0X3NwYXJjX3ZlYykJdGI9IiR0YiBlbGY2NC1zcGFyYy5sbyBlbGZ4eC1zcGFyYy5sbyBlbGY2NC5sbyAkZWxmIjsgdGFyZ2V0X3NpemU9NjQgOzsKKyAgICBiZmRfZWxmNjRfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjY0LXNwYXJjLmxvIGVsZnh4LXNwYXJjLmxvIGVsZi12eHdvcmtzLmxvIGVsZjY0LmxvICRlbGYiOyB0YXJnZXRfc2l6ZT02NCA7OwogICAgIGJmZF9lbGY2NF90cmFkYmlnbWlwc192ZWMpCXRiPSIkdGIgZWxmNjQtbWlwcy5sbyBlbGY2NC5sbyBlbGZ4eC1taXBzLmxvIGVsZi12eHdvcmtzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIjsgdGFyZ2V0X3NpemU9NjQgOzsKICAgICBiZmRfZWxmNjRfdHJhZGxpdHRsZW1pcHNfdmVjKSB0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmeHgtbWlwcy5sbyBlbGYtdnh3b3Jrcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyI7IHRhcmdldF9zaXplPTY0IDs7CiAgICAgYmZkX2VsZjY0X3g4Nl82NF92ZWMpCXRiPSIkdGIgZWxmNjQteDg2LTY0LmxvIGVsZjY0LmxvICRlbGYiOyB0YXJnZXRfc2l6ZT02NCA7OwpAQCAtMTQ1MjUsNiArMTQ1MjYsMTEgQEAKIAogICAgICAgICAgIGFjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBkZWZhdWx0IgogCisKKworCisKKwogY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCiAjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKICMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQpAQCAtMTUyOTMsNiArMTUyOTksOSBAQAogcyxAYmZkX2ZpbGVfcHRyQCwkYmZkX2ZpbGVfcHRyLDt0IHQKIHMsQGJmZF91ZmlsZV9wdHJALCRiZmRfdWZpbGVfcHRyLDt0IHQKIHMsQHRkZWZhdWx0c0AsJHRkZWZhdWx0cyw7dCB0CitzLEBkYXRhcm9vdGRpckAsJGRhdGFyb290ZGlyLDt0IHQKK3MsQGRvY2RpckAsJGRvY2Rpciw7dCB0CitzLEBodG1sZGlyQCwkaHRtbGRpciw7dCB0CiBzLEBMSUJPQkpTQCwkTElCT0JKUyw7dCB0CiBzLEBMVExJQk9CSlNALCRMVExJQk9CSlMsO3QgdAogQ0VPRgpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5pbiBiL2JmZC9jb25maWd1cmUuaW4KaW5kZXggYmM4ZGFiYi4uMWYwZDJjYSAxMDA2NDQKLS0tIGEvYmZkL2NvbmZpZ3VyZS5pbgorKysgYi9iZmQvY29uZmlndXJlLmluCkBAIC04LDcgKzgsNyBAQAogQUNfQ0FOT05JQ0FMX1RBUkdFVAogQUNfSVNDX1BPU0lYCiAKLUFNX0lOSVRfQVVUT01BS0UoYmZkLCAyLjE2LjkxKQorQU1fSU5JVF9BVVRPTUFLRShiZmQsIDIuMTcuNTApCiAKIGRubCBUaGVzZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLCBiZWNhdXNlIGl0IG1heSB3YW50CiBkbmwgdG8gY2FsbCBBQ19DSEVDS19QUk9HLgpAQCAtNjcyLDcgKzY3Miw4IEBACiAgICAgYmZkX2VsZjMyX3NobGluX3ZlYykJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7CiAgICAgYmZkX2VsZjMyX3NobG5ic2RfdmVjKQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKICAgICBiZmRfZWxmMzJfc2huYnNkX3ZlYykJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NwYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1zcGFyYy5sbyBlbGZ4eC1zcGFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9zcGFyY192ZWMpCXRiPSIkdGIgZWxmMzItc3BhcmMubG8gZWxmeHgtc3BhcmMubG8gZWxmLXZ4d29ya3MubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfc3BhcmNfdnh3b3Jrc192ZWMpIHRiPSIkdGIgZWxmMzItc3BhcmMubG8gZWxmeHgtc3BhcmMubG8gZWxmLXZ4d29ya3MubG8gZWxmMzIubG8gJGVsZiIgOzsKICAgICBiZmRfZWxmMzJfdHJhZGJpZ21pcHNfdmVjKSAgdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZnh4LW1pcHMubG8gZWxmLXZ4d29ya3MubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7CiAgICAgYmZkX2VsZjMyX3RyYWRsaXR0bGVtaXBzX3ZlYykgdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZnh4LW1pcHMubG8gZWxmLXZ4d29ya3MubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7CiAgICAgYmZkX2VsZjMyX3VzX2NyaXNfdmVjKQl0Yj0iJHRiIGVsZjMyLWNyaXMubG8gZWxmMzIubG8gJGVsZiIgOzsKQEAgLTcwMyw3ICs3MDQsNyBAQAogICAgIGJmZF9lbGY2NF9zaDY0Ymxpbl92ZWMpCXRiPSIkdGIgZWxmNjQtc2g2NC5sbyBlbGY2NC5sbyAkZWxmIiB0YXJnZXRfc2l6ZT02NCA7OwogICAgIGJmZF9lbGY2NF9zaDY0bG5ic2RfdmVjKQl0Yj0iJHRiIGVsZjY0LXNoNjQubG8gZWxmNjQubG8gJGVsZiIgdGFyZ2V0X3NpemU9NjQgOzsKICAgICBiZmRfZWxmNjRfc2g2NG5ic2RfdmVjKQl0Yj0iJHRiIGVsZjY0LXNoNjQubG8gZWxmNjQubG8gJGVsZiIgdGFyZ2V0X3NpemU9NjQgOzsKLSAgICBiZmRfZWxmNjRfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjY0LXNwYXJjLmxvIGVsZnh4LXNwYXJjLmxvIGVsZjY0LmxvICRlbGYiOyB0YXJnZXRfc2l6ZT02NCA7OworICAgIGJmZF9lbGY2NF9zcGFyY192ZWMpCXRiPSIkdGIgZWxmNjQtc3BhcmMubG8gZWxmeHgtc3BhcmMubG8gZWxmLXZ4d29ya3MubG8gZWxmNjQubG8gJGVsZiI7IHRhcmdldF9zaXplPTY0IDs7CiAgICAgYmZkX2VsZjY0X3RyYWRiaWdtaXBzX3ZlYykJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZnh4LW1pcHMubG8gZWxmLXZ4d29ya3MubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iOyB0YXJnZXRfc2l6ZT02NCA7OwogICAgIGJmZF9lbGY2NF90cmFkbGl0dGxlbWlwc192ZWMpIHRiPSIkdGIgZWxmNjQtbWlwcy5sbyBlbGY2NC5sbyBlbGZ4eC1taXBzLmxvIGVsZi12eHdvcmtzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIjsgdGFyZ2V0X3NpemU9NjQgOzsKICAgICBiZmRfZWxmNjRfeDg2XzY0X3ZlYykJdGI9IiR0YiBlbGY2NC14ODYtNjQubG8gZWxmNjQubG8gJGVsZiI7IHRhcmdldF9zaXplPTY0IDs7CkBAIC05NjIsNSArOTYzLDExIEBACiBybSAtZiBkb2MvY29uZmlnLnN0YXR1cwogQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZSBkb2MvTWFrZWZpbGUgYmZkLWluMy5oOmJmZC1pbjIuaCBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluXSkKIEFDX0NPTkZJR19DT01NQU5EUyhbZGVmYXVsdF0sW1tzZWQgLWUgJy9TUkMtUE9URklMRVMgPS9yIHBvL1NSQy1QT1RGSUxFUycgLWUgJy9CTEQtUE9URklMRVMgPS9yIHBvL0JMRC1QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV1dLFtbXV0pCisKK2RubCBSZXF1aXJlZCBieSBodG1sIGFuZCBpbnN0YWxsLWh0bWwKK0FDX1NVQlNUKGRhdGFyb290ZGlyKQorQUNfU1VCU1QoZG9jZGlyKQorQUNfU1VCU1QoaHRtbGRpcikKKwogQUNfT1VUUFVUCiAKZGlmZiAtLWdpdCBhL2JmZC9kb2MvQ2hhbmdlTG9nIGIvYmZkL2RvYy9DaGFuZ2VMb2cKaW5kZXggZGQ5YjhiMC4uZDAwZmQ5OSAxMDA2NDQKLS0tIGEvYmZkL2RvYy9DaGFuZ2VMb2cKKysrIGIvYmZkL2RvYy9DaGFuZ2VMb2cKQEAgLTEsNCArMSwxMCBAQAotMjAwNi0wMi0yNyAgQ2FybG9zIE8nRG9uZWxsICA8Y2FybG9zQGNvZGVzb3VyY2VyeS5jb20KKzIwMDYtMDQtMDYgIENhcmxvcyBPJ0RvbmVsbCAgPGNhcmxvc0Bjb2Rlc291cmNlcnkuY29tPgorCisJKiBNYWtlZmlsZS5hbTogQWRkIGluc3RhbGwtaHRtbCBhbmQgaW5zdGFsbC1odG1sLWFtIHRhcmdldHMuIAorCURlZmluZSBkYXRhcm9vdGRpciwgZG9jZGlyIGFuZCBodG1sZGlyLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKKzIwMDYtMDItMjcgIENhcmxvcyBPJ0RvbmVsbCAgPGNhcmxvc0Bjb2Rlc291cmNlcnkuY29tPgogCiAJKiBNYWtlZmlsZS5hbTogQWRkIGh0bWwgdGFyZ2V0LgogCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCmRpZmYgLS1naXQgYS9iZmQvZG9jL01ha2VmaWxlLmFtIGIvYmZkL2RvYy9NYWtlZmlsZS5hbQppbmRleCA3YmVlMjZkLi42ZDIyMWZhIDEwMDY0NAotLS0gYS9iZmQvZG9jL01ha2VmaWxlLmFtCisrKyBiL2JmZC9kb2MvTWFrZWZpbGUuYW0KQEAgLTI4NywzICsyODcsMjggQEAKICMgV2Ugd2FudCBpbnN0YWxsIHRvIGltcGx5IGluc3RhbGwtaW5mbyBhcyBwZXIgR05VIHN0YW5kYXJkcywgZGVzcGl0ZSB0aGUKICMgY3lnbnVzIG9wdGlvbi4KIGluc3RhbGw6IGluc3RhbGwtaW5mbworCitodG1sX19zdHJpcF9kaXIgPSBgZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbTogJChIVE1MUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGh0bWxkaXIpIiB8fCAkKG1rZGlyX3ApICIkKERFU1RESVIpJChodG1sZGlyKSIKKwlAbGlzdD0nJChIVE1MUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCIgfHwgdGVzdCAtZCAiJCRwIjsgdGhlbiBkPSIiOyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZj0kKGh0bWxfX3N0cmlwX2RpcikgXAorCSAgaWYgdGVzdCAtZCAiJCRkJCRwIjsgdGhlbiBcCisJICAgIGVjaG8gIiAkKG1rZGlyX3ApICckKERFU1RESVIpJChodG1sZGlyKS8kJGYnIjsgXAorCSAgICAkKG1rZGlyX3ApICIkKERFU1RESVIpJChodG1sZGlyKS8kJGYiIHx8IGV4aXQgMTsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGQkJHAnLyogJyQoREVTVERJUikkKGh0bWxkaXIpLyQkZiciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAiJCRkJCRwIi8qICIkKERFU1RESVIpJChodG1sZGlyKS8kJGYiOyBcCisJICBlbHNlIFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRkJCRwJyAnJChERVNURElSKSQoaHRtbGRpcikvJCRmJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICIkJGQkJHAiICIkKERFU1RESVIpJChodG1sZGlyKS8kJGYiOyBcCisJICBmaTsgXAorCWRvbmUKKworCisKKwpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9NYWtlZmlsZS5pbiBiL2JmZC9kb2MvTWFrZWZpbGUuaW4KaW5kZXggZmE5MmU3MC4uYWQ4MTA2MSAxMDA2NDQKLS0tIGEvYmZkL2RvYy9NYWtlZmlsZS5pbgorKysgYi9iZmQvZG9jL01ha2VmaWxlLmluCkBAIC0xODEsNiArMTgxLDggQEAKIGJ1aWxkX29zID0gQGJ1aWxkX29zQAogYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKIGRhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKIGV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAogaG9zdCA9IEBob3N0QAogaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQApAQCAtMTg4LDYgKzE5MCw3IEBACiBob3N0X25vbmNhbm9uaWNhbCA9IEBob3N0X25vbmNhbm9uaWNhbEAKIGhvc3Rfb3MgPSBAaG9zdF9vc0AKIGhvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAogaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAogaW5mb2RpciA9IEBpbmZvZGlyQAogaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQApAQCAtMzEzLDYgKzMxNiw3IEBACiBDTEVBTkZJTEVTID0gKi5wICouaXAKIERJU1RDTEVBTkZJTEVTID0gYmZkLj8/IGJmZC4/Pz8gYmZkLmggbGliYmZkLmggbGliY29mZi5oIHRleHB1dC5sb2cKIE1BSU5UQUlORVJDTEVBTkZJTEVTID0gJChET0NGSUxFUykKK2h0bWxfX3N0cmlwX2RpciA9IGBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKIGFsbDogYWxsLWFtCiAKIC5TVUZGSVhFUzoKQEAgLTc2MSw2ICs3NjUsMjUgQEAKICMgV2Ugd2FudCBpbnN0YWxsIHRvIGltcGx5IGluc3RhbGwtaW5mbyBhcyBwZXIgR05VIHN0YW5kYXJkcywgZGVzcGl0ZSB0aGUKICMgY3lnbnVzIG9wdGlvbi4KIGluc3RhbGw6IGluc3RhbGwtaW5mbworCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06ICQoSFRNTFMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChodG1sZGlyKSIgfHwgJChta2Rpcl9wKSAiJChERVNURElSKSQoaHRtbGRpcikiCisJQGxpc3Q9JyQoSFRNTFMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiIHx8IHRlc3QgLWQgIiQkcCI7IHRoZW4gZD0iIjsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGY9JChodG1sX19zdHJpcF9kaXIpIFwKKwkgIGlmIHRlc3QgLWQgIiQkZCQkcCI7IHRoZW4gXAorCSAgICBlY2hvICIgJChta2Rpcl9wKSAnJChERVNURElSKSQoaHRtbGRpcikvJCRmJyI7IFwKKwkgICAgJChta2Rpcl9wKSAiJChERVNURElSKSQoaHRtbGRpcikvJCRmIiB8fCBleGl0IDE7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRkJCRwJy8qICckKERFU1RESVIpJChodG1sZGlyKS8kJGYnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZCQkcCIvKiAiJChERVNURElSKSQoaHRtbGRpcikvJCRmIjsgXAorCSAgZWxzZSBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZCQkcCcgJyQoREVTVERJUikkKGh0bWxkaXIpLyQkZiciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAiJCRkJCRwIiAiJChERVNURElSKSQoaHRtbGRpcikvJCRmIjsgXAorCSAgZmk7IFwKKwlkb25lCiAjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgogIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCiAuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iZmQvZWxmMzItYmZpbi5jIGIvYmZkL2VsZjMyLWJmaW4uYwppbmRleCAyMTlhODM0Li5kNWE4MWRiIDEwMDY0NAotLS0gYS9iZmQvZWxmMzItYmZpbi5jCisrKyBiL2JmZC9lbGYzMi1iZmluLmMKQEAgLTEyODQsOCArMTI4NCw4IEBACiAgIGNvbnN0IHN0cnVjdCBiZmluZmRwaWNfcmVsb2NzX2luZm8gKmVudHJ5ID0gZW50cnlfOwogCiAgIHJldHVybiAoZW50cnktPnN5bW5keCA9PSAtMQotCSAgPyBlbnRyeS0+ZC5oLT5yb290LnJvb3QuaGFzaAotCSAgOiBlbnRyeS0+c3ltbmR4ICsgZW50cnktPmQuYWJmZC0+aWQgKiAyNTcpICsgZW50cnktPmFkZGVuZDsKKwkgID8gKGxvbmcpIGVudHJ5LT5kLmgtPnJvb3Qucm9vdC5oYXNoCisJICA6IGVudHJ5LT5zeW1uZHggKyAobG9uZykgZW50cnktPmQuYWJmZC0+aWQgKiAyNTcpICsgZW50cnktPmFkZGVuZDsKIH0KIAogLyogVGVzdCB3aGV0aGVyIHRoZSBrZXkgZmllbGRzIG9mIHR3byBiZmluZmRwaWNfcmVsb2NzX2luZm8gZW50cmllcyBhcmUKQEAgLTMyNTMsNyArMzI1Myw2IEBACiAgIGZsYWd3b3JkIGZsYWdzLCBwbHRmbGFnczsKICAgYXNlY3Rpb24gKnM7CiAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmg7CiAgIGNvbnN0IHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CiAgIGludCBwdHJhbGlnbjsKICAgaW50IG9mZnNldDsKQEAgLTMzNDMsMjMgKzMzNDIsNiBAQAogICAgICAgZmxhZ3MgPSBCU0ZfR0xPQkFMIHwgQlNGX1dFQUs7CiAgICAgfQogCi0gIC8qIERlZmluZSBfZ3AgaW4gLnJvZml4dXAsIGZvciBGRFBJQywgb3IgLmdvdCBvdGhlcndpc2UuICBJZiBpdAotICAgICB0dXJucyBvdXQgdGhhdCB3ZSdyZSBsaW5raW5nIHdpdGggYSBkaWZmZXJlbnQgbGlua2VyIHNjcmlwdCwgdGhlCi0gICAgIGxpbmtlciBzY3JpcHQgd2lsbCBvdmVycmlkZSBpdC4gICovCi0gIGJoID0gTlVMTDsKLSAgaWYgKCEoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkoaW5mbywgYWJmZCwgIl9ncCIsIGZsYWdzLCBzLCBvZmZzZXQsIChjb25zdCBjaGFyICopIE5VTEwsIEZBTFNFLAotCSBiZWQtPmNvbGxlY3QsICZiaCkpKQotICAgIHJldHVybiBGQUxTRTsKLSAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBiaDsKLSAgaC0+ZGVmX3JlZ3VsYXIgPSAxOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLSAgLyogaC0+b3RoZXIgPSBTVFZfSElEREVOOyAqLyAvKiBTaG91bGQgd2U/ICAqLwotCi0gIC8qIE1hY2hpbmUtc3BlY2lmaWM6IHdlIHdhbnQgdGhlIHN5bWJvbCBmb3IgZXhlY3V0YWJsZXMgYXMgd2VsbC4gICovCi0gIGlmIChJU19GRFBJQyAoYWJmZCkgJiYgISBiZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0KICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1pMzg2LmMgYi9iZmQvZWxmMzItaTM4Ni5jCmluZGV4IGJjNDRjYmEuLjc1NGFhNTIgMTAwNjQ0Ci0tLSBhL2JmZC9lbGYzMi1pMzg2LmMKKysrIGIvYmZkL2VsZjMyLWkzODYuYwpAQCAtNTgyLDYgKzU4MiwxMCBAQAogI2RlZmluZSBHT1RfVExTX0lFX05FRwk2CiAjZGVmaW5lIEdPVF9UTFNfSUVfQk9USCA3CiAjZGVmaW5lIEdPVF9UTFNfR0RFU0MJOAorI2RlZmluZSBHT1RfVExTX01BU0sJMHgwZgorI2RlZmluZSBHT1RfVExTX0lFX0lFCTB4MTAKKyNkZWZpbmUgR09UX1RMU19JRV9HRAkweDIwCisjZGVmaW5lIEdPVF9UTFNfSUVfTUFTSwkweDMwCiAjZGVmaW5lIEdPVF9UTFNfR0RfQk9USF9QKHR5cGUpCQkJCQkJXAogICAoKHR5cGUpID09IChHT1RfVExTX0dEIHwgR09UX1RMU19HREVTQykpCiAjZGVmaW5lIEdPVF9UTFNfR0RfUCh0eXBlKQkJCQkJCVwKQEAgLTEwMDcsMTIgKzEwMTEsMjUgQEAKIAkgICAgICBjYXNlIFJfMzg2X1RMU19JRV8zMjoKIAkJaWYgKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IHJfdHlwZSkKIAkJICB0bHNfdHlwZSA9IEdPVF9UTFNfSUVfTkVHOworCQllbHNlIGlmIChoCisJCQkgJiYgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl8zODZfVExTX0dEKQorCQkgIC8qIElmIHRoaXMgaXMgYSBHRC0+SUUgdHJhbnNpdGlvbiwgd2UgbWF5IHVzZSBlaXRoZXIKKwkJICAgICBvZiBSXzM4Nl9UTFNfVFBPRkYgYW5kIFJfMzg2X1RMU19UUE9GRjMyLiAgQnV0IGlmCisJCSAgICAgd2UgbWF5IGhhdmUgYm90aCBSXzM4Nl9UTFNfSUUgYW5kIFJfMzg2X1RMU19HRCwKKwkJICAgICB3ZSBjYW4ndCBzaGFyZSB0aGUgc2FtZSBSXzM4Nl9UTFNfVFBPRkYgc2luY2UKKwkJICAgICB0aGV5IHJlcXVpcmUgZGlmZmVyZW50IG9mZnNldHMuIFNvIHdlIHJlbWVtYmVyCisJCSAgICAgaXQgY29tZXMgZnJvbSBSXzM4Nl9UTFNfR0QuICAqLworCQkgIHRsc190eXBlID0gR09UX1RMU19JRSB8IEdPVF9UTFNfSUVfR0Q7CiAJCWVsc2UKLQkJICAvKiBJZiB0aGlzIGlzIGEgR0QtPklFIHRyYW5zaXRpb24sIHdlIG1heSB1c2UgZWl0aGVyIG9mCi0JCSAgICAgUl8zODZfVExTX1RQT0ZGIGFuZCBSXzM4Nl9UTFNfVFBPRkYzMi4gICovCiAJCSAgdGxzX3R5cGUgPSBHT1RfVExTX0lFOwogCQlicmVhazsKIAkgICAgICBjYXNlIFJfMzg2X1RMU19JRToKKwkJaWYgKGgpCisJCSAgeworCQkgICAgLyogV2UgcmVtZW1iZXIgaXQgY29tZXMgZnJvbSBSXzM4Nl9UTFNfSUUuICAqLworCQkgICAgdGxzX3R5cGUgPSBHT1RfVExTX0lFX1BPUyB8IEdPVF9UTFNfSUVfSUU7CisJCSAgICBicmVhazsKKwkJICB9CiAJICAgICAgY2FzZSBSXzM4Nl9UTFNfR09USUU6CiAJCXRsc190eXBlID0gR09UX1RMU19JRV9QT1M7IGJyZWFrOwogCSAgICAgIH0KQEAgLTEwNTIsNyArMTA2OSw4IEBACiAJICAgICAgdGxzX3R5cGUgfD0gb2xkX3Rsc190eXBlOwogCSAgICAvKiBJZiBhIFRMUyBzeW1ib2wgaXMgYWNjZXNzZWQgdXNpbmcgSUUgYXQgbGVhc3Qgb25jZSwKIAkgICAgICAgdGhlcmUgaXMgbm8gcG9pbnQgdG8gdXNlIGR5bmFtaWMgbW9kZWwgZm9yIGl0LiAgKi8KLQkgICAgZWxzZSBpZiAob2xkX3Rsc190eXBlICE9IHRsc190eXBlICYmIG9sZF90bHNfdHlwZSAhPSBHT1RfVU5LTk9XTgorCSAgICBlbHNlIGlmIChvbGRfdGxzX3R5cGUgIT0gdGxzX3R5cGUKKwkJICAgICAmJiBvbGRfdGxzX3R5cGUgIT0gR09UX1VOS05PV04KIAkJICAgICAmJiAoISBHT1RfVExTX0dEX0FOWV9QIChvbGRfdGxzX3R5cGUpCiAJCQkgfHwgKHRsc190eXBlICYgR09UX1RMU19JRSkgPT0gMCkpCiAJICAgICAgewpAQCAtMTY4Miw2ICsxNzAwLDE0IEBACiAgICAgICBhc2VjdGlvbiAqczsKICAgICAgIGJmZF9ib29sZWFuIGR5bjsKICAgICAgIGludCB0bHNfdHlwZSA9IGVsZl9pMzg2X2hhc2hfZW50cnkoaCktPnRsc190eXBlOworICAgICAgCisgICAgICAvKiBJZiB3ZSBoYXZlIGJvdGggUl8zODZfVExTX0lFIGFuZCBSXzM4Nl9UTFNfR0QsIEdPVF9UTFNfSUVfQk9USAorCSBzaG91bGQgYmUgdXNlZC4gICovCisgICAgICBpZiAoKHRsc190eXBlICYgR09UX1RMU19JRV9NQVNLKQorCSAgPT0gKEdPVF9UTFNfSUVfSUUgfCBHT1RfVExTX0lFX0dEKSkKKwl0bHNfdHlwZSA9IEdPVF9UTFNfSUVfQk9USDsKKyAgICAgIGVsc2UKKwl0bHNfdHlwZSAmPSBHT1RfVExTX01BU0s7CiAKICAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4KIAkgVW5kZWZpbmVkIHdlYWsgc3ltcyB3b24ndCB5ZXQgYmUgbWFya2VkIGFzIGR5bmFtaWMuICAqLwpAQCAtMjY4NSw2ICsyNzExLDEzIEBACiAJICBlbHNlIGlmIChoICE9IE5VTEwpCiAJICAgIHsKIAkgICAgICB0bHNfdHlwZSA9IGVsZl9pMzg2X2hhc2hfZW50cnkoaCktPnRsc190eXBlOworCSAgICAgIC8qIElmIHdlIGhhdmUgYm90aCBSXzM4Nl9UTFNfSUUgYW5kIFJfMzg2X1RMU19HRCwKKwkJIEdPVF9UTFNfSUVfQk9USCBzaG91bGQgYmUgdXNlZC4gICovCisJICAgICAgaWYgKCh0bHNfdHlwZSAmIEdPVF9UTFNfSUVfTUFTSykKKwkJICA9PSAoR09UX1RMU19JRV9JRSB8IEdPVF9UTFNfSUVfR0QpKQorCQl0bHNfdHlwZSA9IEdPVF9UTFNfSUVfQk9USDsKKwkgICAgICBlbHNlCisJCXRsc190eXBlICY9IEdPVF9UTFNfTUFTSzsKIAkgICAgICBpZiAoIWluZm8tPnNoYXJlZCAmJiBoLT5keW5pbmR4ID09IC0xICYmICh0bHNfdHlwZSAmIEdPVF9UTFNfSUUpKQogCQlyX3R5cGUgPSBSXzM4Nl9UTFNfTEVfMzI7CiAJICAgIH0KZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tMzJjLmMgYi9iZmQvZWxmMzItbTMyYy5jCmluZGV4IGY1NmVmZDIuLjVlOWYzYWIgMTAwNjQ0Ci0tLSBhL2JmZC9lbGYzMi1tMzJjLmMKKysrIGIvYmZkL2VsZjMyLW0zMmMuYwpAQCAtNDgyLDYgKzQ4MiwyMiBAQAogCQlyZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKIAkJCSAgICAgICsgc3BsdC0+b3V0cHV0X29mZnNldAogCQkJICAgICAgKyAoKnBsdF9vZmZzZXQgJiAtMikpOworCQlpZiAobmFtZSkKKwkJeworCQkgIGNoYXIgKm5ld25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4obmFtZSkrNSk7CisJCSAgc3RyY3B5IChuZXduYW1lLCBuYW1lKTsKKwkJICBzdHJjYXQobmV3bmFtZSwgIi5wbHQiKTsKKwkJICBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKKwkJCQkJCSAgICBpbnB1dF9iZmQsCisJCQkJCQkgICAgbmV3bmFtZSwKKwkJCQkJCSAgICBCU0ZfRlVOQ1RJT04gfCBCU0ZfV0VBSywKKwkJCQkJCSAgICBzcGx0LAorCQkJCQkJICAgICgqcGx0X29mZnNldCAmIC0yKSwKKwkJCQkJCSAgICAwLAorCQkJCQkJICAgIDEsCisJCQkJCQkgICAgMCwKKwkJCQkJCSAgICAwKTsKKwkJfQogCSAgICAgIH0KIAkgIH0KIAkgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXNwYXJjLmMgYi9iZmQvZWxmMzItc3BhcmMuYwppbmRleCAwMzFiMzAzLi4zYmZiMzhhIDEwMDY0NAotLS0gYS9iZmQvZWxmMzItc3BhcmMuYworKysgYi9iZmQvZWxmMzItc3BhcmMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgImVsZi9zcGFyYy5oIgogI2luY2x1ZGUgIm9wY29kZS9zcGFyYy5oIgogI2luY2x1ZGUgImVsZnh4LXNwYXJjLmgiCisjaW5jbHVkZSAiZWxmLXZ4d29ya3MuaCIKIAogLyogU3VwcG9ydCBmb3IgY29yZSBkdW1wIE5PVEUgc2VjdGlvbnMuICAqLwogCkBAIC0yMTUsMyArMjE2LDY4IEBACiAjZGVmaW5lIGVsZl9iYWNrZW5kX3JlbGFfbm9ybWFsIDEKIAogI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgorCisvKiBBIHdyYXBwZXIgYXJvdW5kIF9iZmRfc3BhcmNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgdGhhdCBpZGVudGlmaWVzCisgICB0aGUgdGFyZ2V0IHN5c3RlbSBhcyBWeFdvcmtzLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKK2VsZjMyX3NwYXJjX3Z4d29ya3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYmZkICphYmZkKQoreworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqcmV0OworCisgIHJldCA9IF9iZmRfc3BhcmNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpOworICBpZiAocmV0KQorICAgIHsKKyAgICAgIHN0cnVjdCBfYmZkX3NwYXJjX2VsZl9saW5rX2hhc2hfdGFibGUgKmh0YWI7CisKKyAgICAgIGh0YWIgPSAoc3RydWN0IF9iZmRfc3BhcmNfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSByZXQ7CisgICAgICBodGFiLT5pc192eHdvcmtzID0gMTsKKyAgICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8qIEEgZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rIHRoYXQgZG9lcyBib3RoIHRoZSBTUEFSQy0gYW5kIFZ4V29ya3MtCisgICBzcGVjaWZpYyBoYW5kbGluZy4gICovCisKK3N0YXRpYyB2b2lkCitlbGYzMl9zcGFyY192eHdvcmtzX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGJmZCAqYWJmZCwgYmZkX2Jvb2xlYW4gbGlua2VyKQoreworICBlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpOworICBlbGZfdnh3b3Jrc19maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpOworfQorCisjdW5kZWYgVEFSR0VUX0JJR19TWU0KKyNkZWZpbmUgVEFSR0VUX0JJR19TWU0JYmZkX2VsZjMyX3NwYXJjX3Z4d29ya3NfdmVjCisjdW5kZWYgVEFSR0VUX0JJR19OQU1FCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkiZWxmMzItc3BhcmMtdnh3b3JrcyIKKworI3VuZGVmIEVMRl9NSU5QQUdFU0laRQorI2RlZmluZSBFTEZfTUlOUEFHRVNJWkUJMHgxMDAwCisKKyN1bmRlZiBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKKyAgZWxmMzJfc3BhcmNfdnh3b3Jrc19saW5rX2hhc2hfdGFibGVfY3JlYXRlCisKKyN1bmRlZiBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQKKyNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0CQkxCisjdW5kZWYgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5CisjZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seQkJMQorI3VuZGVmIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQorI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJCTEyCisjdW5kZWYgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayBcCisgIGVsZl92eHdvcmtzX2FkZF9zeW1ib2xfaG9vaworI3VuZGVmIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIFwKKyAgZWxmX3Z4d29ya3NfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKKyN1bmRlZiBlbGZfYmFja2VuZF9lbWl0X3JlbG9jcworI2RlZmluZSBlbGZfYmFja2VuZF9lbWl0X3JlbG9jcyBcCisgIGVsZl92eHdvcmtzX2VtaXRfcmVsb2NzCisjdW5kZWYgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZworI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKKyAgZWxmMzJfc3BhcmNfdnh3b3Jrc19maW5hbF93cml0ZV9wcm9jZXNzaW5nCisKKyN1bmRlZiBlbGYzMl9iZWQKKyNkZWZpbmUgZWxmMzJfYmVkCQkJCXNwYXJjX2VsZl92eHdvcmtzX2JlZAorCisjaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzIteHRlbnNhLmMgYi9iZmQvZWxmMzIteHRlbnNhLmMKaW5kZXggNGRjZTBlYS4uN2E0MWQ2MiAxMDA2NDQKLS0tIGEvYmZkL2VsZjMyLXh0ZW5zYS5jCisrKyBiL2JmZC9lbGYzMi14dGVuc2EuYwpAQCAtNTc2Niw3ICs1NzY2LDggQEAKIHN0YXRpYyBiZmRfYm9vbGVhbiBjb21wdXRlX2ViYl9wcm9wb3NlZF9hY3Rpb25zIChlYmJfY29uc3RyYWludCAqKTsKIHN0YXRpYyBiZmRfYm9vbGVhbiBjb21wdXRlX2ViYl9hY3Rpb25zIChlYmJfY29uc3RyYWludCAqKTsKIHN0YXRpYyBiZmRfYm9vbGVhbiBjaGVja19zZWN0aW9uX2ViYl9wY3JlbHNfZml0Ci0gIChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgY29uc3QgZWJiX2NvbnN0cmFpbnQgKik7CisgIChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgY29uc3QgZWJiX2NvbnN0cmFpbnQgKiwKKyAgIGNvbnN0IHh0ZW5zYV9vcGNvZGUgKik7CiBzdGF0aWMgYmZkX2Jvb2xlYW4gY2hlY2tfc2VjdGlvbl9lYmJfcmVkdWNlcyAoY29uc3QgZWJiX2NvbnN0cmFpbnQgKik7CiBzdGF0aWMgdm9pZCB0ZXh0X2FjdGlvbl9hZGRfcHJvcG9zZWQKICAgKHRleHRfYWN0aW9uX2xpc3QgKiwgY29uc3QgZWJiX2NvbnN0cmFpbnQgKiwgYXNlY3Rpb24gKik7CkBAIC02MzAyLDYgKzYzMDMsMjQgQEAKIH0KIAogCitzdGF0aWMgeHRlbnNhX29wY29kZSAqCitidWlsZF9yZWxvY19vcGNvZGVzIChiZmQgKmFiZmQsCisJCSAgICAgYXNlY3Rpb24gKnNlYywKKwkJICAgICBiZmRfYnl0ZSAqY29udGVudHMsCisJCSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcykKK3sKKyAgdW5zaWduZWQgaTsKKyAgeHRlbnNhX29wY29kZSAqcmVsb2Nfb3Bjb2RlcyA9CisgICAgKHh0ZW5zYV9vcGNvZGUgKikgYmZkX21hbGxvYyAoc2l6ZW9mICh4dGVuc2Ffb3Bjb2RlKSAqIHNlYy0+cmVsb2NfY291bnQpOworICBmb3IgKGkgPSAwOyBpIDwgc2VjLT5yZWxvY19jb3VudDsgaSsrKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsID0gJmludGVybmFsX3JlbG9jc1tpXTsKKyAgICAgIHJlbG9jX29wY29kZXNbaV0gPSBnZXRfcmVsb2NhdGlvbl9vcGNvZGUgKGFiZmQsIHNlYywgY29udGVudHMsIGlyZWwpOworICAgIH0KKyAgcmV0dXJuIHJlbG9jX29wY29kZXM7Cit9CisKKwogLyogVGhlIGNvbXB1dGVfdGV4dF9hY3Rpb25zIGZ1bmN0aW9uIHdpbGwgYnVpbGQgYSBsaXN0IG9mIHBvdGVudGlhbAogICAgdHJhbnNmb3JtYXRpb24gYWN0aW9ucyBmb3IgY29kZSBpbiB0aGUgZXh0ZW5kZWQgYmFzaWMgYmxvY2sgb2YgZWFjaAogICAgbG9uZ2NhbGwgdGhhdCBpcyBvcHRpbWl6ZWQgdG8gYSBkaXJlY3QgY2FsbC4gIEZyb20gdGhpcyBsaXN0IHdlCkBAIC02MzE4LDYgKzYzMzcsNyBAQAogCQkgICAgICBhc2VjdGlvbiAqc2VjLAogCQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKQogeworICB4dGVuc2Ffb3Bjb2RlICpyZWxvY19vcGNvZGVzID0gTlVMTDsKICAgeHRlbnNhX3JlbGF4X2luZm8gKnJlbGF4X2luZm87CiAgIGJmZF9ieXRlICpjb250ZW50czsKICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKQEAgLTY0MjMsMTEgKzY0NDMsMTcgQEAKICAgICAgIGViYi0+c3RhcnRfcmVsb2NfaWR4ID0gaTsKICAgICAgIGViYi0+ZW5kX3JlbG9jX2lkeCA9IGk7CiAKKyAgICAgIC8qIFByZWNvbXB1dGUgdGhlIG9wY29kZSBmb3IgZWFjaCByZWxvY2F0aW9uLiAgKi8KKyAgICAgIGlmIChyZWxvY19vcGNvZGVzID09IE5VTEwpCisJcmVsb2Nfb3Bjb2RlcyA9IGJ1aWxkX3JlbG9jX29wY29kZXMgKGFiZmQsIHNlYywgY29udGVudHMsCisJCQkJCSAgICAgaW50ZXJuYWxfcmVsb2NzKTsKKwogICAgICAgaWYgKCFleHRlbmRfZWJiX2JvdW5kcyAoZWJiKQogCSAgfHwgIWNvbXB1dGVfZWJiX3Byb3Bvc2VkX2FjdGlvbnMgKCZlYmJfdGFibGUpCiAJICB8fCAhY29tcHV0ZV9lYmJfYWN0aW9ucyAoJmViYl90YWJsZSkKIAkgIHx8ICFjaGVja19zZWN0aW9uX2ViYl9wY3JlbHNfZml0IChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgaW50ZXJuYWxfcmVsb2NzLCAmZWJiX3RhYmxlKQorCQkJCQkgICAgaW50ZXJuYWxfcmVsb2NzLCAmZWJiX3RhYmxlLAorCQkJCQkgICAgcmVsb2Nfb3Bjb2RlcykKIAkgIHx8ICFjaGVja19zZWN0aW9uX2ViYl9yZWR1Y2VzICgmZWJiX3RhYmxlKSkKIAl7CiAJICAvKiBJZiBhbnl0aGluZyBnb2VzIHdyb25nIG9yIHdlIGdldCB1bmx1Y2t5IGFuZCBzb21ldGhpbmcgZG9lcwpAQCAtNjQ1OSw2ICs2NDg1LDggQEAKICAgcmVsZWFzZV9pbnRlcm5hbF9yZWxvY3MgKHNlYywgaW50ZXJuYWxfcmVsb2NzKTsKICAgaWYgKHByb3BfdGFibGUpCiAgICAgZnJlZSAocHJvcF90YWJsZSk7CisgIGlmIChyZWxvY19vcGNvZGVzKQorICAgIGZyZWUgKHJlbG9jX29wY29kZXMpOwogCiAgIHJldHVybiBvazsKIH0KQEAgLTcwMjYsNyArNzA1NCw4IEBACiAJCQkgICAgICBhc2VjdGlvbiAqc2VjLAogCQkJICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAogCQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcywKLQkJCSAgICAgIGNvbnN0IGViYl9jb25zdHJhaW50ICpjb25zdHJhaW50KQorCQkJICAgICAgY29uc3QgZWJiX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJCQkgICAgICBjb25zdCB4dGVuc2Ffb3Bjb2RlICpyZWxvY19vcGNvZGVzKQogewogICB1bnNpZ25lZCBpLCBqOwogICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbDsKQEAgLTcxMTcsNyArNzE0NiwxMCBAQAogCSAgeHRlbnNhX29wY29kZSBvcGNvZGU7CiAJICBpbnQgb3BudW07CiAKLQkgIG9wY29kZSA9IGdldF9yZWxvY2F0aW9uX29wY29kZSAoYWJmZCwgc2VjLCBjb250ZW50cywgaXJlbCk7CisJICBpZiAocmVsb2Nfb3Bjb2RlcykKKwkgICAgb3Bjb2RlID0gcmVsb2Nfb3Bjb2Rlc1tpXTsKKwkgIGVsc2UKKwkgICAgb3Bjb2RlID0gZ2V0X3JlbG9jYXRpb25fb3Bjb2RlIChhYmZkLCBzZWMsIGNvbnRlbnRzLCBpcmVsKTsKIAkgIGlmIChvcGNvZGUgPT0gWFRFTlNBX1VOREVGSU5FRCkKIAkgICAgewogCSAgICAgIG9rID0gRkFMU0U7CkBAIC03ODE0LDcgKzc4NDYsNyBAQAogICByZWxvY3NfZml0ID0gY2hlY2tfc2VjdGlvbl9lYmJfcGNyZWxzX2ZpdCAodGFyZ2V0X3NlYy0+b3duZXIsIHRhcmdldF9zZWMsIAogCQkJCQkgICAgIHRhcmdldF9zZWNfY2FjaGUtPmNvbnRlbnRzLAogCQkJCQkgICAgIHRhcmdldF9zZWNfY2FjaGUtPnJlbG9jcywKLQkJCQkJICAgICAmZWJiX3RhYmxlKTsKKwkJCQkJICAgICAmZWJiX3RhYmxlLCBOVUxMKTsKIAogICBpZiAoIXJlbG9jc19maXQpIAogICAgIHJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1ocHBhLmMgYi9iZmQvZWxmNjQtaHBwYS5jCmluZGV4IDRlMGI4M2MuLjU4Nzk4YWUgMTAwNjQ0Ci0tLSBhL2JmZC9lbGY2NC1ocHBhLmMKKysrIGIvYmZkL2VsZjY0LWhwcGEuYwpAQCAtMjU0Miw2ICsyNTQyLDY4IEBACiAgIHJldHVybiBUUlVFOwogfQogCisvKiBTdXBwb3J0IGZvciBjb3JlIGR1bXAgTk9URSBzZWN0aW9ucy4gICovCisKK3N0YXRpYyBiZmRfYm9vbGVhbgorZWxmNjRfaHBwYV9ncm9rX3Byc3RhdHVzIChiZmQgKmFiZmQsIEVsZl9JbnRlcm5hbF9Ob3RlICpub3RlKQoreworICBpbnQgb2Zmc2V0OworICBzaXplX3Qgc2l6ZTsKKworICBzd2l0Y2ggKG5vdGUtPmRlc2NzeikKKyAgICB7CisgICAgICBkZWZhdWx0OgorCXJldHVybiBGQUxTRTsKKworICAgICAgY2FzZSA3NjA6CQkvKiBMaW51eC9ocHBhICovCisJLyogcHJfY3Vyc2lnICovCisJZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWwgPSBiZmRfZ2V0XzE2IChhYmZkLCBub3RlLT5kZXNjZGF0YSArIDEyKTsKKworCS8qIHByX3BpZCAqLworCWVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkID0gYmZkX2dldF8zMiAoYWJmZCwgbm90ZS0+ZGVzY2RhdGEgKyAzMik7CisKKwkvKiBwcl9yZWcgKi8KKwlvZmZzZXQgPSAxMTI7CisJc2l6ZSA9IDY0MDsKKworCWJyZWFrOworICAgIH0KKworICAvKiBNYWtlIGEgIi5yZWcvOTk5IiBzZWN0aW9uLiAgKi8KKyAgcmV0dXJuIF9iZmRfZWxmY29yZV9tYWtlX3BzZXVkb3NlY3Rpb24gKGFiZmQsICIucmVnIiwKKwkJCQkJICBzaXplLCBub3RlLT5kZXNjcG9zICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGJmZF9ib29sZWFuCitlbGY2NF9ocHBhX2dyb2tfcHNpbmZvIChiZmQgKmFiZmQsIEVsZl9JbnRlcm5hbF9Ob3RlICpub3RlKQoreworICBjaGFyICogY29tbWFuZDsKKyAgaW50IG47CisKKyAgc3dpdGNoIChub3RlLT5kZXNjc3opCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBjYXNlIDEzNjoJCS8qIExpbnV4L2hwcGEgZWxmX3BycHNpbmZvLiAgKi8KKyAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcHJvZ3JhbQorCT0gX2JmZF9lbGZjb3JlX3N0cm5kdXAgKGFiZmQsIG5vdGUtPmRlc2NkYXRhICsgNDAsIDE2KTsKKyAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfY29tbWFuZAorCT0gX2JmZF9lbGZjb3JlX3N0cm5kdXAgKGFiZmQsIG5vdGUtPmRlc2NkYXRhICsgNTYsIDgwKTsKKyAgICB9CisKKyAgLyogTm90ZSB0aGF0IGZvciBzb21lIHJlYXNvbiwgYSBzcHVyaW91cyBzcGFjZSBpcyB0YWNrZWQKKyAgICAgb250byB0aGUgZW5kIG9mIHRoZSBhcmdzIGluIHNvbWUgKGF0IGxlYXN0IG9uZSBhbnl3YXkpCisgICAgIGltcGxlbWVudGF0aW9ucywgc28gc3RyaXAgaXQgb2ZmIGlmIGl0IGV4aXN0cy4gICovCisgIGNvbW1hbmQgPSBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2NvbW1hbmQ7CisgIG4gPSBzdHJsZW4gKGNvbW1hbmQpOworCisgIGlmICgwIDwgbiAmJiBjb21tYW5kW24gLSAxXSA9PSAnICcpCisgICAgY29tbWFuZFtuIC0gMV0gPSAnXDAnOworCisgIHJldHVybiBUUlVFOworfQorCiAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHBoZHJzIHdlIHdpbGwgbmVlZC4KIAogICAgVGhlIGdlbmVyaWMgRUxGIGNvZGUgb25seSBjcmVhdGVzIFBUX1BIRFJzIGZvciBleGVjdXRhYmxlcy4gIFRoZSBIUApAQCAtMjc3NSw3ICsyODM3LDkgQEAKIAkJCQkJZWxmNjRfaHBwYV9maW5pc2hfZHluYW1pY19zeW1ib2wKICNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAogCQkJCQllbGY2NF9ocHBhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0KKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ3Jva19wcnN0YXR1cwllbGY2NF9ocHBhX2dyb2tfcHJzdGF0dXMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ3Jva19wc2luZm8JCWVsZjY0X2hwcGFfZ3Jva19wc2luZm8KKyAKIC8qIFN0dWZmIGZvciB0aGUgQkZEIGxpbmtlcjogKi8KICNkZWZpbmUgYmZkX2VsZjY0X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKIAllbGY2NF9ocHBhX2hhc2hfdGFibGVfY3JlYXRlCmRpZmYgLS1naXQgYS9iZmQvZWxmY29kZS5oIGIvYmZkL2VsZmNvZGUuaAppbmRleCBmN2Y4NWJhLi45YmI2NmUxIDEwMDY0NAotLS0gYS9iZmQvZWxmY29kZS5oCisrKyBiL2JmZC9lbGZjb2RlLmgKQEAgLTc0Miw5ICs3NDIsMTggQEAKICAgICAgIGlmIChpX2VoZHJwLT5lX3Noc3RybmR4ID49IGVsZl9udW1zZWN0aW9ucyAoYWJmZCkKIAkgIHx8IChpX2VoZHJwLT5lX3Noc3RybmR4ID49IFNITl9MT1JFU0VSVkUKIAkgICAgICAmJiBpX2VoZHJwLT5lX3Noc3RybmR4IDw9IFNITl9ISVJFU0VSVkUpKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKKwl7CisJICAvKiBQUiAyMjU3OgorCSAgICAgV2UgdXNlZCB0byBqdXN0IGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvciBoZXJlCisJICAgICBidXQgdGhlcmUgYXJlIGJpbmFyaWVzIGluIGV4aXN0YW5jZSBmb3Igd2hpY2ggdGhpcyB0ZXN0CisJICAgICB3aWxsIHByZXZlbnQgdGhlIGJpbnV0aWxzIGZyb20gd29ya2luZyB3aXRoIHRoZW0gYXQgYWxsLgorCSAgICAgU28gd2UgYXJlIGtpbmQsIGFuZCByZXNldCB0aGUgc3RyaW5nIGluZGV4IHZhbHVlIHRvIDAKKwkgICAgIHNvIHRoYXQgYXQgbGVhc3Qgc29tZSBwcm9jZXNzaW5nIGNhbiBiZSBkb25lLiAgKi8KKwkgIGlfZWhkcnAtPmVfc2hzdHJuZHggPSBTSE5fVU5ERUY7CisJICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIndhcm5pbmc6ICVzIGhhcyBhIGNvcnJ1cHQgc3RyaW5nIHRhYmxlIGluZGV4IC0gaWdub3JpbmciKSwgYWJmZC0+ZmlsZW5hbWUpOworCX0KICAgICB9Ci0gIGVsc2UgaWYgKGlfZWhkcnAtPmVfc2hzdHJuZHggIT0gMCkKKyAgZWxzZSBpZiAoaV9laGRycC0+ZV9zaHN0cm5keCAhPSBTSE5fVU5ERUYpCiAgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwogCiAgIC8qIFJlYWQgaW4gdGhlIHByb2dyYW0gaGVhZGVycy4gICovCmRpZmYgLS1naXQgYS9iZmQvZWxmbGluay5jIGIvYmZkL2VsZmxpbmsuYwppbmRleCA4OGU1NmRhLi4wOTAwMjIwIDEwMDY0NAotLS0gYS9iZmQvZWxmbGluay5jCisrKyBiL2JmZC9lbGZsaW5rLmMKQEAgLTg4OSw2ICs4ODksMjYgQEAKIAkgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCiAJICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbik7CiAKKyAgLyogV2hlbiB3ZSB0cnkgdG8gY3JlYXRlIGEgZGVmYXVsdCBpbmRpcmVjdCBzeW1ib2wgZnJvbSB0aGUgZHluYW1pYworICAgICBkZWZpbml0aW9uIHdpdGggdGhlIGRlZmF1bHQgdmVyc2lvbiwgd2Ugc2tpcCBpdCBpZiBpdHMgdHlwZSBhbmQKKyAgICAgdGhlIHR5cGUgb2YgZXhpc3RpbmcgcmVndWxhciBkZWZpbml0aW9uIG1pc21hdGNoLiAgV2Ugb25seSBkbyBpdAorICAgICBpZiB0aGUgZXhpc3RpbmcgcmVndWxhciBkZWZpbml0aW9uIHdvbid0IGJlIGR5bmFtaWMuICAqLworICBpZiAocG9sZF9hbGlnbm1lbnQgPT0gTlVMTAorICAgICAgJiYgIWluZm8tPnNoYXJlZAorICAgICAgJiYgIWluZm8tPmV4cG9ydF9keW5hbWljCisgICAgICAmJiAhaC0+cmVmX2R5bmFtaWMKKyAgICAgICYmIG5ld2R5bgorICAgICAgJiYgbmV3ZGVmCisgICAgICAmJiAhb2xkZHluCisgICAgICAmJiAob2xkZGVmIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKKyAgICAgICYmIEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IGgtPnR5cGUKKyAgICAgICYmIEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9OT1RZUEUKKyAgICAgICYmIGgtPnR5cGUgIT0gU1RUX05PVFlQRSkKKyAgICB7CisgICAgICAqc2tpcCA9IFRSVUU7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKICAgLyogQ2hlY2sgVExTIHN5bWJvbC4gIFdlIGRvbid0IGNoZWNrIHVuZGVmaW5lZCBzeW1ib2wgaW50cm9kdWNlZCBieQogICAgICAibGQgLXUiLiAgKi8KICAgaWYgKChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfVExTIHx8IGgtPnR5cGUgPT0gU1RUX1RMUykKQEAgLTYxODQsNiArNjIwNCwyNCBAQAogICByZXR1cm4gVFJVRTsKIH0KIAorLyogUmV0dXJuIFRSVUUgaWYgdGhlIGR5bmFtaWMgc3ltYm9sIFNZTSBpbiBBQkZEIGlzIHN1cHBvcnRlZC4gICovCisKK3N0YXRpYyBiZmRfYm9vbGVhbgorY2hlY2tfZHluc3ltIChiZmQgKmFiZmQsIEVsZl9JbnRlcm5hbF9TeW0gKnN5bSkKK3sKKyAgaWYgKHN5bS0+c3Rfc2huZHggPiBTSE5fSElSRVNFUlZFKQorICAgIHsKKyAgICAgIC8qIFRoZSBnQUJJIGRvZXNuJ3Qgc3VwcG9ydCBkeW5hbWljIHN5bWJvbHMgaW4gb3V0cHV0IHNlY3Rpb25zCisgICAgICAgICBiZXlvbmQgNjRrLiAgKi8KKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlQjogVG9vIG1hbnkgc2VjdGlvbnM6ICVkICg+PSAlZCkiKSwKKwkgYWJmZCwgYmZkX2NvdW50X3NlY3Rpb25zIChhYmZkKSwgU0hOX0xPUkVTRVJWRSk7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCiAvKiBGb3IgRFNPcyBsb2FkZWQgaW4gdmlhIGEgRFRfTkVFREVEIGVudHJ5LCBlbXVsYXRlIGxkLnNvIGluCiAgICBhbGxvd2luZyBhbiB1bnNhdGlzZmllZCB1bnZlcnNpb25lZCBzeW1ib2wgaW4gdGhlIERTTyB0byBtYXRjaCBhCiAgICB2ZXJzaW9uZWQgc3ltYm9sIHRoYXQgd291bGQgbm9ybWFsbHkgcmVxdWlyZSBhbiBleHBsaWNpdCB2ZXJzaW9uLgpAQCAtNjYxNiw2ICs2NjU0LDExIEBACiAKICAgICAgIHN5bS5zdF9uYW1lID0gaC0+ZHluc3RyX2luZGV4OwogICAgICAgZXN5bSA9IGZpbmZvLT5keW5zeW1fc2VjLT5jb250ZW50cyArIGgtPmR5bmluZHggKiBiZWQtPnMtPnNpemVvZl9zeW07CisgICAgICBpZiAoISBjaGVja19keW5zeW0gKGZpbmZvLT5vdXRwdXRfYmZkLCAmc3ltKSkKKwl7CisJICBlb2luZm8tPmZhaWxlZCA9IFRSVUU7CisJICByZXR1cm4gRkFMU0U7CisJfQogICAgICAgYmVkLT5zLT5zd2FwX3N5bWJvbF9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCAmc3ltLCBlc3ltLCAwKTsKIAogICAgICAgYnVja2V0Y291bnQgPSBlbGZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5idWNrZXRjb3VudDsKQEAgLTgyOTMsNiArODMzNiw4IEBACiAJICAgICAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKIAkgICAgICBCRkRfQVNTRVJUIChpbmR4ID4gMCk7CiAJICAgICAgc3ltLnN0X3NobmR4ID0gaW5keDsKKwkgICAgICBpZiAoISBjaGVja19keW5zeW0gKGFiZmQsICZzeW0pKQorCQlyZXR1cm4gRkFMU0U7CiAJICAgICAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwogCSAgICAgIGRlc3QgPSBkeW5zeW0gKyBkeW5pbmR4ICogYmVkLT5zLT5zaXplb2Zfc3ltOwogCSAgICAgIGlmIChsYXN0X2xvY2FsIDwgZHluaW5keCkKQEAgLTgzMjcsNiArODM3Miw4IEBACiAKIAkJICBzeW0uc3Rfc2huZHggPQogCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAocy0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2lkeDsKKwkJICBpZiAoISBjaGVja19keW5zeW0gKGFiZmQsICZzeW0pKQorCQkgICAgcmV0dXJuIEZBTFNFOwogCQkgIHN5bS5zdF92YWx1ZSA9IChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCiAJCQkJICArIHMtPm91dHB1dF9vZmZzZXQKIAkJCQkgICsgZS0+aXN5bS5zdF92YWx1ZSk7CmRpZmYgLS1naXQgYS9iZmQvZWxmeHgtaWE2NC5jIGIvYmZkL2VsZnh4LWlhNjQuYwppbmRleCBmMGJiMGZhLi42YjMyNTdhIDEwMDY0NAotLS0gYS9iZmQvZWxmeHgtaWE2NC5jCisrKyBiL2JmZC9lbGZ4eC1pYTY0LmMKQEAgLTgwLDkgKzgwLDYgQEAKICAgLyogVGhlIGFkZGVuZCBmb3Igd2hpY2ggdGhpcyBlbnRyeSBpcyByZWxldmFudC4gICovCiAgIGJmZF92bWEgYWRkZW5kOwogCi0gIC8qIE5leHQgYWRkZW5kIGluIHRoZSBsaXN0LiAgKi8KLSAgc3RydWN0IGVsZk5OX2lhNjRfZHluX3N5bV9pbmZvICpuZXh0OwotCiAgIGJmZF92bWEgZ290X29mZnNldDsKICAgYmZkX3ZtYSBmcHRyX29mZnNldDsKICAgYmZkX3ZtYSBwbHRvZmZfb2Zmc2V0OwpAQCAtMTMzLDYgKzEzMCwxMyBAQAogewogICBpbnQgaWQ7CiAgIHVuc2lnbmVkIGludCByX3N5bTsKKyAgLyogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyBhcnJheS4gICovCisgIHVuc2lnbmVkIGludCBjb3VudDsKKyAgLyogVGhlIG51bWJlciBvZiBzb3J0ZWQgZWxlbWVudHMgaW4gZWxmTk5faWE2NF9keW5fc3ltX2luZm8gYXJyYXkuICAqLworICB1bnNpZ25lZCBpbnQgc29ydGVkX2NvdW50OworICAvKiBUaGUgc2l6ZSBvZiBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyBhcnJheS4gICovCisgIHVuc2lnbmVkIGludCBzaXplOworICAvKiBUaGUgYXJyYXkgb2YgZWxmTk5faWE2NF9keW5fc3ltX2luZm8uICAqLwogICBzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX2luZm8gKmluZm87CiAKICAgLyogVFJVRSBpZiB0aGlzIGhhc2ggZW50cnkncyBhZGRlbmRzIHdhcyB0cmFuc2xhdGVkIGZvcgpAQCAtMTQzLDYgKzE0NywxMyBAQAogc3RydWN0IGVsZk5OX2lhNjRfbGlua19oYXNoX2VudHJ5CiB7CiAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7CisgIC8qIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gZWxmTk5faWE2NF9keW5fc3ltX2luZm8gYXJyYXkuICAqLworICB1bnNpZ25lZCBpbnQgY291bnQ7CisgIC8qIFRoZSBudW1iZXIgb2Ygc29ydGVkIGVsZW1lbnRzIGluIGVsZk5OX2lhNjRfZHluX3N5bV9pbmZvIGFycmF5LiAgKi8KKyAgdW5zaWduZWQgaW50IHNvcnRlZF9jb3VudDsKKyAgLyogVGhlIHNpemUgb2YgZWxmTk5faWE2NF9keW5fc3ltX2luZm8gYXJyYXkuICAqLworICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgLyogVGhlIGFycmF5IG9mIGVsZk5OX2lhNjRfZHluX3N5bV9pbmZvLiAgKi8KICAgc3RydWN0IGVsZk5OX2lhNjRfZHluX3N5bV9pbmZvICppbmZvOwogfTsKIApAQCAtODUyLDYgKzg2MywxMiBAQAogICBiZmRfcHV0bDY0ICh0MCwgaGl0X2FkZHIpOwogICBiZmRfcHV0bDY0ICh0MSwgaGl0X2FkZHIgKyA4KTsKIH0KKworLyogUmVuYW1lIHNvbWUgb2YgdGhlIGdlbmVyaWMgc2VjdGlvbiBmbGFncyB0byBiZXR0ZXIgZG9jdW1lbnQgaG93IHRoZXkKKyAgIGFyZSB1c2VkIGhlcmUuICAqLworI2RlZmluZSBza2lwX3JlbGF4X3Bhc3NfMCBuZWVkX2ZpbmFsaXplX3JlbGF4CisjZGVmaW5lIHNraXBfcmVsYXhfcGFzc18xIGhhc19ncF9yZWxvYworCiAMCiAvKiBUaGVzZSBmdW5jdGlvbnMgZG8gcmVsYXhhdGlvbiBmb3IgSUEtNjQgRUxGLiAgKi8KIApAQCAtODgwLDYgKzg5Nyw4IEBACiAgIGJmZF9ib29sZWFuIGNoYW5nZWRfY29udGVudHMgPSBGQUxTRTsKICAgYmZkX2Jvb2xlYW4gY2hhbmdlZF9yZWxvY3MgPSBGQUxTRTsKICAgYmZkX2Jvb2xlYW4gY2hhbmdlZF9nb3QgPSBGQUxTRTsKKyAgYmZkX2Jvb2xlYW4gc2tpcF9yZWxheF9wYXNzXzAgPSBUUlVFOworICBiZmRfYm9vbGVhbiBza2lwX3JlbGF4X3Bhc3NfMSA9IFRSVUU7CiAgIGJmZF92bWEgZ3AgPSAwOwogCiAgIC8qIEFzc3VtZSB3ZSdyZSBub3QgZ29pbmcgdG8gY2hhbmdlIGFueSBzaXplcywgYW5kIHdlJ2xsIG9ubHkgbmVlZApAQCAtODkxLDExICs5MTAsMTEgQEAKICAgICByZXR1cm4gRkFMU0U7CiAKICAgLyogTm90aGluZyB0byBkbyBpZiB0aGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMgb3IgdGhlcmUgaXMgbm8gbmVlZCBmb3IKLSAgICAgdGhlIHJlbGF4IGZpbmFsaXplIHBhc3MuICAqLworICAgICB0aGUgY3VycmVudCBwYXNzLiAgKi8KICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCiAgICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDAKLSAgICAgIHx8ICghbGlua19pbmZvLT5uZWVkX3JlbGF4X2ZpbmFsaXplCi0JICAmJiBzZWMtPm5lZWRfZmluYWxpemVfcmVsYXggPT0gMCkpCisgICAgICB8fCAobGlua19pbmZvLT5yZWxheF9wYXNzID09IDAgJiYgc2VjLT5za2lwX3JlbGF4X3Bhc3NfMCkKKyAgICAgIHx8IChsaW5rX2luZm8tPnJlbGF4X3Bhc3MgPT0gMSAmJiBzZWMtPnNraXBfcmVsYXhfcGFzc18xKSkKICAgICByZXR1cm4gVFJVRTsKIAogICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CkBAIC05MzYsMjAgKzk1NSwxOSBAQAogCWNhc2UgUl9JQTY0X1BDUkVMMjFCSToKIAljYXNlIFJfSUE2NF9QQ1JFTDIxTToKIAljYXNlIFJfSUE2NF9QQ1JFTDIxRjoKLQkgIC8qIEluIHRoZSBmaW5hbGl6ZSBwYXNzLCBhbGwgYnIgcmVsYXhhdGlvbnMgYXJlIGRvbmUuIFdlIGNhbgotCSAgICAgc2tpcCBpdC4gKi8KLQkgIGlmICghbGlua19pbmZvLT5uZWVkX3JlbGF4X2ZpbmFsaXplKQorCSAgLyogSW4gcGFzcyAxLCBhbGwgYnIgcmVsYXhhdGlvbnMgYXJlIGRvbmUuIFdlIGNhbiBza2lwIGl0LiAqLworCSAgaWYgKGxpbmtfaW5mby0+cmVsYXhfcGFzcyA9PSAxKQogCSAgICBjb250aW51ZTsKKwkgIHNraXBfcmVsYXhfcGFzc18wID0gRkFMU0U7CiAJICBpc19icmFuY2ggPSBUUlVFOwogCSAgYnJlYWs7CiAKIAljYXNlIFJfSUE2NF9QQ1JFTDYwQjoKLQkgIC8qIFdlIGNhbid0IG9wdGltaXplIGJybCB0byBiciBiZWZvcmUgdGhlIGZpbmFsaXplIHBhc3Mgc2luY2UKLQkgICAgIGJyIHJlbGF4YXRpb25zIHdpbGwgaW5jcmVhc2UgdGhlIGNvZGUgc2l6ZS4gRGVmZXIgaXQgdG8KLQkgICAgIHRoZSBmaW5hbGl6ZSBwYXNzLiAgKi8KLQkgIGlmIChsaW5rX2luZm8tPm5lZWRfcmVsYXhfZmluYWxpemUpCisJICAvKiBXZSBjYW4ndCBvcHRpbWl6ZSBicmwgdG8gYnIgaW4gcGFzcyAwIHNpbmNlIGJyIHJlbGF4YXRpb25zCisJICAgICB3aWxsIGluY3JlYXNlIHRoZSBjb2RlIHNpemUuIERlZmVyIGl0IHRvIHBhc3MgMS4gICovCisJICBpZiAobGlua19pbmZvLT5yZWxheF9wYXNzID09IDApCiAJICAgIHsKLQkgICAgICBzZWMtPm5lZWRfZmluYWxpemVfcmVsYXggPSAxOworCSAgICAgIHNraXBfcmVsYXhfcGFzc18xID0gRkFMU0U7CiAJICAgICAgY29udGludWU7CiAJICAgIH0KIAkgIGlzX2JyYW5jaCA9IFRSVUU7CkBAIC05NTcsMTIgKzk3NSwxMSBAQAogCiAJY2FzZSBSX0lBNjRfTFRPRkYyMlg6CiAJY2FzZSBSX0lBNjRfTERYTU9WOgotCSAgLyogV2UgY2FuJ3QgcmVsYXggbGR4L21vdiBiZWZvcmUgdGhlIGZpbmFsaXplIHBhc3Mgc2luY2UKLQkgICAgIGJyIHJlbGF4YXRpb25zIHdpbGwgaW5jcmVhc2UgdGhlIGNvZGUgc2l6ZS4gRGVmZXIgaXQgdG8KLQkgICAgIHRoZSBmaW5hbGl6ZSBwYXNzLiAgKi8KLQkgIGlmIChsaW5rX2luZm8tPm5lZWRfcmVsYXhfZmluYWxpemUpCisJICAvKiBXZSBjYW4ndCByZWxheCBsZHgvbW92IGluIHBhc3MgMCBzaW5jZSBiciByZWxheGF0aW9ucyB3aWxsCisJICAgICBpbmNyZWFzZSB0aGUgY29kZSBzaXplLiBEZWZlciBpdCB0byBwYXNzIDEuICAqLworCSAgaWYgKGxpbmtfaW5mby0+cmVsYXhfcGFzcyA9PSAwKQogCSAgICB7Ci0JICAgICAgc2VjLT5uZWVkX2ZpbmFsaXplX3JlbGF4ID0gMTsKKwkgICAgICBza2lwX3JlbGF4X3Bhc3NfMSA9IEZBTFNFOwogCSAgICAgIGNvbnRpbnVlOwogCSAgICB9CiAJICBpc19icmFuY2ggPSBGQUxTRTsKQEAgLTEzNTIsOCArMTM2OSwxMiBAQAogCX0KICAgICB9CiAKLSAgaWYgKCFsaW5rX2luZm8tPm5lZWRfcmVsYXhfZmluYWxpemUpCi0gICAgc2VjLT5uZWVkX2ZpbmFsaXplX3JlbGF4ID0gMDsKKyAgaWYgKGxpbmtfaW5mby0+cmVsYXhfcGFzcyA9PSAwKQorICAgIHsKKyAgICAgIC8qIFBhc3MgMCBpcyBvbmx5IG5lZWRlZCB0byByZWxheCBici4gICovCisgICAgICBzZWMtPnNraXBfcmVsYXhfcGFzc18wID0gc2tpcF9yZWxheF9wYXNzXzA7CisgICAgICBzZWMtPnNraXBfcmVsYXhfcGFzc18xID0gc2tpcF9yZWxheF9wYXNzXzE7CisgICAgfQogCiAgICphZ2FpbiA9IGNoYW5nZWRfY29udGVudHMgfHwgY2hhbmdlZF9yZWxvY3M7CiAgIHJldHVybiBUUlVFOwpAQCAtMTM2OSw2ICsxMzkwLDggQEAKICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwogICByZXR1cm4gRkFMU0U7CiB9CisjdW5kZWYgc2tpcF9yZWxheF9wYXNzXzAKKyN1bmRlZiBza2lwX3JlbGF4X3Bhc3NfMQogCiBzdGF0aWMgdm9pZAogZWxmTk5faWE2NF9yZWxheF9sZHhtb3YgKGNvbnRlbnRzLCBvZmYpCkBAIC0xNzk5LDYgKzE4MjIsOSBAQAogCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwogCiAgIHJldC0+aW5mbyA9IE5VTEw7CisgIHJldC0+Y291bnQgPSAwOworICByZXQtPnNvcnRlZF9jb3VudCA9IDA7CisgIHJldC0+c2l6ZSA9IDA7CiAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKIH0KIApAQCAtMTgyOSwxNiArMTg1NSwyNSBAQAogICBpZiAoaW5kLT5pbmZvICE9IE5VTEwpCiAgICAgewogICAgICAgc3RydWN0IGVsZk5OX2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAgICAgIHN0cnVjdCBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyAqKnBkeW47CisgICAgICB1bnNpZ25lZCBpbnQgY291bnQ7CiAKLSAgICAgIHBkeW4gPSAmZGlyLT5pbmZvOwotICAgICAgd2hpbGUgKChkeW5faSA9ICpwZHluKSAhPSBOVUxMKQotCXBkeW4gPSAmZHluX2ktPm5leHQ7Ci0gICAgICAqcGR5biA9IGR5bl9pID0gaW5kLT5pbmZvOworICAgICAgaWYgKGRpci0+aW5mbykKKwlmcmVlIChkaXItPmluZm8pOworCisgICAgICBkaXItPmluZm8gPSBpbmQtPmluZm87CisgICAgICBkaXItPmNvdW50ID0gaW5kLT5jb3VudDsKKyAgICAgIGRpci0+c29ydGVkX2NvdW50ID0gaW5kLT5zb3J0ZWRfY291bnQ7CisgICAgICBkaXItPnNpemUgPSBpbmQtPnNpemU7CisKICAgICAgIGluZC0+aW5mbyA9IE5VTEw7CisgICAgICBpbmQtPmNvdW50ID0gMDsKKyAgICAgIGluZC0+c29ydGVkX2NvdW50ID0gMDsKKyAgICAgIGluZC0+c2l6ZSA9IDA7CiAKICAgICAgIC8qIEZpeCB1cCB0aGUgZHluX3N5bV9pbmZvIHBvaW50ZXJzIHRvIHRoZSBnbG9iYWwgc3ltYm9sLiAgKi8KLSAgICAgIGZvciAoOyBkeW5faTsgZHluX2kgPSBkeW5faS0+bmV4dCkKKyAgICAgIGZvciAoY291bnQgPSBkaXItPmNvdW50LCBkeW5faSA9IGRpci0+aW5mbzsKKwkgICBjb3VudCAhPSAwOworCSAgIGNvdW50LS0sIGR5bl9pKyspCiAJZHluX2ktPmggPSAmZGlyLT5yb290OwogICAgIH0KIApAQCAtMTg2NCwxMiArMTg5OSwxNSBAQAogewogICBzdHJ1Y3QgZWxmTk5faWE2NF9saW5rX2hhc2hfZW50cnkgKmg7CiAgIHN0cnVjdCBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2k7CisgIHVuc2lnbmVkIGludCBjb3VudDsKIAogICBoID0gKHN0cnVjdCBlbGZOTl9pYTY0X2xpbmtfaGFzaF9lbnRyeSAqKXhoOwogCiAgIF9iZmRfZWxmX2xpbmtfaGFzaF9oaWRlX3N5bWJvbCAoaW5mbywgJmgtPnJvb3QsIGZvcmNlX2xvY2FsKTsKIAotICBmb3IgKGR5bl9pID0gaC0+aW5mbzsgZHluX2k7IGR5bl9pID0gZHluX2ktPm5leHQpCisgIGZvciAoY291bnQgPSBoLT5jb3VudCwgZHluX2kgPSBoLT5pbmZvOworICAgICAgIGNvdW50ICE9IDA7CisgICAgICAgY291bnQtLSwgZHluX2krKykKICAgICB7CiAgICAgICBkeW5faS0+d2FudF9wbHQyID0gMDsKICAgICAgIGR5bl9pLT53YW50X3BsdCA9IDA7CkBAIC0xOTM3LDYgKzE5NzUsNTEgQEAKICAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKIH0KIAorLyogRnJlZSB0aGUgZ2xvYmFsIGVsZk5OX2lhNjRfZHluX3N5bV9pbmZvIGFycmF5LiAgKi8KKworc3RhdGljIGJmZF9ib29sZWFuCitlbGZOTl9pYTY0X2dsb2JhbF9keW5faW5mb19mcmVlICh2b2lkICoqeGVudHJ5LAorCQkJCVBUUiB1bnVzZWQgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgc3RydWN0IGVsZk5OX2lhNjRfbGlua19oYXNoX2VudHJ5ICplbnRyeQorICAgID0gKHN0cnVjdCBlbGZOTl9pYTY0X2xpbmtfaGFzaF9lbnRyeSAqKSB4ZW50cnk7CisKKyAgaWYgKGVudHJ5LT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCisgICAgZW50cnkgPSAoc3RydWN0IGVsZk5OX2lhNjRfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5LT5yb290LnJvb3QudS5pLmxpbms7CisKKyAgaWYgKGVudHJ5LT5pbmZvKQorICAgIHsKKyAgICAgIGZyZWUgKGVudHJ5LT5pbmZvKTsKKyAgICAgIGVudHJ5LT5pbmZvID0gTlVMTDsKKyAgICAgIGVudHJ5LT5jb3VudCA9IDA7CisgICAgICBlbnRyeS0+c29ydGVkX2NvdW50ID0gMDsKKyAgICAgIGVudHJ5LT5zaXplID0gMDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEZyZWUgdGhlIGxvY2FsIGVsZk5OX2lhNjRfZHluX3N5bV9pbmZvIGFycmF5LiAgKi8KKworc3RhdGljIGJmZF9ib29sZWFuCitlbGZOTl9pYTY0X2xvY2FsX2R5bl9pbmZvX2ZyZWUgKHZvaWQgKipzbG90LAorCQkJCVBUUiB1bnVzZWQgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgc3RydWN0IGVsZk5OX2lhNjRfbG9jYWxfaGFzaF9lbnRyeSAqZW50cnkKKyAgICA9IChzdHJ1Y3QgZWxmTk5faWE2NF9sb2NhbF9oYXNoX2VudHJ5ICopICpzbG90OworCisgIGlmIChlbnRyeS0+aW5mbykKKyAgICB7CisgICAgICBmcmVlIChlbnRyeS0+aW5mbyk7CisgICAgICBlbnRyeS0+aW5mbyA9IE5VTEw7CisgICAgICBlbnRyeS0+Y291bnQgPSAwOworICAgICAgZW50cnktPnNvcnRlZF9jb3VudCA9IDA7CisgICAgICBlbnRyeS0+c2l6ZSA9IDA7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCiAvKiBEZXN0cm95IElBLTY0IGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KIAogc3RhdGljIHZvaWQKQEAgLTE5NDYsOSArMjAyOSwxNSBAQAogICBzdHJ1Y3QgZWxmTk5faWE2NF9saW5rX2hhc2hfdGFibGUgKmlhNjRfaW5mbwogICAgID0gKHN0cnVjdCBlbGZOTl9pYTY0X2xpbmtfaGFzaF90YWJsZSAqKSBoYXNoOwogICBpZiAoaWE2NF9pbmZvLT5sb2NfaGFzaF90YWJsZSkKLSAgICBodGFiX2RlbGV0ZSAoaWE2NF9pbmZvLT5sb2NfaGFzaF90YWJsZSk7CisgICAgeworICAgICAgaHRhYl90cmF2ZXJzZSAoaWE2NF9pbmZvLT5sb2NfaGFzaF90YWJsZSwKKwkJICAgICBlbGZOTl9pYTY0X2xvY2FsX2R5bl9pbmZvX2ZyZWUsIE5VTEwpOworICAgICAgaHRhYl9kZWxldGUgKGlhNjRfaW5mby0+bG9jX2hhc2hfdGFibGUpOworICAgIH0KICAgaWYgKGlhNjRfaW5mby0+bG9jX2hhc2hfbWVtb3J5KQogICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgaWE2NF9pbmZvLT5sb2NfaGFzaF9tZW1vcnkpOworICBlbGZfbGlua19oYXNoX3RyYXZlcnNlICgmaWE2NF9pbmZvLT5yb290LAorCQkJICBlbGZOTl9pYTY0X2dsb2JhbF9keW5faW5mb19mcmVlLCBOVUxMKTsKICAgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9mcmVlIChoYXNoKTsKIH0KIApAQCAtMTk3MCwxMSArMjA1OSwxNCBAQAogICBzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX3RyYXZlcnNlX2RhdGEgKmRhdGEKICAgICA9IChzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX3RyYXZlcnNlX2RhdGEgKikgeGRhdGE7CiAgIHN0cnVjdCBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2k7CisgIHVuc2lnbmVkIGludCBjb3VudDsKIAogICBpZiAoZW50cnktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKICAgICBlbnRyeSA9IChzdHJ1Y3QgZWxmTk5faWE2NF9saW5rX2hhc2hfZW50cnkgKikgZW50cnktPnJvb3Qucm9vdC51LmkubGluazsKIAotICBmb3IgKGR5bl9pID0gZW50cnktPmluZm87IGR5bl9pOyBkeW5faSA9IGR5bl9pLT5uZXh0KQorICBmb3IgKGNvdW50ID0gZW50cnktPmNvdW50LCBkeW5faSA9IGVudHJ5LT5pbmZvOworICAgICAgIGNvdW50ICE9IDA7CisgICAgICAgY291bnQtLSwgZHluX2krKykKICAgICBpZiAoISAoKmRhdGEtPmZ1bmMpIChkeW5faSwgZGF0YS0+ZGF0YSkpCiAgICAgICByZXR1cm4gRkFMU0U7CiAgIHJldHVybiBUUlVFOwpAQCAtMTk5MCwxMSArMjA4MiwxNCBAQAogICBzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX3RyYXZlcnNlX2RhdGEgKmRhdGEKICAgICA9IChzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX3RyYXZlcnNlX2RhdGEgKikgeGRhdGE7CiAgIHN0cnVjdCBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2k7CisgIHVuc2lnbmVkIGludCBjb3VudDsKIAotICBmb3IgKGR5bl9pID0gZW50cnktPmluZm87IGR5bl9pOyBkeW5faSA9IGR5bl9pLT5uZXh0KQorICBmb3IgKGNvdW50ID0gZW50cnktPmNvdW50LCBkeW5faSA9IGVudHJ5LT5pbmZvOworICAgICAgIGNvdW50ICE9IDA7CisgICAgICAgY291bnQtLSwgZHluX2krKykKICAgICBpZiAoISAoKmRhdGEtPmZ1bmMpIChkeW5faSwgZGF0YS0+ZGF0YSkpCi0gICAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7CisgICAgICByZXR1cm4gRkFMU0U7CisgIHJldHVybiBUUlVFOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjEwMyw4ICsyMTk4LDEyOSBAQAogICByZXR1cm4gcmV0OwogfQogCisvKiBVc2VkIHRvIHNvcnQgZWxmTk5faWE2NF9keW5fc3ltX2luZm8gYXJyYXkuICAqLworCitzdGF0aWMgaW50CithZGRlbmRfY29tcGFyZSAoY29uc3Qgdm9pZCAqeHAsIGNvbnN0IHZvaWQgKnlwKQoreworICBjb25zdCBzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX2luZm8gKngKKyAgICA9IChjb25zdCBzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX2luZm8gKikgeHA7CisgIGNvbnN0IHN0cnVjdCBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyAqeQorICAgID0gKGNvbnN0IHN0cnVjdCBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyAqKSB5cDsKKworICByZXR1cm4geC0+YWRkZW5kIC0geS0+YWRkZW5kOworfQorCisvKiBTb3J0IGVsZk5OX2lhNjRfZHluX3N5bV9pbmZvIGFycmF5IGFuZCByZW1vdmUgZHVwbGljYXRlcy4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NvcnRfZHluX3N5bV9pbmZvIChzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX2luZm8gKmluZm8sCisJCSAgIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKyAgYmZkX3ZtYSBjdXJyLCBwcmV2OworICB1bnNpZ25lZCBpbnQgaSwgZHVwLCBkaWZmLCBkZXN0LCBzcmMsIGxlbjsKKworICBxc29ydCAoaW5mbywgY291bnQsIHNpemVvZiAoKmluZm8pLCBhZGRlbmRfY29tcGFyZSk7CisKKyAgLyogRmluZCB0aGUgZmlyc3QgZHVwbGljYXRlLiAgKi8KKyAgcHJldiA9IGluZm8gWzBdLmFkZGVuZDsKKyAgZm9yIChpID0gMTsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgY3VyciA9IGluZm8gW2ldLmFkZGVuZDsKKyAgICAgIGlmIChjdXJyID09IHByZXYpCisJYnJlYWs7CisgICAgICBwcmV2ID0gY3VycjsKKyAgICB9CisKKyAgLyogUmVtb3ZlIGR1cGxpY2F0ZXMuICAqLworICBpZiAoaSA8IGNvdW50KQorICAgIHsKKyAgICAgIC8qIFdlIG5lZWQgdG8gbW92ZSBhIGJsb2NrIG9mIGVsZW1lbnRzIHRvIGhlcmUuICAqLworICAgICAgZGVzdCA9IGkrKzsKKyAgICAgIHdoaWxlIChpIDwgY291bnQpCisJeworCSAgY3VyciA9IGluZm8gW2ldLmFkZGVuZDsKKworCSAgLyogTW92ZSBhIGJsb2NrIG9mIGVsZW1lbnRzIHdob3NlIGZpcnN0IG9uZSBpcyBkaWZmZXJlbnQgZnJvbQorCSAgICAgdGhlIHByZXZpb3VzLiAgKi8KKwkgIGlmIChjdXJyID09IHByZXYpCisJICAgIHsKKwkgICAgICBmb3IgKHNyYyA9IGkgKyAxOyBzcmMgPCBjb3VudDsgc3JjKyspCisJCWlmIChpbmZvIFtzcmNdLmFkZGVuZCAhPSBjdXJyKQorCQkgIGJyZWFrOworCSAgICB9CisJICBlbHNlCisJICAgIHNyYyA9IGk7CisKKwkgIGlmIChzcmMgPj0gY291bnQpCisJICAgIGJyZWFrOworCisJICAvKiBGaW5kIHRoZSBuZXh0IGR1cGxpY2F0ZS4gICovCisJICBwcmV2ID0gaW5mbyBbc3JjXS5hZGRlbmQ7CisJICBmb3IgKGR1cCA9IHNyYyArIDE7IGR1cCA8IGNvdW50OyBkdXArKykKKwkgICAgeworCSAgICAgIGN1cnIgPSBpbmZvIFtkdXBdLmFkZGVuZDsKKwkgICAgICBpZiAoY3VyciA9PSBwcmV2KQorCQlicmVhazsKKwkgICAgICBwcmV2ID0gY3VycjsKKwkgICAgfQorCisJICAvKiBIb3cgbXVjaCB0byBtb3ZlLiAgKi8KKwkgIGxlbiA9IGR1cCAtIHNyYzsKKwkgIGkgPSBkdXAgKyAxOworCisJICBpZiAobGVuID09IDEgJiYgZHVwIDwgY291bnQpCisJICAgIHsKKwkgICAgICAvKiBJZiB3ZSBvbmx5IG1vdmUgMSBlbGVtZW50LCB3ZSBjb21iaW5lIGl0IHdpdGggdGhlIG5leHQKKwkJIG9uZS4gIEZpbmQgdGhlIG5leHQgZGlmZmVyZW50IG9uZS4gICovCisJICAgICAgZm9yIChkaWZmID0gZHVwICsgMSwgc3JjKys7IGRpZmYgPCBjb3VudDsgZGlmZisrLCBzcmMrKykKKwkJaWYgKGluZm8gW2RpZmZdLmFkZGVuZCAhPSBjdXJyKQorCQkgIGJyZWFrOworCisJICAgICAgaWYgKGRpZmYgPCBjb3VudCkKKwkJeworCQkgIC8qIEZpbmQgdGhlIG5leHQgZHVwbGljYXRlLiAgKi8KKwkJICBwcmV2ID0gaW5mbyBbZGlmZl0uYWRkZW5kOworCQkgIGZvciAoZHVwID0gZGlmZiArIDE7IGR1cCA8IGNvdW50OyBkdXArKykKKwkJICAgIHsKKwkJICAgICAgY3VyciA9IGluZm8gW2R1cF0uYWRkZW5kOworCQkgICAgICBpZiAoY3VyciA9PSBwcmV2KQorCQkJYnJlYWs7CisJCSAgICAgIHByZXYgPSBjdXJyOworCQkgICAgICBkaWZmKys7CisJCSAgICB9CisKKwkJICBsZW4gPSBkaWZmIC0gc3JjICsgMTsKKwkJICBpID0gZGlmZiArIDE7CisJCX0KKwkgICAgfQorCisJICBtZW1tb3ZlICgmaW5mbyBbZGVzdF0sICZpbmZvIFtzcmNdLCBsZW4gKiBzaXplb2YgKCppbmZvKSk7CisKKwkgIGRlc3QgKz0gbGVuOworCX0KKworICAgICAgY291bnQgPSBkZXN0OworICAgIH0KKworICByZXR1cm4gY291bnQ7Cit9CisKIC8qIEZpbmQgYW5kL29yIGNyZWF0ZSBhIGRlc2NyaXB0b3IgZm9yIGR5bmFtaWMgc3ltYm9sIGluZm8uICBUaGlzIHdpbGwKLSAgIHZhcnkgYmFzZWQgb24gZ2xvYmFsIG9yIGxvY2FsIHN5bWJvbCwgYW5kIHRoZSBhZGRlbmQgdG8gdGhlIHJlbG9jLiAgKi8KKyAgIHZhcnkgYmFzZWQgb24gZ2xvYmFsIG9yIGxvY2FsIHN5bWJvbCwgYW5kIHRoZSBhZGRlbmQgdG8gdGhlIHJlbG9jLgorCisgICBXZSBkb24ndCBzb3J0IHdoZW4gaW5zZXJ0aW5nLiAgQWxzbywgd2Ugc29ydCBhbmQgZWxpbWluYXRlCisgICBkdXBsaWNhdGVzIGlmIHRoZXJlIGlzIGFuIHVuc29ydGVkIHNlY3Rpb24uICBUeXBpY2FsbHksIHRoaXMgd2lsbAorICAgb25seSBoYXBwZW4gb25jZSwgYmVjYXVzZSB3ZSBkbyBhbGwgaW5zZXJ0aW9ucyBiZWZvcmUgbG9va3Vwcy4gIFdlCisgICB0aGVuIHVzZSBic2VhcmNoIHRvIGRvIGEgbG9va3VwLiAgVGhpcyBhbHNvIGFsbG93cyBsb29rdXBzIHRvIGJlCisgICBmYXN0LiAgU28gd2UgaGF2ZSBmYXN0IGluc2VydGlvbiAoTyhsb2cgTikgZHVlIHRvIGR1cGxpY2F0ZSBjaGVjayksCisgICBmYXN0IGxvb2t1cCAoTyhsb2cgTikpIGFuZCBvbmUgc29ydCAoTyhOIGxvZyBOKSBleHBlY3RlZCB0aW1lKS4KKyAgIFByZXZpb3VzbHksIGFsbCBsb29rdXBzIHdlcmUgTyhOKSBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIGxpbmtlZAorICAgbGlzdCBhbmQgYWxzbyBhbGwgaW5zZXJ0aW9ucyB3ZXJlIE8oTikgYmVjYXVzZSBvZiB0aGUgY2hlY2sgZm9yCisgICBkdXBsaWNhdGVzLiAgVGhlcmUgYXJlIHNvbWUgY29tcGxpY2F0aW9ucyBoZXJlIGJlY2F1c2UgdGhlIGFycmF5CisgICBzaXplIGdyb3dzIG9jY2FzaW9uYWxseSwgd2hpY2ggbWF5IGFkZCBhbiBPKE4pIGZhY3RvciwgYnV0IHRoaXMKKyAgIHNob3VsZCBiZSByYXJlLiAgQWxzbywgIHdlIGZyZWUgdGhlIGV4Y2VzcyBhcnJheSBhbGxvY2F0aW9uLCB3aGljaAorICAgcmVxdWlyZXMgYSBjb3B5IHdoaWNoIGlzIE8oTiksIGJ1dCB0aGlzIG9ubHkgaGFwcGVucyBvbmNlLiAgKi8KIAogc3RhdGljIHN0cnVjdCBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyAqCiBnZXRfZHluX3N5bV9pbmZvIChpYTY0X2luZm8sIGgsIGFiZmQsIHJlbCwgY3JlYXRlKQpAQCAtMjExNCwxMiArMjMzMCwyMiBAQAogICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwogICAgICBiZmRfYm9vbGVhbiBjcmVhdGU7CiB7Ci0gIHN0cnVjdCBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyAqKnBwOwotICBzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX2luZm8gKmR5bl9pOworICBzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX2luZm8gKippbmZvX3AsICppbmZvLCAqZHluX2ksIGtleTsKKyAgdW5zaWduZWQgaW50ICpjb3VudF9wLCAqc29ydGVkX2NvdW50X3AsICpzaXplX3A7CisgIHVuc2lnbmVkIGludCBjb3VudCwgc29ydGVkX2NvdW50LCBzaXplOwogICBiZmRfdm1hIGFkZGVuZCA9IHJlbCA/IHJlbC0+cl9hZGRlbmQgOiAwOworICBiZmRfc2l6ZV90eXBlIGFtdDsKIAogICBpZiAoaCkKLSAgICBwcCA9ICYoKHN0cnVjdCBlbGZOTl9pYTY0X2xpbmtfaGFzaF9lbnRyeSAqKWgpLT5pbmZvOworICAgIHsKKyAgICAgIHN0cnVjdCBlbGZOTl9pYTY0X2xpbmtfaGFzaF9lbnRyeSAqZ2xvYmFsX2g7CisKKyAgICAgIGdsb2JhbF9oID0gKHN0cnVjdCBlbGZOTl9pYTY0X2xpbmtfaGFzaF9lbnRyeSAqKSBoOworICAgICAgaW5mb19wID0gJmdsb2JhbF9oLT5pbmZvOworICAgICAgY291bnRfcCA9ICZnbG9iYWxfaC0+Y291bnQ7CisgICAgICBzb3J0ZWRfY291bnRfcCA9ICZnbG9iYWxfaC0+c29ydGVkX2NvdW50OworICAgICAgc2l6ZV9wID0gJmdsb2JhbF9oLT5zaXplOworICAgIH0KICAgZWxzZQogICAgIHsKICAgICAgIHN0cnVjdCBlbGZOTl9pYTY0X2xvY2FsX2hhc2hfZW50cnkgKmxvY19oOwpAQCAtMjEzMSwxOCArMjM1NywxMDcgQEAKIAkgIHJldHVybiBOVUxMOwogCX0KIAotICAgICAgcHAgPSAmbG9jX2gtPmluZm87CisgICAgICBpbmZvX3AgPSAmbG9jX2gtPmluZm87CisgICAgICBjb3VudF9wID0gJmxvY19oLT5jb3VudDsKKyAgICAgIHNvcnRlZF9jb3VudF9wID0gJmxvY19oLT5zb3J0ZWRfY291bnQ7CisgICAgICBzaXplX3AgPSAmbG9jX2gtPnNpemU7CiAgICAgfQogCi0gIGZvciAoZHluX2kgPSAqcHA7IGR5bl9pICYmIGR5bl9pLT5hZGRlbmQgIT0gYWRkZW5kOyBkeW5faSA9ICpwcCkKLSAgICBwcCA9ICZkeW5faS0+bmV4dDsKLQotICBpZiAoZHluX2kgPT0gTlVMTCAmJiBjcmVhdGUpCisgIGNvdW50ID0gKmNvdW50X3A7CisgIHNvcnRlZF9jb3VudCA9ICpzb3J0ZWRfY291bnRfcDsKKyAgc2l6ZSA9ICpzaXplX3A7CisgIGluZm8gPSAqaW5mb19wOworICBpZiAoY3JlYXRlKQogICAgIHsKLSAgICAgIGR5bl9pID0gKChzdHJ1Y3QgZWxmTk5faWE2NF9keW5fc3ltX2luZm8gKikKLQkgICAgICAgYmZkX3phbGxvYyAoYWJmZCwgKGJmZF9zaXplX3R5cGUpIHNpemVvZiAqZHluX2kpKTsKLSAgICAgICpwcCA9IGR5bl9pOworICAgICAgLyogV2hlbiB3ZSBjcmVhdGUgdGhlIGFycmF5LCB3ZSBkb24ndCBjaGVjayBmb3IgZHVwbGljYXRlcywKKyAgICAgICAgIGV4Y2VwdCBpbiB0aGUgcHJldmlvdXNseSBzb3J0ZWQgc2VjdGlvbiBpZiBvbmUgZXhpc3RzLCBhbmQKKwkgYWdhaW5zdCB0aGUgbGFzdCBpbnNlcnRlZCBlbnRyeS4gIFRoaXMgYWxsb3dzIGluc2VydGlvbnMgdG8KKwkgYmUgZmFzdC4gICovCisgICAgICBpZiAoaW5mbykKKwl7CisJICBpZiAoc29ydGVkX2NvdW50KQorCSAgICB7CisJICAgICAgLyogVHJ5IGJzZWFyY2ggZmlyc3Qgb24gdGhlIHNvcnRlZCBzZWN0aW9uLiAgKi8KKwkgICAgICBrZXkuYWRkZW5kID0gYWRkZW5kOworCSAgICAgIGR5bl9pID0gYnNlYXJjaCAoJmtleSwgaW5mbywgc29ydGVkX2NvdW50LAorCQkJICAgICAgIHNpemVvZiAoKmluZm8pLCBhZGRlbmRfY29tcGFyZSk7CisKKwkgICAgICBpZiAoZHluX2kpCisJCXsKKwkJICByZXR1cm4gZHluX2k7CisJCX0KKwkgICAgfQorCisJICAvKiBEbyBhIHF1aWNrIGNoZWNrIGZvciB0aGUgbGFzdCBpbnNlcnRlZCBlbnRyeS4gICovCisJICBkeW5faSA9IGluZm8gKyBjb3VudCAtIDE7CisJICBpZiAoZHluX2ktPmFkZGVuZCA9PSBhZGRlbmQpCisJICAgIHsKKwkgICAgICByZXR1cm4gZHluX2k7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChzaXplID09IDApCisJeworCSAgLyogSXQgaXMgdGhlIHZlcnkgZmlyc3QgZWxlbWVudC4gV2UgY3JlYXRlIHRoZSBhcnJheSBvZiBzaXplCisJICAgICAxLiAgKi8KKwkgIHNpemUgPSAxOworCSAgYW10ID0gc2l6ZSAqIHNpemVvZiAoKmluZm8pOworCSAgaW5mbyA9IGJmZF9tYWxsb2MgKGFtdCk7CisJfQorICAgICAgZWxzZSBpZiAoc2l6ZSA8PSBjb3VudCkKKwl7CisJICAvKiBXZSBkb3VibGUgdGhlIGFycmF5IHNpemUgZXZlcnkgdGltZSB3aGVuIHdlIHJlYWNoIHRoZQorCSAgICAgc2l6ZSBsaW1pdC4gICovCisJICBzaXplICs9IHNpemU7CisJICBhbXQgPSBzaXplICogc2l6ZW9mICgqaW5mbyk7CisJICBpbmZvID0gYmZkX3JlYWxsb2MgKGluZm8sIGFtdCk7CisJfQorICAgICAgZWxzZQorCWdvdG8gaGFzX3NwYWNlOworCisgICAgICBpZiAoaW5mbyA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgICAgKnNpemVfcCA9IHNpemU7CisgICAgICAqaW5mb19wID0gaW5mbzsKKworaGFzX3NwYWNlOgorICAgICAgLyogQXBwZW5kIHRoZSBuZXcgb25lIHRvIHRoZSBhcnJheS4gICovCisgICAgICBkeW5faSA9IGluZm8gKyBjb3VudDsKKyAgICAgIG1lbXNldCAoZHluX2ksIDAsIHNpemVvZiAoKmR5bl9pKSk7CiAgICAgICBkeW5faS0+YWRkZW5kID0gYWRkZW5kOworICAgICAgCisgICAgICAvKiBXZSBpbmNyZW1lbnQgY291bnQgb25seSBzaW5jZSB0aGUgbmV3IG9uZXMgYXJlIHVuc29ydGVkIGFuZAorCSBtYXkgaGF2ZSBkdXBsaWNhdGUuICAqLworICAgICAgKCpjb3VudF9wKSsrOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEl0IGlzIGEgbG9va3VwIHdpdGhvdXQgaW5zZXJ0aW9uLiAgU29ydCBhcnJheSBpZiBwYXJ0IG9mIHRoZQorCSBhcnJheSBpc24ndCBzb3J0ZWQuICAqLworICAgICAgaWYgKGNvdW50ICE9IHNvcnRlZF9jb3VudCkKKwl7CisJICBjb3VudCA9IHNvcnRfZHluX3N5bV9pbmZvIChpbmZvLCBjb3VudCk7CisJICAqY291bnRfcCA9IGNvdW50OworCSAgKnNvcnRlZF9jb3VudF9wID0gY291bnQ7CisJfQorCisgICAgICAvKiBGcmVlIHVudXNlZCBtZW1vcnkuICAqLworICAgICAgaWYgKHNpemUgIT0gY291bnQpCisJeworCSAgYW10ID0gY291bnQgKiBzaXplb2YgKCppbmZvKTsKKwkgIGluZm8gPSBiZmRfbWFsbG9jIChhbXQpOworCSAgaWYgKGluZm8gIT0gTlVMTCkKKwkgICAgeworCSAgICAgIG1lbWNweSAoaW5mbywgKmluZm9fcCwgYW10KTsKKwkgICAgICBmcmVlICgqaW5mb19wKTsKKwkgICAgICAqc2l6ZV9wID0gY291bnQ7CisJICAgICAgKmluZm9fcCA9IGluZm87CisJICAgIH0KKwl9CisKKyAgICAgIGtleS5hZGRlbmQgPSBhZGRlbmQ7CisgICAgICBkeW5faSA9IGJzZWFyY2ggKCZrZXksIGluZm8sIGNvdW50LAorCQkgICAgICAgc2l6ZW9mICgqaW5mbyksIGFkZGVuZF9jb21wYXJlKTsKICAgICB9CiAKICAgcmV0dXJuIGR5bl9pOwpAQCAtMjM2OCw2ICsyNjgzLDIzIEBACiAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwogICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwogICBhc2VjdGlvbiAqZ290LCAqZnB0ciwgKnNyZWwsICpwbHRvZmY7CisgIGVudW0geworICAgIE5FRURfR09UID0gMSwKKyAgICBORUVEX0dPVFggPSAyLAorICAgIE5FRURfRlBUUiA9IDQsCisgICAgTkVFRF9QTFRPRkYgPSA4LAorICAgIE5FRURfTUlOX1BMVCA9IDE2LAorICAgIE5FRURfRlVMTF9QTFQgPSAzMiwKKyAgICBORUVEX0RZTlJFTCA9IDY0LAorICAgIE5FRURfTFRPRkZfRlBUUiA9IDEyOCwKKyAgICBORUVEX1RQUkVMID0gMjU2LAorICAgIE5FRURfRFRQTU9EID0gNTEyLAorICAgIE5FRURfRFRQUkVMID0gMTAyNAorICB9OworICBpbnQgbmVlZF9lbnRyeTsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgIGJmZF9ib29sZWFuIG1heWJlX2R5bmFtaWM7CiAKICAgaWYgKGluZm8tPnJlbG9jYXRhYmxlKQogICAgIHJldHVybiBUUlVFOwpAQCAtMjM3OCwyOSArMjcxMCwxODEgQEAKICAgZ290ID0gZnB0ciA9IHNyZWwgPSBwbHRvZmYgPSBOVUxMOwogCiAgIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7CisKKyAgLyogV2Ugc2NhbiByZWxvY2F0aW9ucyBmaXJzdCB0byBjcmVhdGUgZHluYW1pYyByZWxvY2F0aW9uIGFycmF5cy4gIFdlCisgICAgIG1vZGlmaWVkIGdldF9keW5fc3ltX2luZm8gdG8gYWxsb3cgZmFzdCBpbnNlcnRpb24gYW5kIHN1cHBvcnQgZmFzdAorICAgICBsb29rdXAgaW4gdGhlIG5leHQgbG9vcC4gICovCiAgIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7ICsrcmVsKQogICAgIHsKLSAgICAgIGVudW0gewotCU5FRURfR09UID0gMSwKLQlORUVEX0dPVFggPSAyLAotCU5FRURfRlBUUiA9IDQsCi0JTkVFRF9QTFRPRkYgPSA4LAotCU5FRURfTUlOX1BMVCA9IDE2LAotCU5FRURfRlVMTF9QTFQgPSAzMiwKLQlORUVEX0RZTlJFTCA9IDY0LAotCU5FRURfTFRPRkZfRlBUUiA9IDEyOCwKLQlORUVEX1RQUkVMID0gMjU2LAotCU5FRURfRFRQTU9EID0gNTEyLAotCU5FRURfRFRQUkVMID0gMTAyNAotICAgICAgfTsKKyAgICAgIHJfc3ltbmR4ID0gRUxGTk5fUl9TWU0gKHJlbC0+cl9pbmZvKTsKKyAgICAgIGlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIGxvbmcgaW5keCA9IHJfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKwkgIGggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5keF07CisJICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKKwkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCisJICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKKwl9CisgICAgICBlbHNlCisJaCA9IE5VTEw7CiAKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHggPSBFTEZOTl9SX1NZTSAocmVsLT5yX2luZm8pOworICAgICAgLyogV2UgY2FuIG9ubHkgZ2V0IHByZWxpbWluYXJ5IGRhdGEgb24gd2hldGhlciBhIHN5bWJvbCBpcworCSBsb2NhbGx5IG9yIGV4dGVybmFsbHkgZGVmaW5lZCwgYXMgbm90IGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMKKwkgaGF2ZSB5ZXQgYmVlbiBwcm9jZXNzZWQuICBEbyBzb21ldGhpbmcgd2l0aCB3aGF0IHdlIGtub3csIGFzCisJIHRoaXMgbWF5IGhlbHAgcmVkdWNlIG1lbW9yeSB1c2FnZSBhbmQgcHJvY2Vzc2luZyB0aW1lIGxhdGVyLiAgKi8KKyAgICAgIG1heWJlX2R5bmFtaWMgPSAoaCAmJiAoKCFpbmZvLT5leGVjdXRhYmxlCisJCQkgICAgICAmJiAoIWluZm8tPnN5bWJvbGljCisJCQkJICB8fCBpbmZvLT51bnJlc29sdmVkX3N5bXNfaW5fc2hhcmVkX2xpYnMgPT0gUk1fSUdOT1JFKSkKKwkJCSAgICAgfHwgIWgtPmRlZl9yZWd1bGFyCisJCQkgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKKworICAgICAgbmVlZF9lbnRyeSA9IDA7CisgICAgICBzd2l0Y2ggKEVMRk5OX1JfVFlQRSAocmVsLT5yX2luZm8pKQorCXsKKwljYXNlIFJfSUE2NF9UUFJFTDY0TVNCOgorCWNhc2UgUl9JQTY0X1RQUkVMNjRMU0I6CisJICBpZiAoaW5mby0+c2hhcmVkIHx8IG1heWJlX2R5bmFtaWMpCisJICAgIG5lZWRfZW50cnkgPSBORUVEX0RZTlJFTDsKKwkgIGJyZWFrOworCisJY2FzZSBSX0lBNjRfTFRPRkZfVFBSRUwyMjoKKwkgIG5lZWRfZW50cnkgPSBORUVEX1RQUkVMOworCSAgaWYgKGluZm8tPnNoYXJlZCkKKwkgICAgaW5mby0+ZmxhZ3MgfD0gREZfU1RBVElDX1RMUzsKKwkgIGJyZWFrOworCisJY2FzZSBSX0lBNjRfRFRQUkVMMzJNU0I6CisJY2FzZSBSX0lBNjRfRFRQUkVMMzJMU0I6CisJY2FzZSBSX0lBNjRfRFRQUkVMNjRNU0I6CisJY2FzZSBSX0lBNjRfRFRQUkVMNjRMU0I6CisJICBpZiAoaW5mby0+c2hhcmVkIHx8IG1heWJlX2R5bmFtaWMpCisJICAgIG5lZWRfZW50cnkgPSBORUVEX0RZTlJFTDsKKwkgIGJyZWFrOworCisJY2FzZSBSX0lBNjRfTFRPRkZfRFRQUkVMMjI6CisJICBuZWVkX2VudHJ5ID0gTkVFRF9EVFBSRUw7CisJICBicmVhazsKKworCWNhc2UgUl9JQTY0X0RUUE1PRDY0TVNCOgorCWNhc2UgUl9JQTY0X0RUUE1PRDY0TFNCOgorCSAgaWYgKGluZm8tPnNoYXJlZCB8fCBtYXliZV9keW5hbWljKQorCSAgICBuZWVkX2VudHJ5ID0gTkVFRF9EWU5SRUw7CisJICBicmVhazsKKworCWNhc2UgUl9JQTY0X0xUT0ZGX0RUUE1PRDIyOgorCSAgbmVlZF9lbnRyeSA9IE5FRURfRFRQTU9EOworCSAgYnJlYWs7CisKKwljYXNlIFJfSUE2NF9MVE9GRl9GUFRSMjI6CisJY2FzZSBSX0lBNjRfTFRPRkZfRlBUUjY0SToKKwljYXNlIFJfSUE2NF9MVE9GRl9GUFRSMzJNU0I6CisJY2FzZSBSX0lBNjRfTFRPRkZfRlBUUjMyTFNCOgorCWNhc2UgUl9JQTY0X0xUT0ZGX0ZQVFI2NE1TQjoKKwljYXNlIFJfSUE2NF9MVE9GRl9GUFRSNjRMU0I6CisJICBuZWVkX2VudHJ5ID0gTkVFRF9GUFRSIHwgTkVFRF9HT1QgfCBORUVEX0xUT0ZGX0ZQVFI7CisJICBicmVhazsKKworCWNhc2UgUl9JQTY0X0ZQVFI2NEk6CisJY2FzZSBSX0lBNjRfRlBUUjMyTVNCOgorCWNhc2UgUl9JQTY0X0ZQVFIzMkxTQjoKKwljYXNlIFJfSUE2NF9GUFRSNjRNU0I6CisJY2FzZSBSX0lBNjRfRlBUUjY0TFNCOgorCSAgaWYgKGluZm8tPnNoYXJlZCB8fCBoKQorCSAgICBuZWVkX2VudHJ5ID0gTkVFRF9GUFRSIHwgTkVFRF9EWU5SRUw7CisJICBlbHNlCisJICAgIG5lZWRfZW50cnkgPSBORUVEX0ZQVFI7CisJICBicmVhazsKKworCWNhc2UgUl9JQTY0X0xUT0ZGMjI6CisJY2FzZSBSX0lBNjRfTFRPRkY2NEk6CisJICBuZWVkX2VudHJ5ID0gTkVFRF9HT1Q7CisJICBicmVhazsKKworCWNhc2UgUl9JQTY0X0xUT0ZGMjJYOgorCSAgbmVlZF9lbnRyeSA9IE5FRURfR09UWDsKKwkgIGJyZWFrOworCisJY2FzZSBSX0lBNjRfUExUT0ZGMjI6CisJY2FzZSBSX0lBNjRfUExUT0ZGNjRJOgorCWNhc2UgUl9JQTY0X1BMVE9GRjY0TVNCOgorCWNhc2UgUl9JQTY0X1BMVE9GRjY0TFNCOgorCSAgbmVlZF9lbnRyeSA9IE5FRURfUExUT0ZGOworCSAgaWYgKGgpCisJICAgIHsKKwkgICAgICBpZiAobWF5YmVfZHluYW1pYykKKwkJbmVlZF9lbnRyeSB8PSBORUVEX01JTl9QTFQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQorCQkoaW5mbywgXygiQHBsdG9mZiByZWxvYyBhZ2FpbnN0IGxvY2FsIHN5bWJvbCIpLCAwLAorCQkgYWJmZCwgMCwgKGJmZF92bWEpIDApOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgUl9JQTY0X1BDUkVMMjFCOgorICAgICAgICBjYXNlIFJfSUE2NF9QQ1JFTDYwQjoKKwkgIC8qIERlcGVuZGluZyBvbiB3aGVyZSB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkLCB3ZSBtYXkgb3IgbWF5IG5vdAorCSAgICAgbmVlZCBhIGZ1bGwgcGx0IGVudHJ5LiAgT25seSBza2lwIGlmIHdlIGtub3cgd2UnbGwgbm90IG5lZWQKKwkgICAgIHRoZSBlbnRyeSAtLSBzdGF0aWMgb3Igc3ltYm9saWMsIGFuZCB0aGUgc3ltYm9sIGRlZmluaXRpb24KKwkgICAgIGhhcyBhbHJlYWR5IGJlZW4gc2Vlbi4gICovCisJICBpZiAobWF5YmVfZHluYW1pYyAmJiByZWwtPnJfYWRkZW5kID09IDApCisJICAgIG5lZWRfZW50cnkgPSBORUVEX0ZVTExfUExUOworCSAgYnJlYWs7CisKKwljYXNlIFJfSUE2NF9JTU0xNDoKKwljYXNlIFJfSUE2NF9JTU0yMjoKKwljYXNlIFJfSUE2NF9JTU02NDoKKwljYXNlIFJfSUE2NF9ESVIzMk1TQjoKKwljYXNlIFJfSUE2NF9ESVIzMkxTQjoKKwljYXNlIFJfSUE2NF9ESVI2NE1TQjoKKwljYXNlIFJfSUE2NF9ESVI2NExTQjoKKwkgIC8qIFNoYXJlZCBvYmplY3RzIHdpbGwgYWx3YXlzIG5lZWQgYXQgbGVhc3QgYSBSRUwgcmVsb2NhdGlvbi4gICovCisJICBpZiAoaW5mby0+c2hhcmVkIHx8IG1heWJlX2R5bmFtaWMpCisJICAgIG5lZWRfZW50cnkgPSBORUVEX0RZTlJFTDsKKwkgIGJyZWFrOworCisJY2FzZSBSX0lBNjRfSVBMVE1TQjoKKwljYXNlIFJfSUE2NF9JUExUTFNCOgorCSAgLyogU2hhcmVkIG9iamVjdHMgd2lsbCBhbHdheXMgbmVlZCBhdCBsZWFzdCBhIFJFTCByZWxvY2F0aW9uLiAgKi8KKwkgIGlmIChpbmZvLT5zaGFyZWQgfHwgbWF5YmVfZHluYW1pYykKKwkgICAgbmVlZF9lbnRyeSA9IE5FRURfRFlOUkVMOworCSAgYnJlYWs7CisKKwljYXNlIFJfSUE2NF9QQ1JFTDIyOgorCWNhc2UgUl9JQTY0X1BDUkVMNjRJOgorCWNhc2UgUl9JQTY0X1BDUkVMMzJNU0I6CisJY2FzZSBSX0lBNjRfUENSRUwzMkxTQjoKKwljYXNlIFJfSUE2NF9QQ1JFTDY0TVNCOgorCWNhc2UgUl9JQTY0X1BDUkVMNjRMU0I6CisJICBpZiAobWF5YmVfZHluYW1pYykKKwkgICAgbmVlZF9lbnRyeSA9IE5FRURfRFlOUkVMOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoIW5lZWRfZW50cnkpCisJY29udGludWU7CisKKyAgICAgIGlmICgobmVlZF9lbnRyeSAmIE5FRURfRlBUUikgIT0gMAorCSAgJiYgcmVsLT5yX2FkZGVuZCkKKwl7CisJICAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKKwkgICAgKGluZm8sIF8oIm5vbi16ZXJvIGFkZGVuZCBpbiBAZnB0ciByZWxvYyIpLCAwLAorCSAgICAgYWJmZCwgMCwgKGJmZF92bWEpIDApOworCX0KKworICAgICAgaWYgKGdldF9keW5fc3ltX2luZm8gKGlhNjRfaW5mbywgaCwgYWJmZCwgcmVsLCBUUlVFKSA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogTm93LCB3ZSBvbmx5IGRvIGxvb2t1cCB3aXRob3V0IGluc2VydGlvbiwgd2hpY2ggaXMgdmVyeSBmYXN0CisgICAgIHdpdGggdGhlIG1vZGlmaWVkIGdldF9keW5fc3ltX2luZm8uICAqLyAKKyAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgKytyZWwpCisgICAgewogICAgICAgc3RydWN0IGVsZk5OX2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAgICAgIGludCBuZWVkX2VudHJ5OwotICAgICAgYmZkX2Jvb2xlYW4gbWF5YmVfZHluYW1pYzsKICAgICAgIGludCBkeW5yZWxfdHlwZSA9IFJfSUE2NF9OT05FOwogCisgICAgICByX3N5bW5keCA9IEVMRk5OX1JfU1lNIChyZWwtPnJfaW5mbyk7CiAgICAgICBpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKIAl7CiAJICAvKiBXZSdyZSBkZWFsaW5nIHdpdGggYSBnbG9iYWwgc3ltYm9sIC0tIGZpbmQgaXRzIGhhc2ggZW50cnkKQEAgLTI0MTMsMTggKzI4OTcsMTggQEAKIAogCSAgaC0+cmVmX3JlZ3VsYXIgPSAxOwogCX0KKyAgICAgIGVsc2UKKwloID0gTlVMTDsKIAogICAgICAgLyogV2UgY2FuIG9ubHkgZ2V0IHByZWxpbWluYXJ5IGRhdGEgb24gd2hldGhlciBhIHN5bWJvbCBpcwogCSBsb2NhbGx5IG9yIGV4dGVybmFsbHkgZGVmaW5lZCwgYXMgbm90IGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMKIAkgaGF2ZSB5ZXQgYmVlbiBwcm9jZXNzZWQuICBEbyBzb21ldGhpbmcgd2l0aCB3aGF0IHdlIGtub3csIGFzCiAJIHRoaXMgbWF5IGhlbHAgcmVkdWNlIG1lbW9yeSB1c2FnZSBhbmQgcHJvY2Vzc2luZyB0aW1lIGxhdGVyLiAgKi8KLSAgICAgIG1heWJlX2R5bmFtaWMgPSBGQUxTRTsKLSAgICAgIGlmIChoICYmICgoIWluZm8tPmV4ZWN1dGFibGUKLQkJICYmICghaW5mby0+c3ltYm9saWMKLQkJICAgICB8fCBpbmZvLT51bnJlc29sdmVkX3N5bXNfaW5fc2hhcmVkX2xpYnMgPT0gUk1fSUdOT1JFKSkKLQkJfHwgIWgtPmRlZl9yZWd1bGFyCi0JCXx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCW1heWJlX2R5bmFtaWMgPSBUUlVFOworICAgICAgbWF5YmVfZHluYW1pYyA9IChoICYmICgoIWluZm8tPmV4ZWN1dGFibGUKKwkJCSAgICAgICYmICghaW5mby0+c3ltYm9saWMKKwkJCQkgIHx8IGluZm8tPnVucmVzb2x2ZWRfc3ltc19pbl9zaGFyZWRfbGlicyA9PSBSTV9JR05PUkUpKQorCQkJICAgICB8fCAhaC0+ZGVmX3JlZ3VsYXIKKwkJCSAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwogCiAgICAgICBuZWVkX2VudHJ5ID0gMDsKICAgICAgIHN3aXRjaCAoRUxGTk5fUl9UWVBFIChyZWwtPnJfaW5mbykpCkBAIC0yNTA4LDEyICsyOTkyLDYgQEAKIAkgICAgICBpZiAobWF5YmVfZHluYW1pYykKIAkJbmVlZF9lbnRyeSB8PSBORUVEX01JTl9QTFQ7CiAJICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkoaW5mbywgXygiQHBsdG9mZiByZWxvYyBhZ2FpbnN0IGxvY2FsIHN5bWJvbCIpLCAwLAotCQkgYWJmZCwgMCwgKGJmZF92bWEpIDApOwotCSAgICB9CiAJICBicmVhazsKIAogCWNhc2UgUl9JQTY0X1BDUkVMMjFCOgpAQCAtMjU2MiwxNSArMzA0MCw3IEBACiAgICAgICBpZiAoIW5lZWRfZW50cnkpCiAJY29udGludWU7CiAKLSAgICAgIGlmICgobmVlZF9lbnRyeSAmIE5FRURfRlBUUikgIT0gMAotCSAgJiYgcmVsLT5yX2FkZGVuZCkKLQl7Ci0JICAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkgICAgKGluZm8sIF8oIm5vbi16ZXJvIGFkZGVuZCBpbiBAZnB0ciByZWxvYyIpLCAwLAotCSAgICAgYWJmZCwgMCwgKGJmZF92bWEpIDApOwotCX0KLQotICAgICAgZHluX2kgPSBnZXRfZHluX3N5bV9pbmZvIChpYTY0X2luZm8sIGgsIGFiZmQsIHJlbCwgVFJVRSk7CisgICAgICBkeW5faSA9IGdldF9keW5fc3ltX2luZm8gKGlhNjRfaW5mbywgaCwgYWJmZCwgcmVsLCBGQUxTRSk7CiAKICAgICAgIC8qIFJlY29yZCB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLiAgKi8KICAgICAgIGR5bl9pLT5oID0gaDsKQEAgLTQxNDUsOCArNDYxNSwxMSBAQAogCSAgICAgIGlmIChsb2NfaCAmJiAhIGxvY19oLT5zZWNfbWVyZ2VfZG9uZSkKIAkJewogCQkgIHN0cnVjdCBlbGZOTl9pYTY0X2R5bl9zeW1faW5mbyAqZHluZW50OworCQkgIHVuc2lnbmVkIGludCBjb3VudDsKIAotCQkgIGZvciAoZHluZW50ID0gbG9jX2gtPmluZm87IGR5bmVudDsgZHluZW50ID0gZHluZW50LT5uZXh0KQorCQkgIGZvciAoY291bnQgPSBsb2NfaC0+Y291bnQsIGR5bmVudCA9IGxvY19oLT5pbmZvOworCQkgICAgICAgY291bnQgIT0gMDsKKwkJICAgICAgIGNvdW50LS0sIGR5bmVudCsrKQogCQkgICAgewogCQkgICAgICBtc2VjID0gc3ltX3NlYzsKIAkJICAgICAgZHluZW50LT5hZGRlbmQgPQpAQCAtNDE2MSw2ICs0NjM0LDEwIEBACiAJCQkJCS0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQogCQkJCQktIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQ7CiAJCSAgICB9CisJCSAgCisJCSAgcXNvcnQgKGxvY19oLT5pbmZvLCBsb2NfaC0+Y291bnQsCisJCQkgc2l6ZW9mICgqbG9jX2gtPmluZm8pLCBhZGRlbmRfY29tcGFyZSk7CisKIAkJICBsb2NfaC0+c2VjX21lcmdlX2RvbmUgPSAxOwogCQl9CiAJICAgIH0KZGlmZiAtLWdpdCBhL2JmZC9lbGZ4eC1zcGFyYy5jIGIvYmZkL2VsZnh4LXNwYXJjLmMKaW5kZXggY2I1ZjdjYi4uZWY3ZmY0OCAxMDA2NDQKLS0tIGEvYmZkL2VsZnh4LXNwYXJjLmMKKysrIGIvYmZkL2VsZnh4LXNwYXJjLmMKQEAgLTIzLDEwICsyMywxMiBAQAogI2luY2x1ZGUgInN5c2RlcC5oIgogI2luY2x1ZGUgImJmZGxpbmsuaCIKICNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKICNpbmNsdWRlICJlbGYtYmZkLmgiCiAjaW5jbHVkZSAiZWxmL3NwYXJjLmgiCiAjaW5jbHVkZSAib3Bjb2RlL3NwYXJjLmgiCiAjaW5jbHVkZSAiZWxmeHgtc3BhcmMuaCIKKyNpbmNsdWRlICJlbGYtdnh3b3Jrcy5oIgogCiAvKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlLiAgKi8KICNkZWZpbmUgTUlOVVNfT05FICh+IChiZmRfdm1hKSAwKQpAQCAtNjk3LDYgKzY5OSw1MCBAQAogICByZXR1cm4gaW5kZXggLSA0OwogfQogCisvKiBUaGUgZm9ybWF0IG9mIHRoZSBmaXJzdCBQTFQgZW50cnkgaW4gYSBWeFdvcmtzIGV4ZWN1dGFibGUuICAqLworc3RhdGljIGNvbnN0IGJmZF92bWEgc3BhcmNfdnh3b3Jrc19leGVjX3BsdDBfZW50cnlbXSA9CisgIHsKKyAgICAweDA1MDAwMDAwLAkvKiBzZXRoaSAgJWhpKF9HTE9CQUxfT0ZGU0VUX1RBQkxFXys4KSwgJWcyICovCisgICAgMHg4NDEwYTAwMCwJLyogb3IgICAgICVnMiwgJWxvKF9HTE9CQUxfT0ZGU0VUX1RBQkxFXys4KSwgJWcyICovCisgICAgMHhjNDAwODAwMCwJLyogbGQgICAgIFsgJWcyIF0sICVnMiAqLworICAgIDB4ODFjMDgwMDAsCS8qIGptcCAgICAlZzIgKi8KKyAgICAweDAxMDAwMDAwCS8qIG5vcCAqLworICB9OworCisvKiBUaGUgZm9ybWF0IG9mIHN1YnNlcXVlbnQgUExUIGVudHJpZXMuICAqLworc3RhdGljIGNvbnN0IGJmZF92bWEgc3BhcmNfdnh3b3Jrc19leGVjX3BsdF9lbnRyeVtdID0KKyAgeworICAgIDB4MDMwMDAwMDAsCS8qIHNldGhpICAlaGkoX0dMT0JBTF9PRkZTRVRfVEFCTEVfK2ZAZ290KSwgJWcxICovCisgICAgMHg4MjEwNjAwMCwJLyogb3IgICAgICVnMSwgJWxvKF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytmQGdvdCksICVnMSAqLworICAgIDB4YzIwMDQwMDAsCS8qIGxkICAgICBbICVnMSBdLCAlZzEgKi8KKyAgICAweDgxYzA0MDAwLAkvKiBqbXAgICAgJWcxICovCisgICAgMHgwMTAwMDAwMCwJLyogbm9wICovCisgICAgMHgwMzAwMDAwMCwJLyogc2V0aGkgICVoaShmQHBsdGluZGV4KSwgJWcxICovCisgICAgMHgxMDgwMDAwMCwJLyogYiAgICAgIF9QTFRfcmVzb2x2ZSAqLworICAgIDB4ODIxMDYwMDAJLyogb3IgICAgICVnMSwgJWxvKGZAcGx0aW5kZXgpLCAlZzEgKi8KKyAgfTsKKworLyogVGhlIGZvcm1hdCBvZiB0aGUgZmlyc3QgUExUIGVudHJ5IGluIGEgVnhXb3JrcyBzaGFyZWQgb2JqZWN0LiAgKi8KK3N0YXRpYyBjb25zdCBiZmRfdm1hIHNwYXJjX3Z4d29ya3Nfc2hhcmVkX3BsdDBfZW50cnlbXSA9CisgIHsKKyAgICAweGM0MDVlMDA4LAkvKiBsZCAgICAgWyAlbDcgKyA4IF0sICVnMiAqLworICAgIDB4ODFjMDgwMDAsCS8qIGptcCAgICAlZzIgKi8KKyAgICAweDAxMDAwMDAwCS8qIG5vcCAqLworICB9OworCisvKiBUaGUgZm9ybWF0IG9mIHN1YnNlcXVlbnQgUExUIGVudHJpZXMuICAqLworc3RhdGljIGNvbnN0IGJmZF92bWEgc3BhcmNfdnh3b3Jrc19zaGFyZWRfcGx0X2VudHJ5W10gPQorICB7CisgICAgMHgwMzAwMDAwMCwJLyogc2V0aGkgICVoaShmQGdvdCksICVnMSAqLworICAgIDB4ODIxMDYwMDAsCS8qIG9yICAgICAlZzEsICVsbyhmQGdvdCksICVnMSAqLworICAgIDB4YzIwNWMwMDEsCS8qIGxkICAgICBbICVsNyArICVnMSBdLCAlZzEgKi8KKyAgICAweDgxYzA0MDAwLAkvKiBqbXAgICAgJWcxICovCisgICAgMHgwMTAwMDAwMCwJLyogbm9wICovCisgICAgMHgwMzAwMDAwMCwJLyogc2V0aGkgICVoaShmQHBsdGluZGV4KSwgJWcxICovCisgICAgMHgxMDgwMDAwMCwJLyogYiAgICAgIF9QTFRfcmVzb2x2ZSAqLworICAgIDB4ODIxMDYwMDAJLyogb3IgICAgICVnMSwgJWxvKGZAcGx0aW5kZXgpLCAlZzEgKi8KKyAgfTsKKwogI2RlZmluZSBTUEFSQ19FTEZfUFVUX1dPUkQoaHRhYiwgYmZkLCB2YWwsIHB0cikJXAogCWh0YWItPnB1dF93b3JkKGJmZCwgdmFsLCBwdHIpCiAKQEAgLTc4MSw3ICs4MjcsNiBAQAogICAgICAgcmV0LT5hcHBlbmRfcmVsYSA9IHNwYXJjX2VsZl9hcHBlbmRfcmVsYV82NDsKICAgICAgIHJldC0+cl9pbmZvID0gc3BhcmNfZWxmX3JfaW5mb182NDsKICAgICAgIHJldC0+cl9zeW1uZHggPSBzcGFyY19lbGZfcl9zeW1uZHhfNjQ7Ci0gICAgICByZXQtPmJ1aWxkX3BsdF9lbnRyeSA9IHNwYXJjNjRfcGx0X2VudHJ5X2J1aWxkOwogICAgICAgcmV0LT5kdHBvZmZfcmVsb2MgPSBSX1NQQVJDX1RMU19EVFBPRkY2NDsKICAgICAgIHJldC0+ZHRwbW9kX3JlbG9jID0gUl9TUEFSQ19UTFNfRFRQTU9ENjQ7CiAgICAgICByZXQtPnRwb2ZmX3JlbG9jID0gUl9TUEFSQ19UTFNfVFBPRkY2NDsKQEAgLTc5OCw3ICs4NDMsNiBAQAogICAgICAgcmV0LT5hcHBlbmRfcmVsYSA9IHNwYXJjX2VsZl9hcHBlbmRfcmVsYV8zMjsKICAgICAgIHJldC0+cl9pbmZvID0gc3BhcmNfZWxmX3JfaW5mb18zMjsKICAgICAgIHJldC0+cl9zeW1uZHggPSBzcGFyY19lbGZfcl9zeW1uZHhfMzI7Ci0gICAgICByZXQtPmJ1aWxkX3BsdF9lbnRyeSA9IHNwYXJjMzJfcGx0X2VudHJ5X2J1aWxkOwogICAgICAgcmV0LT5kdHBvZmZfcmVsb2MgPSBSX1NQQVJDX1RMU19EVFBPRkYzMjsKICAgICAgIHJldC0+ZHRwbW9kX3JlbG9jID0gUl9TUEFSQ19UTFNfRFRQTU9EMzI7CiAgICAgICByZXQtPnRwb2ZmX3JlbG9jID0gUl9TUEFSQ19UTFNfVFBPRkYzMjsKQEAgLTg0Niw2ICs4OTAsMTQgQEAKICAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBodGFiLT5zcmVsZ290LAogCQkJCSAgICAgIGh0YWItPndvcmRfYWxpZ25fcG93ZXIpKQogICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoaHRhYi0+aXNfdnh3b3JrcykKKyAgICB7CisgICAgICBodGFiLT5zZ290cGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7CisgICAgICBpZiAoIWh0YWItPnNnb3RwbHQpCisJcmV0dXJuIEZBTFNFOworICAgIH0KKwogICByZXR1cm4gVFJVRTsKIH0KIApAQCAtODcyLDYgKzkyNCw0MSBAQAogICBpZiAoIWluZm8tPnNoYXJlZCkKICAgICBodGFiLT5zcmVsYnNzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwogCisgIGlmIChodGFiLT5pc192eHdvcmtzKQorICAgIHsKKyAgICAgIGlmICghZWxmX3Z4d29ya3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGR5bm9iaiwgaW5mbywgJmh0YWItPnNyZWxwbHQyKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAoaW5mby0+c2hhcmVkKQorCXsKKwkgIGh0YWItPnBsdF9oZWFkZXJfc2l6ZQorCSAgICA9IDQgKiBBUlJBWV9TSVpFIChzcGFyY192eHdvcmtzX3NoYXJlZF9wbHQwX2VudHJ5KTsKKwkgIGh0YWItPnBsdF9lbnRyeV9zaXplCisJICAgID0gNCAqIEFSUkFZX1NJWkUgKHNwYXJjX3Z4d29ya3Nfc2hhcmVkX3BsdF9lbnRyeSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGh0YWItPnBsdF9oZWFkZXJfc2l6ZQorCSAgICA9IDQgKiBBUlJBWV9TSVpFIChzcGFyY192eHdvcmtzX2V4ZWNfcGx0MF9lbnRyeSk7CisJICBodGFiLT5wbHRfZW50cnlfc2l6ZQorCSAgICA9IDQgKiBBUlJBWV9TSVpFIChzcGFyY192eHdvcmtzX2V4ZWNfcGx0X2VudHJ5KTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKEFCSV82NF9QIChkeW5vYmopKQorCXsKKwkgIGh0YWItPmJ1aWxkX3BsdF9lbnRyeSA9IHNwYXJjNjRfcGx0X2VudHJ5X2J1aWxkOworCSAgaHRhYi0+cGx0X2hlYWRlcl9zaXplID0gUExUNjRfSEVBREVSX1NJWkU7CisJICBodGFiLT5wbHRfZW50cnlfc2l6ZSA9IFBMVDY0X0VOVFJZX1NJWkU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGh0YWItPmJ1aWxkX3BsdF9lbnRyeSA9IHNwYXJjMzJfcGx0X2VudHJ5X2J1aWxkOworCSAgaHRhYi0+cGx0X2hlYWRlcl9zaXplID0gUExUMzJfSEVBREVSX1NJWkU7CisJICBodGFiLT5wbHRfZW50cnlfc2l6ZSA9IFBMVDMyX0VOVFJZX1NJWkU7CisJfQorICAgIH0KKwogICBpZiAoIWh0YWItPnNwbHQgfHwgIWh0YWItPnNyZWxwbHQgfHwgIWh0YWItPnNkeW5ic3MKICAgICAgIHx8ICghaW5mby0+c2hhcmVkICYmICFodGFiLT5zcmVsYnNzKSkKICAgICBhYm9ydCAoKTsKQEAgLTE4MDcsMTAgKzE4OTQsMTUgQEAKIAl7CiAJICBhc2VjdGlvbiAqcyA9IGh0YWItPnNwbHQ7CiAKLQkgIC8qIFRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaW4gLnBsdCBpcyByZXNlcnZlZC4gICovCisJICAvKiBBbGxvY2F0ZSByb29tIGZvciB0aGUgaGVhZGVyLiAgKi8KIAkgIGlmIChzLT5zaXplID09IDApCi0JICAgIHMtPnNpemUgPSAoU1BBUkNfRUxGX1dPUkRfQllURVMoaHRhYikgPT0gOCA/Ci0JCSAgICAgICBQTFQ2NF9IRUFERVJfU0laRSA6IFBMVDMyX0hFQURFUl9TSVpFKTsKKwkgICAgeworCSAgICAgIHMtPnNpemUgPSBodGFiLT5wbHRfaGVhZGVyX3NpemU7CisKKwkgICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIC5yZWxhLnBsdC51bmxvYWRlZCByZWxvY2F0aW9ucy4gICovCisJICAgICAgaWYgKGh0YWItPmlzX3Z4d29ya3MgJiYgIWluZm8tPnNoYXJlZCkKKwkJaHRhYi0+c3JlbHBsdDItPnNpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpICogMjsKKwkgICAgfQogCiAJICAvKiBUaGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgc2l6ZSBpcyBib3VuZGVkIGJ5IHRoZSBtYWduaXR1ZGUKIAkgICAgIG9mIHRoZSBvZmZzZXQgd2UgY2FuIGRlc2NyaWJlIGluIHRoZSBlbnRyeS4gICovCkBAIC0xODQ3LDExICsxOTM5LDIwIEBACiAJICAgIH0KIAogCSAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLQkgIHMtPnNpemUgKz0gKFNQQVJDX0VMRl9XT1JEX0JZVEVTKGh0YWIpID09IDggPwotCQkgICAgICBQTFQ2NF9FTlRSWV9TSVpFIDogUExUMzJfRU5UUllfU0laRSk7CisJICBzLT5zaXplICs9IGh0YWItPnBsdF9lbnRyeV9zaXplOwogCiAJICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwogCSAgaHRhYi0+c3JlbHBsdC0+c2l6ZSArPSBTUEFSQ19FTEZfUkVMQV9CWVRFUyAoaHRhYik7CisKKwkgIGlmIChodGFiLT5pc192eHdvcmtzKQorCSAgICB7CisJICAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSAuZ290LnBsdCBlbnRyeS4gICovCisJICAgICAgaHRhYi0+c2dvdHBsdC0+c2l6ZSArPSA0OworCisJICAgICAgLyogLi4uYW5kIGZvciB0aGUgLnJlbGEucGx0LnVubG9hZGVkIHJlbG9jYXRpb25zLiAgKi8KKwkgICAgICBpZiAoIWluZm8tPnNoYXJlZCkKKwkJaHRhYi0+c3JlbHBsdDItPnNpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSAqIDM7CisJICAgIH0KIAl9CiAgICAgICBlbHNlCiAJewpAQCAtMjE1Myw2ICsyMjU0LDcgQEAKICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoJmh0YWItPmVsZiwgYWxsb2NhdGVfZHlucmVsb2NzLCAoUFRSKSBpbmZvKTsKIAogICBpZiAoISBBQklfNjRfUCAob3V0cHV0X2JmZCkKKyAgICAgICYmICFodGFiLT5pc192eHdvcmtzCiAgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKICAgICB7CiAgICAgICAvKiBNYWtlIHNwYWNlIGZvciB0aGUgdHJhaWxpbmcgbm9wIGluIC5wbHQuICAqLwpAQCAtMjE3OSw3ICsyMjgxLDggQEAKIAogICAgICAgaWYgKHMgPT0gaHRhYi0+c3BsdAogCSAgfHwgcyA9PSBodGFiLT5zZ290Ci0JICB8fCBzID09IGh0YWItPnNkeW5ic3MpCisJICB8fCBzID09IGh0YWItPnNkeW5ic3MKKwkgIHx8IHMgPT0gaHRhYi0+c2dvdHBsdCkKIAl7CiAJICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQogCSAgICAgY29tbWVudCBiZWxvdy4gICovCkBAIC0zNDI4LDYgKzM1MzEsOTcgQEAKICAgcmV0dXJuIFRSVUU7CiB9CiAKKy8qIEJ1aWxkIGEgVnhXb3JrcyBQTFQgZW50cnkuICBQTFRfSU5ERVggaXMgdGhlIGluZGV4IG9mIHRoZSBQTFQgZW50cnkKKyAgIGFuZCBQTFRfT0ZGU0VUIGlzIHRoZSBieXRlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiAucGx0LiAgR09UX09GRlNFVAorICAgaXMgdGhlIG9mZnNldCBvZiB0aGUgYXNzb2NpYXRlZCAuZ290LnBsdCBlbnRyeSBmcm9tCisgICBfR0xPQkFMX09GRlNFVF9UQUJMRV8uICAqLworCitzdGF0aWMgdm9pZAorc3BhcmNfdnh3b3Jrc19idWlsZF9wbHRfZW50cnkgKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCisJCQkgICAgICAgYmZkX3ZtYSBwbHRfb2Zmc2V0LCBiZmRfdm1hIHBsdF9pbmRleCwKKwkJCSAgICAgICBiZmRfdm1hIGdvdF9vZmZzZXQpCit7CisgIGJmZF92bWEgZ290X2Jhc2U7CisgIGNvbnN0IGJmZF92bWEgKnBsdF9lbnRyeTsKKyAgc3RydWN0IF9iZmRfc3BhcmNfZWxmX2xpbmtfaGFzaF90YWJsZSAqaHRhYjsKKyAgYmZkX2J5dGUgKmxvYzsKKyAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKKworICBodGFiID0gX2JmZF9zcGFyY19lbGZfaGFzaF90YWJsZSAoaW5mbyk7CisgIGlmIChpbmZvLT5zaGFyZWQpCisgICAgeworICAgICAgcGx0X2VudHJ5ID0gc3BhcmNfdnh3b3Jrc19zaGFyZWRfcGx0X2VudHJ5OworICAgICAgZ290X2Jhc2UgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBsdF9lbnRyeSA9IHNwYXJjX3Z4d29ya3NfZXhlY19wbHRfZW50cnk7CisgICAgICBnb3RfYmFzZSA9IChodGFiLT5lbGYuaGdvdC0+cm9vdC51LmRlZi52YWx1ZQorCQkgICsgaHRhYi0+ZWxmLmhnb3QtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAorCQkgICsgaHRhYi0+ZWxmLmhnb3QtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7CisgICAgfQorCisgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHBsdF9lbnRyeVswXSArICgoZ290X2Jhc2UgKyBnb3Rfb2Zmc2V0KSA+PiAxMCksCisJICAgICAgaHRhYi0+c3BsdC0+Y29udGVudHMgKyBwbHRfb2Zmc2V0KTsKKyAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcGx0X2VudHJ5WzFdICsgKChnb3RfYmFzZSArIGdvdF9vZmZzZXQpICYgMHgzZmYpLAorCSAgICAgIGh0YWItPnNwbHQtPmNvbnRlbnRzICsgcGx0X29mZnNldCArIDQpOworICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBwbHRfZW50cnlbMl0sCisJICAgICAgaHRhYi0+c3BsdC0+Y29udGVudHMgKyBwbHRfb2Zmc2V0ICsgOCk7CisgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHBsdF9lbnRyeVszXSwKKwkgICAgICBodGFiLT5zcGx0LT5jb250ZW50cyArIHBsdF9vZmZzZXQgKyAxMik7CisgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHBsdF9lbnRyeVs0XSwKKwkgICAgICBodGFiLT5zcGx0LT5jb250ZW50cyArIHBsdF9vZmZzZXQgKyAxNik7CisgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHBsdF9lbnRyeVs1XSArIChwbHRfaW5kZXggPj4gMTApLAorCSAgICAgIGh0YWItPnNwbHQtPmNvbnRlbnRzICsgcGx0X29mZnNldCArIDIwKTsKKyAgLyogUEMtcmVsYXRpdmUgZGlzcGxhY2VtZW50IGZvciBhIGJyYW5jaCB0byB0aGUgc3RhcnQgb2YKKyAgICAgdGhlIFBMVCBzZWN0aW9uLiAgKi8KKyAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcGx0X2VudHJ5WzZdICsgKCgoLXBsdF9vZmZzZXQgLSAyNCkgPj4gMikKKwkJCQkJICAmIDB4MDAzZmZmZmYpLAorCSAgICAgIGh0YWItPnNwbHQtPmNvbnRlbnRzICsgcGx0X29mZnNldCArIDI0KTsKKyAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcGx0X2VudHJ5WzddICsgKHBsdF9pbmRleCAmIDB4M2ZmKSwKKwkgICAgICBodGFiLT5zcGx0LT5jb250ZW50cyArIHBsdF9vZmZzZXQgKyAyOCk7CisKKyAgLyogRmlsbCBpbiB0aGUgLmdvdC5wbHQgZW50cnksIHBvaW50aW5nIGluaXRpYWxseSBhdCB0aGUKKyAgICAgc2Vjb25kIGhhbGYgb2YgdGhlIFBMVCBlbnRyeS4gICovCisgIEJGRF9BU1NFUlQgKGh0YWItPnNnb3RwbHQgIT0gTlVMTCk7CisgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJICAgICAgaHRhYi0+c3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCSAgICAgICsgaHRhYi0+c3BsdC0+b3V0cHV0X29mZnNldAorCSAgICAgICsgcGx0X29mZnNldCArIDIwLAorCSAgICAgIGh0YWItPnNnb3RwbHQtPmNvbnRlbnRzICsgZ290X29mZnNldCk7CisKKyAgLyogQWRkIHJlbG9jYXRpb25zIHRvIC5yZWxhLnBsdC51bmxvYWRlZC4gICovCisgIGlmICghaW5mby0+c2hhcmVkKQorICAgIHsKKyAgICAgIGxvYyA9IChodGFiLT5zcmVscGx0Mi0+Y29udGVudHMKKwkgICAgICsgKDIgKyAzICogcGx0X2luZGV4KSAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpOworCisgICAgICAvKiBSZWxvY2F0ZSB0aGUgaW5pdGlhbCBzZXRoaS4gICovCisgICAgICByZWxhLnJfb2Zmc2V0ID0gKGh0YWItPnNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgICsgaHRhYi0+c3BsdC0+b3V0cHV0X29mZnNldAorCQkgICAgICAgKyBwbHRfb2Zmc2V0KTsKKyAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChodGFiLT5lbGYuaGdvdC0+aW5keCwgUl9TUEFSQ19ISTIyKTsKKyAgICAgIHJlbGEucl9hZGRlbmQgPSBnb3Rfb2Zmc2V0OworICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsIGxvYyk7CisgICAgICBsb2MgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKKworICAgICAgLyogTGlrZXdpc2UgdGhlIGZvbGxvd2luZyBvci4gICovCisgICAgICByZWxhLnJfb2Zmc2V0ICs9IDQ7CisgICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaHRhYi0+ZWxmLmhnb3QtPmluZHgsIFJfU1BBUkNfTE8xMCk7CisgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwgbG9jKTsKKyAgICAgIGxvYyArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOworCisgICAgICAvKiBSZWxvY2F0ZSB0aGUgLmdvdC5wbHQgZW50cnkuICAqLworICAgICAgcmVsYS5yX29mZnNldCA9IChodGFiLT5zZ290cGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICArIGh0YWItPnNnb3RwbHQtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgICsgZ290X29mZnNldCk7CisgICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaHRhYi0+ZWxmLmhwbHQtPmluZHgsIFJfU1BBUkNfMzIpOworICAgICAgcmVsYS5yX2FkZGVuZCA9IHBsdF9vZmZzZXQgKyAyMDsKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLCBsb2MpOworICAgIH0KK30KKwogLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCiAgICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwogCkBAIC0zNDQ5LDcgKzM2NDMsNyBAQAogICAgICAgYXNlY3Rpb24gKnNyZWxhOwogICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKICAgICAgIGJmZF9ieXRlICpsb2M7Ci0gICAgICBiZmRfdm1hIHJfb2Zmc2V0OworICAgICAgYmZkX3ZtYSByX29mZnNldCwgZ290X29mZnNldDsKICAgICAgIGludCByZWxhX2luZGV4OwogCiAgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIFBMVC4gIFNldCBpdCB1cC4gICovCkBAIC0zNDYwLDIzICszNjU0LDQ4IEBACiAgICAgICBzcmVsYSA9IGh0YWItPnNyZWxwbHQ7CiAgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7CiAKLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICByZWxhX2luZGV4ID0gU1BBUkNfRUxGX0JVSUxEX1BMVF9FTlRSWSAoaHRhYiwgb3V0cHV0X2JmZCwgc3BsdCwKLQkJCQkJICAgICAgaC0+cGx0Lm9mZnNldCwgc3BsdC0+c2l6ZSwKLQkJCQkJICAgICAgJnJfb2Zmc2V0KTsKLQogICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbGEucl9vZmZzZXQgPSByX29mZnNldAotCSsgKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmICghIEFCSV82NF9QIChvdXRwdXRfYmZkKQotCSAgfHwgaC0+cGx0Lm9mZnNldCA8IChQTFQ2NF9MQVJHRV9USFJFU0hPTEQgKiBQTFQ2NF9FTlRSWV9TSVpFKSkKKyAgICAgIGlmIChodGFiLT5pc192eHdvcmtzKQogCXsKKwkgIC8qIFdvcmsgb3V0IHRoZSBpbmRleCBvZiB0aGlzIFBMVCBlbnRyeS4gICovCisJICByZWxhX2luZGV4ID0gKChoLT5wbHQub2Zmc2V0IC0gaHRhYi0+cGx0X2hlYWRlcl9zaXplKQorCQkJLyBodGFiLT5wbHRfZW50cnlfc2l6ZSk7CisKKwkgIC8qIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IG9mIHRoZSBhc3NvY2lhdGVkIC5nb3QucGx0IGVudHJ5LgorCSAgICAgVGhlIGZpcnN0IHRocmVlIGVudHJpZXMgYXJlIHJlc2VydmVkLiAgKi8KKwkgIGdvdF9vZmZzZXQgPSAocmVsYV9pbmRleCArIDMpICogNDsKKworCSAgc3BhcmNfdnh3b3Jrc19idWlsZF9wbHRfZW50cnkgKG91dHB1dF9iZmQsIGluZm8sIGgtPnBsdC5vZmZzZXQsCisJCQkJCSByZWxhX2luZGV4LCBnb3Rfb2Zmc2V0KTsKKworCisJICAvKiBPbiBWeFdvcmtzLCB0aGUgcmVsb2NhdGlvbiBwb2ludHMgdG8gdGhlIC5nb3QucGx0IGVudHJ5LAorCSAgICAgbm90IHRoZSAucGx0IGVudHJ5LiAgKi8KKwkgIHJlbGEucl9vZmZzZXQgPSAoaHRhYi0+c2dvdHBsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgKyBodGFiLT5zZ290cGx0LT5vdXRwdXRfb2Zmc2V0CisJCQkgICArIGdvdF9vZmZzZXQpOwogCSAgcmVsYS5yX2FkZGVuZCA9IDA7CiAJfQogICAgICAgZWxzZQogCXsKLQkgIHJlbGEucl9hZGRlbmQgPSAtKGgtPnBsdC5vZmZzZXQgKyA0KQotCQkJICAtKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0KTsKKwkgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisJICByZWxhX2luZGV4ID0gU1BBUkNfRUxGX0JVSUxEX1BMVF9FTlRSWSAoaHRhYiwgb3V0cHV0X2JmZCwgc3BsdCwKKwkJCQkJCSAgaC0+cGx0Lm9mZnNldCwgc3BsdC0+c2l6ZSwKKwkJCQkJCSAgJnJfb2Zmc2V0KTsKKworCSAgcmVsYS5yX29mZnNldCA9IHJfb2Zmc2V0CisJICAgICsgKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0KTsKKwkgIGlmICghIEFCSV82NF9QIChvdXRwdXRfYmZkKQorCSAgICAgIHx8IGgtPnBsdC5vZmZzZXQgPCAoUExUNjRfTEFSR0VfVEhSRVNIT0xEICogUExUNjRfRU5UUllfU0laRSkpCisJICAgIHsKKwkgICAgICByZWxhLnJfYWRkZW5kID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcmVsYS5yX2FkZGVuZCA9ICgtKGgtPnBsdC5vZmZzZXQgKyA0KQorCQkJICAgICAgIC0gc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICAgIC0gc3BsdC0+b3V0cHV0X29mZnNldCk7CisJICAgIH0KIAl9CiAgICAgICByZWxhLnJfaW5mbyA9IFNQQVJDX0VMRl9SX0lORk8gKGh0YWIsIE5VTEwsIGgtPmR5bmluZHgsIFJfU1BBUkNfSk1QX1NMT1QpOwogCkBAIC0zNTc3LDEwICszNzk2LDEyIEBACiAgICAgICBTUEFSQ19FTEZfQVBQRU5EX1JFTEEgKGh0YWIsIG91dHB1dF9iZmQsIHMsICZyZWxhKTsKICAgICB9CiAKLSAgLyogTWFyayBzb21lIHNwZWNpYWxseSBkZWZpbmVkIHN5bWJvbHMgYXMgYWJzb2x1dGUuICAqLworICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gIE9uIFZ4V29ya3MsCisgICAgIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBub3QgYWJzb2x1dGU6IGl0IGlzIHJlbGF0aXZlIHRvIHRoZQorICAgICAiLmdvdCIgc2VjdGlvbi4gIExpa2V3aXNlIF9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8gYW5kICIucGx0Ii4gICovCiAgIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IGggPT0gaHRhYi0+ZWxmLmhnb3QKLSAgICAgIHx8IGggPT0gaHRhYi0+ZWxmLmhwbHQpCisgICAgICB8fCAoIWh0YWItPmlzX3Z4d29ya3MKKwkgICYmIChoID09IGh0YWItPmVsZi5oZ290IHx8IGggPT0gaHRhYi0+ZWxmLmhwbHQpKSkKICAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKIAogICByZXR1cm4gVFJVRTsKQEAgLTM2NDgsMTMgKzM4NjksMTQgQEAKICNlbmRpZgogCiBzdGF0aWMgYmZkX2Jvb2xlYW4KLXNwYXJjMzJfZmluaXNoX2R5biAoYmZkICpvdXRwdXRfYmZkLAotCQkgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRCwKK3NwYXJjMzJfZmluaXNoX2R5biAoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKIAkJICAgIGJmZCAqZHlub2JqLCBhc2VjdGlvbiAqc2R5biwKIAkJICAgIGFzZWN0aW9uICpzcGx0IEFUVFJJQlVURV9VTlVTRUQpCiB7CiAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOworICBzdHJ1Y3QgX2JmZF9zcGFyY19lbGZfbGlua19oYXNoX3RhYmxlICpodGFiOwogCisgIGh0YWIgPSBfYmZkX3NwYXJjX2VsZl9oYXNoX3RhYmxlIChpbmZvKTsKICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5zaXplKTsKICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCkBAIC0zNjY1LDM0ICszODg3LDE1MCBAQAogCiAgICAgICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKIAotICAgICAgc3dpdGNoIChkeW4uZF90YWcpCisgICAgICBpZiAoaHRhYi0+aXNfdnh3b3JrcyAmJiBkeW4uZF90YWcgPT0gRFRfUkVMQVNaKQogCXsKLQljYXNlIERUX1BMVEdPVDogICBuYW1lID0gIi5wbHQiOyBzaXplID0gRkFMU0U7IGJyZWFrOwotCWNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IFRSVUU7IGJyZWFrOwotCWNhc2UgRFRfSk1QUkVMOiAgIG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IEZBTFNFOyBicmVhazsKLQlkZWZhdWx0OgkgIG5hbWUgPSBOVUxMOyBzaXplID0gRkFMU0U7IGJyZWFrOwotCX0KLQotICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgIGlmIChzID09IE5VTEwpCi0JICAgIGR5bi5kX3VuLmRfdmFsID0gMDsKLQkgIGVsc2UKKwkgIC8qIE9uIFZ4V29ya3MsIERUX1JFTEFTWiBzaG91bGQgbm90IGluY2x1ZGUgdGhlIHJlbG9jYXRpb25zCisJICAgICBpbiAucmVsYS5wbHQuICAqLworCSAgaWYgKGh0YWItPnNyZWxwbHQpCiAJICAgIHsKLQkgICAgICBpZiAoISBzaXplKQotCQlkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+c2l6ZTsKKwkgICAgICBkeW4uZF91bi5kX3ZhbCAtPSBodGFiLT5zcmVscGx0LT5zaXplOworCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7CiAJICAgIH0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7CisJfQorICAgICAgZWxzZSBpZiAoaHRhYi0+aXNfdnh3b3JrcyAmJiBkeW4uZF90YWcgPT0gRFRfUExUR09UKQorCXsKKwkgIC8qIE9uIFZ4V29ya3MsIERUX1BMVEdPVCBzaG91bGQgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBHT1QsCisJICAgICBub3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSBQTFQuICAqLworCSAgaWYgKGh0YWItPnNnb3RwbHQpCisJICAgIHsKKwkgICAgICBkeW4uZF91bi5kX3ZhbCA9IChodGFiLT5zZ290cGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJKyBodGFiLT5zZ290cGx0LT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN3aXRjaCAoZHluLmRfdGFnKQorCSAgICB7CisJICAgIGNhc2UgRFRfUExUR09UOiAgIG5hbWUgPSAiLnBsdCI7IHNpemUgPSBGQUxTRTsgYnJlYWs7CisJICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IFRSVUU7IGJyZWFrOworCSAgICBjYXNlIERUX0pNUFJFTDogICBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSBGQUxTRTsgYnJlYWs7CisJICAgIGRlZmF1bHQ6CSAgbmFtZSA9IE5VTEw7IHNpemUgPSBGQUxTRTsgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKG5hbWUgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpzOworCisJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKKwkgICAgICBpZiAocyA9PSBOVUxMKQorCQlkeW4uZF91bi5kX3ZhbCA9IDA7CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKCEgc2l6ZSkKKwkJICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOworCQkgIGVsc2UKKwkJICAgIGR5bi5kX3VuLmRfdmFsID0gcy0+c2l6ZTsKKwkJfQorCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7CisJICAgIH0KIAl9CiAgICAgfQogICByZXR1cm4gVFJVRTsKIH0KIAorLyogSW5zdGFsbCB0aGUgZmlyc3QgUExUIGVudHJ5IGluIGEgVnhXb3JrcyBleGVjdXRhYmxlIGFuZCBtYWtlIHN1cmUgdGhhdAorICAgLnJlbGEucGx0LnVubG9hZGVkIHJlbG9jYXRpb25zIGhhdmUgdGhlIGNvcnJlY3Qgc3ltYm9sIGluZGV4ZXMuICAqLworCitzdGF0aWMgdm9pZAorc3BhcmNfdnh3b3Jrc19maW5pc2hfZXhlY19wbHQgKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pCit7CisgIHN0cnVjdCBfYmZkX3NwYXJjX2VsZl9saW5rX2hhc2hfdGFibGUgKmh0YWI7CisgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7CisgIGJmZF92bWEgZ290X2Jhc2U7CisgIGJmZF9ieXRlICpsb2M7CisKKyAgaHRhYiA9IF9iZmRfc3BhcmNfZWxmX2hhc2hfdGFibGUgKGluZm8pOworCisgIC8qIENhbGN1bGF0ZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLiAgKi8KKyAgZ290X2Jhc2UgPSAoaHRhYi0+ZWxmLmhnb3QtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCSAgICAgICsgaHRhYi0+ZWxmLmhnb3QtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAorCSAgICAgICsgaHRhYi0+ZWxmLmhnb3QtPnJvb3QudS5kZWYudmFsdWUpOworCisgIC8qIEluc3RhbGwgdGhlIGluaXRpYWwgUExUIGVudHJ5LiAgKi8KKyAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkgICAgICBzcGFyY192eHdvcmtzX2V4ZWNfcGx0MF9lbnRyeVswXSArICgoZ290X2Jhc2UgKyA4KSA+PiAxMCksCisJICAgICAgaHRhYi0+c3BsdC0+Y29udGVudHMpOworICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAorCSAgICAgIHNwYXJjX3Z4d29ya3NfZXhlY19wbHQwX2VudHJ5WzFdICsgKChnb3RfYmFzZSArIDgpICYgMHgzZmYpLAorCSAgICAgIGh0YWItPnNwbHQtPmNvbnRlbnRzICsgNCk7CisgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJICAgICAgc3BhcmNfdnh3b3Jrc19leGVjX3BsdDBfZW50cnlbMl0sCisJICAgICAgaHRhYi0+c3BsdC0+Y29udGVudHMgKyA4KTsKKyAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkgICAgICBzcGFyY192eHdvcmtzX2V4ZWNfcGx0MF9lbnRyeVszXSwKKwkgICAgICBodGFiLT5zcGx0LT5jb250ZW50cyArIDEyKTsKKyAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkgICAgICBzcGFyY192eHdvcmtzX2V4ZWNfcGx0MF9lbnRyeVs0XSwKKwkgICAgICBodGFiLT5zcGx0LT5jb250ZW50cyArIDE2KTsKKworICBsb2MgPSBodGFiLT5zcmVscGx0Mi0+Y29udGVudHM7CisKKyAgLyogQWRkIGFuIHVubG9hZGVkIHJlbG9jYXRpb24gZm9yIHRoZSBpbml0aWFsIGVudHJ5J3MgInNldGhpIi4gICovCisgIHJlbGEucl9vZmZzZXQgPSAoaHRhYi0+c3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICArIGh0YWItPnNwbHQtPm91dHB1dF9vZmZzZXQpOworICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaHRhYi0+ZWxmLmhnb3QtPmluZHgsIFJfU1BBUkNfSEkyMik7CisgIHJlbGEucl9hZGRlbmQgPSA4OworICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwgbG9jKTsKKyAgbG9jICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7CisKKyAgLyogTGlrZXdpc2UgdGhlIGZvbGxvd2luZyAib3IiLiAgKi8KKyAgcmVsYS5yX29mZnNldCArPSA0OworICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaHRhYi0+ZWxmLmhnb3QtPmluZHgsIFJfU1BBUkNfTE8xMCk7CisgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLCBsb2MpOworICBsb2MgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKKworICAvKiBGaXggdXAgdGhlIHJlbWFpbmluZyAucmVsYS5wbHQudW5sb2FkZWQgcmVsb2NhdGlvbnMuICBUaGV5IG1heSBoYXZlCisgICAgIHRoZSB3cm9uZyBzeW1ib2wgaW5kZXggZm9yIF9HX09fVF8gb3IgX1BfTF9UXyBkZXBlbmRpbmcgb24gdGhlIG9yZGVyCisgICAgIGluIHdoaWNoIHN5bWJvbHMgd2VyZSBvdXRwdXQuICAqLworICB3aGlsZSAobG9jIDwgaHRhYi0+c3JlbHBsdDItPmNvbnRlbnRzICsgaHRhYi0+c3JlbHBsdDItPnNpemUpCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsOworCisgICAgICAvKiBUaGUgZW50cnkncyBpbml0aWFsICJzZXRoaSIgKGFnYWluc3QgX0dfT19UXykuICAqLworICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NfaW4gKG91dHB1dF9iZmQsIGxvYywgJnJlbCk7CisgICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChodGFiLT5lbGYuaGdvdC0+aW5keCwgUl9TUEFSQ19ISTIyKTsKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwgbG9jKTsKKyAgICAgIGxvYyArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOworCisgICAgICAvKiBUaGUgZm9sbG93aW5nICJvciIgKGFsc28gYWdhaW5zdCBfR19PX1RfKS4gICovCisgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19pbiAob3V0cHV0X2JmZCwgbG9jLCAmcmVsKTsKKyAgICAgIHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGh0YWItPmVsZi5oZ290LT5pbmR4LCBSX1NQQVJDX0xPMTApOworICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLCBsb2MpOworICAgICAgbG9jICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7CisKKyAgICAgIC8qIFRoZSAuZ290LnBsdCBlbnRyeSAoYWdhaW5zdCBfUF9MX1RfKS4gICovCisgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19pbiAob3V0cHV0X2JmZCwgbG9jLCAmcmVsKTsKKyAgICAgIHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGh0YWItPmVsZi5ocGx0LT5pbmR4LCBSX1NQQVJDXzMyKTsKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwgbG9jKTsKKyAgICAgIGxvYyArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOworICAgIH0KK30KKworLyogSW5zdGFsbCB0aGUgZmlyc3QgUExUIGVudHJ5IGluIGEgVnhXb3JrcyBzaGFyZWQgb2JqZWN0LiAgKi8KKworc3RhdGljIHZvaWQKK3NwYXJjX3Z4d29ya3NfZmluaXNoX3NoYXJlZF9wbHQgKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pCit7CisgIHN0cnVjdCBfYmZkX3NwYXJjX2VsZl9saW5rX2hhc2hfdGFibGUgKmh0YWI7CisgIHVuc2lnbmVkIGludCBpOworCisgIGh0YWIgPSBfYmZkX3NwYXJjX2VsZl9oYXNoX3RhYmxlIChpbmZvKTsKKyAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUgKHNwYXJjX3Z4d29ya3Nfc2hhcmVkX3BsdDBfZW50cnkpOyBpKyspCisgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgc3BhcmNfdnh3b3Jrc19zaGFyZWRfcGx0MF9lbnRyeVtpXSwKKwkJaHRhYi0+c3BsdC0+Y29udGVudHMgKyBpICogNCk7Cit9CisKIGJmZF9ib29sZWFuCiBfYmZkX3NwYXJjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykKIHsKQEAgLTM3MjYsMTggKzQwNjQsMjQgQEAKICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSAucGx0IHNlY3Rpb24uICAqLwogICAgICAgaWYgKHNwbHQtPnNpemUgPiAwKQogCXsKLQkgIGlmIChBQklfNjRfUCAob3V0cHV0X2JmZCkpCi0JICAgIG1lbXNldCAoc3BsdC0+Y29udGVudHMsIDAsIDQgKiBQTFQ2NF9FTlRSWV9TSVpFKTsKKwkgIGlmIChodGFiLT5pc192eHdvcmtzKQorCSAgICB7CisJICAgICAgaWYgKGluZm8tPnNoYXJlZCkKKwkJc3BhcmNfdnh3b3Jrc19maW5pc2hfc2hhcmVkX3BsdCAob3V0cHV0X2JmZCwgaW5mbyk7CisJICAgICAgZWxzZQorCQlzcGFyY192eHdvcmtzX2ZpbmlzaF9leGVjX3BsdCAob3V0cHV0X2JmZCwgaW5mbyk7CisJICAgIH0KIAkgIGVsc2UKIAkgICAgewotCSAgICAgIG1lbXNldCAoc3BsdC0+Y29udGVudHMsIDAsIDQgKiBQTFQzMl9FTlRSWV9TSVpFKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgU1BBUkNfTk9QLAotCQkJICBzcGx0LT5jb250ZW50cyArIHNwbHQtPnNpemUgLSA0KTsKKwkgICAgICBtZW1zZXQgKHNwbHQtPmNvbnRlbnRzLCAwLCBodGFiLT5wbHRfaGVhZGVyX3NpemUpOworCSAgICAgIGlmICghQUJJXzY0X1AgKG91dHB1dF9iZmQpKQorCQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgU1BBUkNfTk9QLAorCQkJICAgIHNwbHQtPmNvbnRlbnRzICsgc3BsdC0+c2l6ZSAtIDQpOwogCSAgICB9CiAJfQogCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPQotCShBQklfNjRfUCAob3V0cHV0X2JmZCkgPyBQTFQ2NF9FTlRSWV9TSVpFIDogUExUMzJfRU5UUllfU0laRSk7CisgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUKKwk9IGh0YWItPnBsdF9lbnRyeV9zaXplOwogICAgIH0KIAogICAvKiBTZXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHRvIHRoZSBhZGRyZXNzIG9mCmRpZmYgLS1naXQgYS9iZmQvZWxmeHgtc3BhcmMuaCBiL2JmZC9lbGZ4eC1zcGFyYy5oCmluZGV4IDYyNGFlYTUyNy4uMGE1YTg4YiAxMDA2NDQKLS0tIGEvYmZkL2VsZnh4LXNwYXJjLmgKKysrIGIvYmZkL2VsZnh4LXNwYXJjLmgKQEAgLTYxLDYgKzYxLDE1IEBACiAgIC8qIFNtYWxsIGxvY2FsIHN5bSB0byBzZWN0aW9uIG1hcHBpbmcgY2FjaGUuICAqLwogICBzdHJ1Y3Qgc3ltX3NlY19jYWNoZSBzeW1fc2VjOwogCisgIC8qIFRydWUgaWYgdGhlIHRhcmdldCBzeXN0ZW0gaXMgVnhXb3Jrcy4gICovCisgIGludCBpc192eHdvcmtzOworCisgIC8qIFRoZSAodW5sb2FkZWQgYnV0IGltcG9ydGFudCkgLnJlbGEucGx0LnVubG9hZGVkIHNlY3Rpb24sIGZvciBWeFdvcmtzLiAgKi8KKyAgYXNlY3Rpb24gKnNyZWxwbHQyOworCisgIC8qIC5nb3QucGx0IGlzIG9ubHkgdXNlZCBvbiBWeFdvcmtzLiAgKi8KKyAgYXNlY3Rpb24gKnNnb3RwbHQ7CisKICAgdm9pZCAoKnB1dF93b3JkKSAoYmZkICosIGJmZF92bWEsIHZvaWQgKik7CiAgIHZvaWQgKCphcHBlbmRfcmVsYSkgKGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKTsKICAgYmZkX3ZtYSAoKnJfaW5mbykgKEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF92bWEsIGJmZF92bWEpOwpAQCAtNzAsNiArNzksOCBAQAogICBpbnQgZHluYW1pY19pbnRlcnByZXRlcl9zaXplOwogICB1bnNpZ25lZCBpbnQgd29yZF9hbGlnbl9wb3dlcjsKICAgdW5zaWduZWQgaW50IGFsaWduX3Bvd2VyX21heDsKKyAgdW5zaWduZWQgaW50IHBsdF9oZWFkZXJfc2l6ZTsKKyAgdW5zaWduZWQgaW50IHBsdF9lbnRyeV9zaXplOwogICBpbnQgYnl0ZXNfcGVyX3dvcmQ7CiAgIGludCBieXRlc19wZXJfcmVsYTsKICAgaW50IGR0cG9mZl9yZWxvYzsKZGlmZiAtLWdpdCBhL2JmZC9wby9NYWtlLWluIGIvYmZkL3BvL01ha2UtaW4KaW5kZXggMDg4NWI2Zi4uMWYzM2MyZiAxMDA2NDQKLS0tIGEvYmZkL3BvL01ha2UtaW4KKysrIGIvYmZkL3BvL01ha2UtaW4KQEAgLTEsNiArMSw2IEBACiAjIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KICMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIyBDb3B5cmlnaHQgMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29weXJpZ2h0IDIwMDEsIDIwMDMsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjCiAjIFRoaXMgZmlsZSBtYXkgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgogIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKQEAgLTEyMyw2ICsxMjMsNyBAQAogaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQogaW5zdGFsbC1leGVjOgogaW5zdGFsbC1pbmZvOgoraW5zdGFsbC1odG1sOgogaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACiBpbnN0YWxsLWRhdGEtbm86IGFsbAogaW5zdGFsbC1kYXRhLXllczogYWxsCmRpZmYgLS1naXQgYS9iZmQvcG8vU1JDLVBPVEZJTEVTLmluIGIvYmZkL3BvL1NSQy1QT1RGSUxFUy5pbgppbmRleCAxYzExNDgwLi44YmNmOTc5IDEwMDY0NAotLS0gYS9iZmQvcG8vU1JDLVBPVEZJTEVTLmluCisrKyBiL2JmZC9wby9TUkMtUE9URklMRVMuaW4KQEAgLTExNSw2ICsxMTUsNyBAQAogY3B1LXZheC5jCiBjcHUtdzY1LmMKIGNwdS13ZTMyay5jCitjcHUteGMxNnguYwogY3B1LXhzdG9ybXkxNi5jCiBjcHUteHRlbnNhLmMKIGNwdS16ODAuYwpAQCAtMTc0LDYgKzE3NSw3IEBACiBlbGYzMi1zcGFyYy5jCiBlbGYzMi12ODUwLmMKIGVsZjMyLXZheC5jCitlbGYzMi14YzE2eC5jCiBlbGYzMi14c3Rvcm15MTYuYwogZWxmMzIteHRlbnNhLmMKIGVsZjY0LWFscGhhLmMKZGlmZiAtLWdpdCBhL2JmZC90YXJnZXRzLmMgYi9iZmQvdGFyZ2V0cy5jCmluZGV4IDA2NDkxNzkuLjg0OWViOTQgMTAwNjQ0Ci0tLSBhL2JmZC90YXJnZXRzLmMKKysrIGIvYmZkL3RhcmdldHMuYwpAQCAtNjM0LDYgKzYzNCw3IEBACiBleHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfc2hsbmJzZF92ZWM7CiBleHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfc2huYnNkX3ZlYzsKIGV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zcGFyY192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfc3BhcmNfdnh3b3Jrc192ZWM7CiBleHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfdHJhZGJpZ21pcHNfdmVjOwogZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3RyYWRsaXR0bGVtaXBzX3ZlYzsKIGV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl91c19jcmlzX3ZlYzsKQEAgLTk0OCw2ICs5NDksNyBAQAogCSZiZmRfZWxmMzJfc2g2NGJsaW5fdmVjLAogI2VuZGlmCiAJJmJmZF9lbGYzMl9zcGFyY192ZWMsCisJJmJmZF9lbGYzMl9zcGFyY192eHdvcmtzX3ZlYywKIAkmYmZkX2VsZjMyX3RyYWRiaWdtaXBzX3ZlYywKIAkmYmZkX2VsZjMyX3RyYWRsaXR0bGVtaXBzX3ZlYywKIAkmYmZkX2VsZjMyX3VzX2NyaXNfdmVjLApkaWZmIC0tZ2l0IGEvYmZkL3ZlcnNpb24uaCBiL2JmZC92ZXJzaW9uLmgKaW5kZXggNjE2NjAxOS4uODk1NzcwOCAxMDA2NDQKLS0tIGEvYmZkL3ZlcnNpb24uaAorKysgYi9iZmQvdmVyc2lvbi5oCkBAIC0xLDMgKzEsMyBAQAotI2RlZmluZSBCRkRfVkVSU0lPTl9EQVRFIDIwMDYwMzMwCisjZGVmaW5lIEJGRF9WRVJTSU9OX0RBVEUgMjAwNjA0MjAKICNkZWZpbmUgQkZEX1ZFUlNJT04gQGJmZF92ZXJzaW9uQAogI2RlZmluZSBCRkRfVkVSU0lPTl9TVFJJTkcgQGJmZF92ZXJzaW9uX3N0cmluZ0AKZGlmZiAtLWdpdCBhL2JmZC93YXJuaW5nLm00IGIvYmZkL3dhcm5pbmcubTQKaW5kZXggMmUyZGQ0Mi4uYjM2NmNhZCAxMDA2NDQKLS0tIGEvYmZkL3dhcm5pbmcubTQKKysrIGIvYmZkL3dhcm5pbmcubTQKQEAgLTQsNyArNCw3IEBACiBHQ0NfV0FSTl9DRkxBR1M9Ii1XIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMiCiAKIEFDX0FSR19FTkFCTEUod2Vycm9yLAotICBbICAtLWVuYWJsZS13ZXJyb3IgICAgdHJlYXQgY29tcGlsZSB3YXJuaW5ncyBhcyBlcnJvcnNdLAorICBbICAtLWVuYWJsZS13ZXJyb3IgICAgICAgICB0cmVhdCBjb21waWxlIHdhcm5pbmdzIGFzIGVycm9yc10sCiAgIFtjYXNlICIke2VuYWJsZXZhbH0iIGluCiAgICAgIHllcyB8IHkpIEVSUk9SX09OX1dBUk5JTkc9InllcyIgOzsKICAgICAgbm8gfCBuKSAgRVJST1JfT05fV0FSTklORz0ibm8iIDs7CkBAIC0yNyw3ICsyNyw3IEBACiBmaQogCiBBQ19BUkdfRU5BQkxFKGJ1aWxkLXdhcm5pbmdzLAotWyAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3MgRW5hYmxlIGJ1aWxkLXRpbWUgY29tcGlsZXIgd2FybmluZ3NdLAorWyAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3MgZW5hYmxlIGJ1aWxkLXRpbWUgY29tcGlsZXIgd2FybmluZ3NdLAogW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KICAgeWVzKQlXQVJOX0NGTEFHUz0iJHtHQ0NfV0FSTl9DRkxBR1N9Ijs7CiAgIG5vKQlpZiB0ZXN0ICIke0dDQ30iID0geWVzIDsgdGhlbgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDJkYWUzZjEuLjczM2VhY2YgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTQzLDYgKzQzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCiBhY19oZWxwPSIkYWNfaGVscAogICAtLWVuYWJsZS13ZXJyb3IgICAgICAgICBlbmFibGUgLVdlcnJvciBpbiBib290c3RyYXAgc3RhZ2UyIGFuZCBsYXRlciIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1kYXRhcm9vdGRpcglVc2UgZGF0YXJvb3RkaXIgYXMgdGhlIGRhdGEgcm9vdCBkaXJlY3RvcnkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWRvY2RpcglJbnN0YWxsIGRvY3VtZW50YXRpb24gaW4gdGhpcyBkaXJlY3RvcnkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWh0bWxkaXIJSW5zdGFsbCBodG1sIGluIHRoaXMgZGlyZWN0b3J5LiIKIAogIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgogIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKQEAgLTYwMSw3ICs2MDcsNyBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjA1OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2MTE6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQogCiBob3N0X2FsaWFzPSRob3N0CiBjYXNlICIkaG9zdF9hbGlhcyIgaW4KQEAgLTYyMiw3ICs2MjgsNyBAQAogZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjI2OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorZWNobyAiY29uZmlndXJlOjYzMjogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKIAogdGFyZ2V0X2FsaWFzPSR0YXJnZXQKIGNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCkBAIC02NDAsNyArNjQ2LDcgQEAKIGVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDQ6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2NTA6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKIAogYnVpbGRfYWxpYXM9JGJ1aWxkCiBjYXNlICIkYnVpbGRfYWxpYXMiIGluCkBAIC02OTUsNyArNzAxLDcgQEAKICMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKICMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njk5OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3MDU6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQogaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTc0OCw3ICs3NTQsNyBAQAogdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzUyOiBjaGVja2luZyB3aGV0aGVyIGxuIHdvcmtzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3NTg6IGNoZWNraW5nIHdoZXRoZXIgbG4gd29ya3MiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjeF9jdl9wcm9nX0xOJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTc3Miw3ICs3NzgsNyBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzc2OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3ODI6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xMjQ3LDkgKzEyNTMsNiBAQAogICAqLSotdnh3b3JrcyopCiAgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIHRhcmdldC1saWJpYmVydHkgdGFyZ2V0LWxpYnN0ZGMrKy12MyAke2xpYmdjan0iCiAgICAgOzsKLSAgbTMyYy0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJzdGRjKystdjMiCi0gICAgOzsKICAgYWxwaGEqLWRlYy1vc2YqKQogICAgICMgbGQgd29ya3MsIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCiAgICAgIyBuZXdsaWIgaXMgbm90IDY0IGJpdCByZWFkeS4gIEknbSBub3Qgc3VyZSBhYm91dCBmaWxldXRpbHMuCkBAIC0xODU3LDcgKzE4NjAsNyBAQAogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NjE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MTg2NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE4ODcsNyArMTg5MCw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4OTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MTg5NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE5MzgsNyArMTk0MSw3IEBACiAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBjbDsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjE5NDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xOTcwLDcgKzE5NzMsNyBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTc0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorZWNobyAiY29uZmlndXJlOjE5Nzc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CiAKIGFjX2V4dD1jCiAjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCkBAIC0xOTgxLDEyICsxOTg0LDEyIEBACiAKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCiAKLSNsaW5lIDE5ODUgImNvbmZpZ3VyZSIKKyNsaW5lIDE5ODggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBtYWluKCl7cmV0dXJuKDApO30KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk5MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCiAgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KICAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCkBAIC0yMDEyLDEyICsyMDE1LDEyIEBACiAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMTY6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMDE5OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CiBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKIGNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAyMTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQorZWNobyAiY29uZmlndXJlOjIwMjQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMDI2LDcgKzIwMjksNyBAQAogICB5ZXM7CiAjZW5kaWYKIEVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMzA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgogICBhY19jdl9wcm9nX2djYz15ZXMKIGVsc2UKICAgYWNfY3ZfcHJvZ19nY2M9bm8KQEAgLTIwNDUsNyArMjA0OCw3IEBACiBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKIENGTEFHUz0KIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA0OTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMDUyOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMTEyLDcgKzIxMTUsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWduYXRiaW5kIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWduYXRiaW5kOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MjExOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0dOQVRCSU5EJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTIxNDQsNyArMjE0Nyw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ25hdGJpbmQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGduYXRiaW5kOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNDg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MjE1MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0dOQVRCSU5EJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTIxNzcsNyArMjE4MCw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGNvbXBpbGVyIGRyaXZlciB1bmRlcnN0YW5kcyBBZGEiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxODE6IGNoZWNraW5nIHdoZXRoZXIgY29tcGlsZXIgZHJpdmVyIHVuZGVyc3RhbmRzIEFkYSIgPiY1CitlY2hvICJjb25maWd1cmU6MjE4NDogY2hlY2tpbmcgd2hldGhlciBjb21waWxlciBkcml2ZXIgdW5kZXJzdGFuZHMgQWRhIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY3hfY3ZfY2NfZ2NjX3N1cHBvcnRzX2FkYScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMjA5LDcgKzIyMTIsNyBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIGNvbXBhcmUgYm9vdHN0cmFwcGVkIG9iamVjdHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMTM6IGNoZWNraW5nIGhvdyB0byBjb21wYXJlIGJvb3RzdHJhcHBlZCBvYmplY3RzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMjE2OiBjaGVja2luZyBob3cgdG8gY29tcGFyZSBib290c3RyYXBwZWQgb2JqZWN0cyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2NjX2N2X3Byb2dfY21wX3NraXAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjMwNyw5ICsyMzEwLDkgQEAKIENGTEFHUz0iJENGTEFHUyAkZ21waW5jIgogIyBDaGVjayBHTVAgYWN0dWFsbHkgd29ya3MKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjb3JyZWN0IHZlcnNpb24gb2YgZ21wLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMTE6IGNoZWNraW5nIGZvciBjb3JyZWN0IHZlcnNpb24gb2YgZ21wLmgiID4mNQorZWNobyAiY29uZmlndXJlOjIzMTQ6IGNoZWNraW5nIGZvciBjb3JyZWN0IHZlcnNpb24gb2YgZ21wLmgiID4mNQogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMxMyAiY29uZmlndXJlIgorI2xpbmUgMjMxNiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSAiZ21wLmgiCiBpbnQgbWFpbigpIHsKQEAgLTIzMjAsNyArMjMyMyw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzI0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMjc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CiBlbHNlCkBAIC0yMzMzLDEyICsyMzM2LDEyIEBACiAKIGlmIHRlc3QgeCIkaGF2ZV9nbXAiID0geHllczsgdGhlbgogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTVBGUiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMzNzogY2hlY2tpbmcgZm9yIE1QRlIiID4mNQorZWNobyAiY29uZmlndXJlOjIzNDA6IGNoZWNraW5nIGZvciBNUEZSIiA+JjUKIAogICBzYXZlZF9MSUJTPSIkTElCUyIKICAgTElCUz0iJExJQlMgJGdtcGxpYnMiCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNDIgImNvbmZpZ3VyZSIKKyNsaW5lIDIzNDUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGdtcC5oPgogI2luY2x1ZGUgPG1wZnIuaD4KQEAgLTIzNDYsNyArMjM0OSw3IEBACiBtcGZyX3QgbjsgbXBmcl9pbml0KG4pOwogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzUzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CiBlbHNlCkBAIC0zMzUwLDYgKzMzNTMsMjAgQEAKICAgRkxBR1NfRk9SX1RBUkdFVD0kRkxBR1NfRk9SX1RBUkdFVCcgLUwkJHIvJChIT1NUX1NVQkRJUikvbGQnCiBmaQogCisjIFNlYXJjaCBmb3Igb3RoZXIgdGFyZ2V0LXNwZWNpZmljIGxpbmtlciBzY3JpcHRzIGFuZCBzdWNoLgorY2FzZSAiJHt0YXJnZXR9IiBpbgorICBtMzJjLSotKiApCisgICAgaWYgdGVzdCAtZCAke3NyY2Rpcn0vbGliZ2xvc3MvbTMyYzsgdGhlbgorICAgICAgIyBUaGlzIGlzIGZvciBjcnQwLm8KKyAgICAgIEZMQUdTX0ZPUl9UQVJHRVQ9JEZMQUdTX0ZPUl9UQVJHRVQnIC1CJCRyLyQoVEFSR0VUX1NVQkRJUikvbGliZ2xvc3MvbTMyYycKKyAgICAgICMgVGhpcyBpcyBmb3IgcjhjLmxkCisgICAgICBGTEFHU19GT1JfVEFSR0VUPSRGTEFHU19GT1JfVEFSR0VUJyAtTCQkci8kKFRBUkdFVF9TVUJESVIpL2xpYmdsb3NzL20zMmMnCisgICAgICAjIFRoaXMgaXMgZm9yIGxpYm5vc3lzLmEKKyAgICAgIEZMQUdTX0ZPUl9UQVJHRVQ9JEZMQUdTX0ZPUl9UQVJHRVQnIC1MJCRyLyQoVEFSR0VUX1NVQkRJUikvbGliZ2xvc3MvbGlibm9zeXMnCisgICAgZmkKKyAgICA7OworZXNhYworCiAjIE1ha2VmaWxlIGZyYWdtZW50cy4KIGZvciBmcmFnIGluIGhvc3RfbWFrZWZpbGVfZnJhZyB0YXJnZXRfbWFrZWZpbGVfZnJhZyBhbHBoYWllZWVfZnJhZyBvc3BhY2VfZnJhZzsKIGRvCkBAIC0zMzk3LDcgKzM0MTQsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQwMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozNDE4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfWUFDQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0zNDM3LDcgKzM0NTQsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ0MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozNDU4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQklTT04nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzQ3Niw3ICszNDkzLDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0ODA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MzQ5NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX000JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTM1MTUsNyArMzUzMiw3IEBACiAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTE5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjM1MzY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzU1NSw3ICszNTcyLDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NTk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MzU3NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0ZMRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzU5NCw3ICszNjExLDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1OTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MzYxNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX01BS0VJTkZPJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTM2MjgsMTAgKzM2NDUsMTAgQEAKICAgKiIgdGV4aW5mbyAiKikgTUFLRUlORk89JyQkci8kKEJVSUxEX1NVQkRJUikvdGV4aW5mby9tYWtlaW5mby9tYWtlaW5mbycgOzsKICAgKikKIAotICAgICMgRm9yIGFuIGluc3RhbGxlZCBtYWtlaW5mbywgd2UgcmVxdWlyZSBpdCB0byBiZSBmcm9tIHRleGluZm8gNC4yIG9yCisgICAgIyBGb3IgYW4gaW5zdGFsbGVkIG1ha2VpbmZvLCB3ZSByZXF1aXJlIGl0IHRvIGJlIGZyb20gdGV4aW5mbyA0LjQgb3IKICAgICAjIGhpZ2hlciwgZWxzZSB3ZSB1c2UgdGhlICJtaXNzaW5nIiBkdW1teS4KICAgICBpZiAke01BS0VJTkZPfSAtLXZlcnNpb24gXAotICAgICAgIHwgZWdyZXAgJ3RleGluZm9bXjAtOV0qKFsxLTNdWzAtOV18NFwuWzItOV18WzUtOV0pJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICB8IGVncmVwICd0ZXhpbmZvW14wLTldKihbMS0zXVswLTldfDRcLls0LTldfFs1LTldKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICA6CiAgICAgZWxzZQogICAgICAgTUFLRUlORk89IiRNSVNTSU5HIG1ha2VpbmZvIgpAQCAtMzY0Nyw3ICszNjY0LDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2NTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MzY2ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0VYUEVDVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0zNjg4LDcgKzM3MDUsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozNzA5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUlVOVEVTVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0zNzM2LDcgKzM3NTMsNyBAQAogICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozNzU3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzc2Nyw3ICszNzg0LDcgQEAKICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6Mzc4ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTM4MTEsNyArMzgyOCw3IEBACiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODE1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjM4MzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0zODQyLDcgKzM4NTksNyBAQAogICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg0NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozODYzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzg4Niw3ICszOTAzLDcgQEAKICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4OTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MzkwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzkxNyw3ICszOTM0LDcgQEAKICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5MjE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MzkzODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzk2MSw3ICszOTc4LDcgQEAKICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5NjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6Mzk4MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTM5OTIsNyArNDAwOSw3IEBACiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTk2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjQwMTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC00MDM2LDcgKzQwNTMsNyBAQAogICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0MDU3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTElQTycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC00MDY3LDcgKzQwODQsNyBAQAogICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA3MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0MDg4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTElQTycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC00MTExLDcgKzQxMjgsNyBAQAogICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDExNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0MTMyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNDE0Miw3ICs0MTU5LDcgQEAKICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxNDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NDE2MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQxODYsNyArNDIwMyw3IEBACiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTkwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjQyMDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNDIxNyw3ICs0MjM0LDcgQEAKICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyMjE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NDIzODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC00MjU2LDcgKzQyNzMsNyBAQAogICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI2MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0Mjc3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfU1RSSVAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNDI4Nyw3ICs0MzA0LDcgQEAKICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyOTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NDMwODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1NUUklQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQzMjYsNyArNDM0Myw3IEBACiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzMwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjQzNDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19XSU5EUkVTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQzNTcsNyArNDM3NCw3IEBACiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzYxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjQzNzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19XSU5EUkVTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQ0MDEsNyArNDQxOCw3IEBACiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDA1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjQ0MjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19PQkpDT1BZJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQ0MzIsNyArNDQ0OSw3IEBACiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDM2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjQ0NTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19PQkpDT1BZJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQ0NzYsNyArNDQ5Myw3IEBACiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDgwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjQ0OTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19PQkpEVU1QJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQ1MDcsNyArNDUyNCw3IEBACiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTExOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjQ1Mjg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19PQkpEVU1QJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQ1NzEsNyArNDU4OCw3IEBACiAgaWYgdGVzdCAtbiAiJHdpdGhfYnVpbGRfdGltZV90b29scyI7IHRoZW4KICAgZm9yIG5jbl9wcm9nbmFtZSBpbiBjYyBnY2M7IGRvCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTc1OiBjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQorZWNobyAiY29uZmlndXJlOjQ1OTI6IGNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CiAgICAgaWYgdGVzdCAteCAkd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfTsgdGhlbgogICAgICAgYWNfY3ZfcHJvZ19DQ19GT1JfVEFSR0VUPSR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9CiAgICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CkBAIC00NTg4LDcgKzQ2MDUsNyBAQAogICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl90YXJnZXRfdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl90YXJnZXRfdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NDYwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNDYxOSw3ICs0NjM2LDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDYyMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NjQwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0NfRk9SX1RBUkdFVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC00NjYyLDcgKzQ2NzksNyBAQAogIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgIGZvciBuY25fcHJvZ25hbWUgaW4gYysrIGcrKyBjeHggZ3h4OyBkbwogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY2NjogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NjgzOiBjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQogICAgIGlmIHRlc3QgLXggJHdpdGhfYnVpbGRfdGltZV90b29scy8ke25jbl9wcm9nbmFtZX07IHRoZW4KICAgICAgIGFjX2N2X3Byb2dfQ1hYX0ZPUl9UQVJHRVQ9JHdpdGhfYnVpbGRfdGltZV90b29scy8ke25jbl9wcm9nbmFtZX0KICAgICAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKQEAgLTQ2NzksNyArNDY5Niw3IEBACiAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3RhcmdldF90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3RhcmdldF90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY4MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NzAwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1hYX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNDcxMCw3ICs0NzI3LDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDcxNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NzMxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1hYX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNDc1Myw3ICs0NzcwLDcgQEAKICBpZiB0ZXN0IC1uICIkd2l0aF9idWlsZF90aW1lX3Rvb2xzIjsgdGhlbgogICBmb3IgbmNuX3Byb2duYW1lIGluIGdjYzsgZG8KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3NTc6IGNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NDc3NDogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9OyB0aGVuCiAgICAgICBhY19jdl9wcm9nX0dDQ19GT1JfVEFSR0VUPSR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9CiAgICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CkBAIC00NzcwLDcgKzQ3ODcsNyBAQAogICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl90YXJnZXRfdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl90YXJnZXRfdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3NzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NDc5MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0dDQ19GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQ4MDEsNyArNDgxOCw3IEBACiAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4MDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NDgyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0dDQ19GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQ4MzksNyArNDg1Niw3IEBACiAgaWYgdGVzdCAtbiAiJHdpdGhfYnVpbGRfdGltZV90b29scyI7IHRoZW4KICAgZm9yIG5jbl9wcm9nbmFtZSBpbiBnY2o7IGRvCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODQzOiBjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQorZWNobyAiY29uZmlndXJlOjQ4NjA6IGNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CiAgICAgaWYgdGVzdCAteCAkd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfTsgdGhlbgogICAgICAgYWNfY3ZfcHJvZ19HQ0pfRk9SX1RBUkdFVD0kd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfQogICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgpAQCAtNDg1Niw3ICs0ODczLDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODYwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjQ4Nzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19HQ0pfRk9SX1RBUkdFVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC00ODg3LDcgKzQ5MDQsNyBAQAogICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODkxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjQ5MDg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19HQ0pfRk9SX1RBUkdFVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC00OTMwLDcgKzQ5NDcsNyBAQAogIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgIGZvciBuY25fcHJvZ25hbWUgaW4gZ2ZvcnRyYW47IGRvCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTM0OiBjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQorZWNobyAiY29uZmlndXJlOjQ5NTE6IGNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CiAgICAgaWYgdGVzdCAteCAkd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfTsgdGhlbgogICAgICAgYWNfY3ZfcHJvZ19HRk9SVFJBTl9GT1JfVEFSR0VUPSR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9CiAgICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CkBAIC00OTQ3LDcgKzQ5NjQsNyBAQAogICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl90YXJnZXRfdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl90YXJnZXRfdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5NTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NDk2ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0dGT1JUUkFOX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNDk3OCw3ICs0OTk1LDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDk4MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0OTk5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfR0ZPUlRSQU5fRk9SX1RBUkdFVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01MDg1LDcgKzUxMDIsNyBAQAogaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfQVJfRk9SX1RBUkdFVCIgOyB0aGVuCiAgIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFyIGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwODk6IGNoZWNraW5nIGZvciBhciBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1MTA2OiBjaGVja2luZyBmb3IgYXIgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CiAgICAgaWYgdGVzdCAteCAkd2l0aF9idWlsZF90aW1lX3Rvb2xzL2FyOyB0aGVuCiAgICAgICBBUl9GT1JfVEFSR0VUPWBjZCAkd2l0aF9idWlsZF90aW1lX3Rvb2xzICYmIHB3ZGAvYXIKICAgICAgIGFjX2N2X3BhdGhfQVJfRk9SX1RBUkdFVD0kQVJfRk9SX1RBUkdFVApAQCAtNTEwMyw3ICs1MTIwLDcgQEAKICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgYXI7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTEwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1MTI0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfQVJfRk9SX1RBUkdFVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01MTQwLDcgKzUxNTcsNyBAQAogICAgaWYgdGVzdCAtbiAiJHdpdGhfYnVpbGRfdGltZV90b29scyI7IHRoZW4KICAgZm9yIG5jbl9wcm9nbmFtZSBpbiBhcjsgZG8KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUxNDQ6IGNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NTE2MTogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9OyB0aGVuCiAgICAgICBhY19jdl9wcm9nX0FSX0ZPUl9UQVJHRVQ9JHdpdGhfYnVpbGRfdGltZV90b29scy8ke25jbl9wcm9nbmFtZX0KICAgICAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKQEAgLTUxNTcsNyArNTE3NCw3IEBACiAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3RhcmdldF90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3RhcmdldF90b29sX3ByZWZpeH0ke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTE2MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1MTc4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVJfRk9SX1RBUkdFVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01MTg4LDcgKzUyMDUsNyBAQAogICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl9wcm9nbmFtZX0iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTkyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjUyMDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUl9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTUyMzgsNyArNTI1NSw3IEBACiBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9BU19GT1JfVEFSR0VUIiA7IHRoZW4KICAgaWYgdGVzdCAtbiAiJHdpdGhfYnVpbGRfdGltZV90b29scyI7IHRoZW4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYXMgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTI0MjogY2hlY2tpbmcgZm9yIGFzIGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQorZWNobyAiY29uZmlndXJlOjUyNTk6IGNoZWNraW5nIGZvciBhcyBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvYXM7IHRoZW4KICAgICAgIEFTX0ZPUl9UQVJHRVQ9YGNkICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMgJiYgcHdkYC9hcwogICAgICAgYWNfY3ZfcGF0aF9BU19GT1JfVEFSR0VUPSRBU19GT1JfVEFSR0VUCkBAIC01MjU2LDcgKzUyNzMsNyBAQAogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBhczsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjYwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjUyNzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9BU19GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTUyOTMsNyArNTMxMCw3IEBACiAgICBpZiB0ZXN0IC1uICIkd2l0aF9idWlsZF90aW1lX3Rvb2xzIjsgdGhlbgogICBmb3IgbmNuX3Byb2duYW1lIGluIGFzOyBkbwogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTI5NzogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1MzE0OiBjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQogICAgIGlmIHRlc3QgLXggJHdpdGhfYnVpbGRfdGltZV90b29scy8ke25jbl9wcm9nbmFtZX07IHRoZW4KICAgICAgIGFjX2N2X3Byb2dfQVNfRk9SX1RBUkdFVD0kd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfQogICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgpAQCAtNTMxMCw3ICs1MzI3LDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MzE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjUzMzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BU19GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTUzNDEsNyArNTM1OCw3IEBACiAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUzNDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NTM2MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNTM5MSw3ICs1NDA4LDcgQEAKIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0RMTFRPT0xfRk9SX1RBUkdFVCIgOyB0aGVuCiAgIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsbHRvb2wgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTM5NTogY2hlY2tpbmcgZm9yIGRsbHRvb2wgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NTQxMjogY2hlY2tpbmcgZm9yIGRsbHRvb2wgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CiAgICAgaWYgdGVzdCAteCAkd2l0aF9idWlsZF90aW1lX3Rvb2xzL2RsbHRvb2w7IHRoZW4KICAgICAgIERMTFRPT0xfRk9SX1RBUkdFVD1gY2QgJHdpdGhfYnVpbGRfdGltZV90b29scyAmJiBwd2RgL2RsbHRvb2wKICAgICAgIGFjX2N2X3BhdGhfRExMVE9PTF9GT1JfVEFSR0VUPSRETExUT09MX0ZPUl9UQVJHRVQKQEAgLTU0MDksNyArNTQyNiw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NDEzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjU0MzA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9ETExUT09MX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNTQ0Niw3ICs1NDYzLDcgQEAKICAgIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgIGZvciBuY25fcHJvZ25hbWUgaW4gZGxsdG9vbDsgZG8KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU0NTA6IGNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NTQ2NzogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9OyB0aGVuCiAgICAgICBhY19jdl9wcm9nX0RMTFRPT0xfRk9SX1RBUkdFVD0kd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfQogICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgpAQCAtNTQ2Myw3ICs1NDgwLDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NDY3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjU0ODQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNTQ5NCw3ICs1NTExLDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTQ5ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1NTE1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTF9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTU1NDQsNyArNTU2MSw3IEBACiBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9MRF9GT1JfVEFSR0VUIiA7IHRoZW4KICAgaWYgdGVzdCAtbiAiJHdpdGhfYnVpbGRfdGltZV90b29scyI7IHRoZW4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTU0ODogY2hlY2tpbmcgZm9yIGxkIGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQorZWNobyAiY29uZmlndXJlOjU1NjU6IGNoZWNraW5nIGZvciBsZCBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvbGQ7IHRoZW4KICAgICAgIExEX0ZPUl9UQVJHRVQ9YGNkICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMgJiYgcHdkYC9sZAogICAgICAgYWNfY3ZfcGF0aF9MRF9GT1JfVEFSR0VUPSRMRF9GT1JfVEFSR0VUCkBAIC01NTYyLDcgKzU1NzksNyBAQAogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBsZDsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTY2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjU1ODM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRF9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTU1OTksNyArNTYxNiw3IEBACiAgICBpZiB0ZXN0IC1uICIkd2l0aF9idWlsZF90aW1lX3Rvb2xzIjsgdGhlbgogICBmb3IgbmNuX3Byb2duYW1lIGluIGxkOyBkbwogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTYwMzogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1NjIwOiBjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQogICAgIGlmIHRlc3QgLXggJHdpdGhfYnVpbGRfdGltZV90b29scy8ke25jbl9wcm9nbmFtZX07IHRoZW4KICAgICAgIGFjX2N2X3Byb2dfTERfRk9SX1RBUkdFVD0kd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfQogICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgpAQCAtNTYxNiw3ICs1NjMzLDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjIwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjU2Mzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRF9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTU2NDcsNyArNTY2NCw3IEBACiAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2NTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NTY2ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xEX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNTY5Nyw3ICs1NzE0LDcgQEAKIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0xJUE9fRk9SX1RBUkdFVCIgOyB0aGVuCiAgIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpcG8gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTcwMTogY2hlY2tpbmcgZm9yIGxpcG8gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NTcxODogY2hlY2tpbmcgZm9yIGxpcG8gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CiAgICAgaWYgdGVzdCAteCAkd2l0aF9idWlsZF90aW1lX3Rvb2xzL2xpcG87IHRoZW4KICAgICAgIExJUE9fRk9SX1RBUkdFVD1gY2QgJHdpdGhfYnVpbGRfdGltZV90b29scyAmJiBwd2RgL2xpcG8KICAgICAgIGFjX2N2X3BhdGhfTElQT19GT1JfVEFSR0VUPSRMSVBPX0ZPUl9UQVJHRVQKQEAgLTU3MTUsNyArNTczMiw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibGlwbyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgbGlwbzsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NzE5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjU3MzY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MSVBPX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNTc1Miw3ICs1NzY5LDcgQEAKICAgIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgIGZvciBuY25fcHJvZ25hbWUgaW4gbGlwbzsgZG8KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU3NTY6IGNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NTc3MzogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9OyB0aGVuCiAgICAgICBhY19jdl9wcm9nX0xJUE9fRk9SX1RBUkdFVD0kd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfQogICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgpAQCAtNTc2OSw3ICs1Nzg2LDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NzczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjU3OTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MSVBPX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNTgwMCw3ICs1ODE3LDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTgwNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1ODIxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTElQT19GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTU4NTAsNyArNTg2Nyw3IEBACiBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTV9GT1JfVEFSR0VUIiA7IHRoZW4KICAgaWYgdGVzdCAtbiAiJHdpdGhfYnVpbGRfdGltZV90b29scyI7IHRoZW4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTg1NDogY2hlY2tpbmcgZm9yIG5tIGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQorZWNobyAiY29uZmlndXJlOjU4NzE6IGNoZWNraW5nIGZvciBubSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvbm07IHRoZW4KICAgICAgIE5NX0ZPUl9UQVJHRVQ9YGNkICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMgJiYgcHdkYC9ubQogICAgICAgYWNfY3ZfcGF0aF9OTV9GT1JfVEFSR0VUPSROTV9GT1JfVEFSR0VUCkBAIC01ODY4LDcgKzU4ODUsNyBAQAogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm5tIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBubTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1ODcyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjU4ODk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTV9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTU5MDUsNyArNTkyMiw3IEBACiAgICBpZiB0ZXN0IC1uICIkd2l0aF9idWlsZF90aW1lX3Rvb2xzIjsgdGhlbgogICBmb3IgbmNuX3Byb2duYW1lIGluIG5tOyBkbwogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTkwOTogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1OTI2OiBjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQogICAgIGlmIHRlc3QgLXggJHdpdGhfYnVpbGRfdGltZV90b29scy8ke25jbl9wcm9nbmFtZX07IHRoZW4KICAgICAgIGFjX2N2X3Byb2dfTk1fRk9SX1RBUkdFVD0kd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfQogICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgpAQCAtNTkyMiw3ICs1OTM5LDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTI2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjU5NDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19OTV9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTU5NTMsNyArNTk3MCw3IEBACiAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU5NTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NTk3NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX05NX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjAwMyw3ICs2MDIwLDcgQEAKIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX09CSkRVTVBfRk9SX1RBUkdFVCIgOyB0aGVuCiAgIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9iamR1bXAgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjAwNzogY2hlY2tpbmcgZm9yIG9iamR1bXAgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NjAyNDogY2hlY2tpbmcgZm9yIG9iamR1bXAgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CiAgICAgaWYgdGVzdCAteCAkd2l0aF9idWlsZF90aW1lX3Rvb2xzL29iamR1bXA7IHRoZW4KICAgICAgIE9CSkRVTVBfRk9SX1RBUkdFVD1gY2QgJHdpdGhfYnVpbGRfdGltZV90b29scyAmJiBwd2RgL29iamR1bXAKICAgICAgIGFjX2N2X3BhdGhfT0JKRFVNUF9GT1JfVEFSR0VUPSRPQkpEVU1QX0ZPUl9UQVJHRVQKQEAgLTYwMjEsNyArNjAzOCw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgb2JqZHVtcDsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDI1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjYwNDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9PQkpEVU1QX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjA1OCw3ICs2MDc1LDcgQEAKICAgIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgIGZvciBuY25fcHJvZ25hbWUgaW4gb2JqZHVtcDsgZG8KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYwNjI6IGNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NjA3OTogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9OyB0aGVuCiAgICAgICBhY19jdl9wcm9nX09CSkRVTVBfRk9SX1RBUkdFVD0kd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfQogICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgpAQCAtNjA3NSw3ICs2MDkyLDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjYwOTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19PQkpEVU1QX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjEwNiw3ICs2MTIzLDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjExMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2MTI3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfT0JKRFVNUF9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTYxNTYsNyArNjE3Myw3IEBACiBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9SQU5MSUJfRk9SX1RBUkdFVCIgOyB0aGVuCiAgIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJhbmxpYiBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTYwOiBjaGVja2luZyBmb3IgcmFubGliIGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQorZWNobyAiY29uZmlndXJlOjYxNzc6IGNoZWNraW5nIGZvciByYW5saWIgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CiAgICAgaWYgdGVzdCAteCAkd2l0aF9idWlsZF90aW1lX3Rvb2xzL3JhbmxpYjsgdGhlbgogICAgICAgUkFOTElCX0ZPUl9UQVJHRVQ9YGNkICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMgJiYgcHdkYC9yYW5saWIKICAgICAgIGFjX2N2X3BhdGhfUkFOTElCX0ZPUl9UQVJHRVQ9JFJBTkxJQl9GT1JfVEFSR0VUCkBAIC02MTc0LDcgKzYxOTEsNyBAQAogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxNzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NjE5NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1JBTkxJQl9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTYyMTEsNyArNjIyOCw3IEBACiAgICBpZiB0ZXN0IC1uICIkd2l0aF9idWlsZF90aW1lX3Rvb2xzIjsgdGhlbgogICBmb3IgbmNuX3Byb2duYW1lIGluIHJhbmxpYjsgZG8KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyMTU6IGNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NjIzMjogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9OyB0aGVuCiAgICAgICBhY19jdl9wcm9nX1JBTkxJQl9GT1JfVEFSR0VUPSR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9CiAgICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CkBAIC02MjI4LDcgKzYyNDUsNyBAQAogICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke25jbl90YXJnZXRfdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl90YXJnZXRfdG9vbF9wcmVmaXh9JHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyMzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NjI0OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQl9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTYyNTksNyArNjI3Niw3IEBACiAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyNjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NjI4MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQl9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTYzMDksNyArNjMyNiw3IEBACiBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9TVFJJUF9GT1JfVEFSR0VUIiA7IHRoZW4KICAgaWYgdGVzdCAtbiAiJHdpdGhfYnVpbGRfdGltZV90b29scyI7IHRoZW4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RyaXAgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjMxMzogY2hlY2tpbmcgZm9yIHN0cmlwIGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQorZWNobyAiY29uZmlndXJlOjYzMzA6IGNoZWNraW5nIGZvciBzdHJpcCBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvc3RyaXA7IHRoZW4KICAgICAgIFNUUklQX0ZPUl9UQVJHRVQ9YGNkICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMgJiYgcHdkYC9zdHJpcAogICAgICAgYWNfY3ZfcGF0aF9TVFJJUF9GT1JfVEFSR0VUPSRTVFJJUF9GT1JfVEFSR0VUCkBAIC02MzI3LDcgKzYzNDQsNyBAQAogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MzMxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjYzNDg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9TVFJJUF9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTYzNjQsNyArNjM4MSw3IEBACiAgICBpZiB0ZXN0IC1uICIkd2l0aF9idWlsZF90aW1lX3Rvb2xzIjsgdGhlbgogICBmb3IgbmNuX3Byb2duYW1lIGluIHN0cmlwOyBkbwogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjM2ODogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2Mzg1OiBjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiID4mNQogICAgIGlmIHRlc3QgLXggJHdpdGhfYnVpbGRfdGltZV90b29scy8ke25jbl9wcm9nbmFtZX07IHRoZW4KICAgICAgIGFjX2N2X3Byb2dfU1RSSVBfRk9SX1RBUkdFVD0kd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfQogICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgpAQCAtNjM4MSw3ICs2Mzk4LDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Mzg1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjY0MDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19TVFJJUF9GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTY0MTIsNyArNjQyOSw3IEBACiAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fcHJvZ25hbWV9OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0MTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NjQzMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1NUUklQX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjQ2Miw3ICs2NDc5LDcgQEAKIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX1dJTkRSRVNfRk9SX1RBUkdFVCIgOyB0aGVuCiAgIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdpbmRyZXMgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQ2NjogY2hlY2tpbmcgZm9yIHdpbmRyZXMgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NjQ4MzogY2hlY2tpbmcgZm9yIHdpbmRyZXMgaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CiAgICAgaWYgdGVzdCAteCAkd2l0aF9idWlsZF90aW1lX3Rvb2xzL3dpbmRyZXM7IHRoZW4KICAgICAgIFdJTkRSRVNfRk9SX1RBUkdFVD1gY2QgJHdpdGhfYnVpbGRfdGltZV90b29scyAmJiBwd2RgL3dpbmRyZXMKICAgICAgIGFjX2N2X3BhdGhfV0lORFJFU19GT1JfVEFSR0VUPSRXSU5EUkVTX0ZPUl9UQVJHRVQKQEAgLTY0ODAsNyArNjQ5Nyw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAid2luZHJlcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgd2luZHJlczsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDg0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjY1MDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9XSU5EUkVTX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjUxNyw3ICs2NTM0LDcgQEAKICAgIGlmIHRlc3QgLW4gIiR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiOyB0aGVuCiAgIGZvciBuY25fcHJvZ25hbWUgaW4gd2luZHJlczsgZG8KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHtuY25fcHJvZ25hbWV9IGluICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY1MjE6IGNoZWNraW5nIGZvciAke25jbl9wcm9nbmFtZX0gaW4gJHdpdGhfYnVpbGRfdGltZV90b29scyIgPiY1CitlY2hvICJjb25maWd1cmU6NjUzODogY2hlY2tpbmcgZm9yICR7bmNuX3Byb2duYW1lfSBpbiAkd2l0aF9idWlsZF90aW1lX3Rvb2xzIiA+JjUKICAgICBpZiB0ZXN0IC14ICR3aXRoX2J1aWxkX3RpbWVfdG9vbHMvJHtuY25fcHJvZ25hbWV9OyB0aGVuCiAgICAgICBhY19jdl9wcm9nX1dJTkRSRVNfRk9SX1RBUkdFVD0kd2l0aF9idWlsZF90aW1lX3Rvb2xzLyR7bmNuX3Byb2duYW1lfQogICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgpAQCAtNjUzNCw3ICs2NTUxLDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHtuY25fdGFyZ2V0X3Rvb2xfcHJlZml4fSR7bmNuX3Byb2duYW1lfTsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NTM4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjY1NTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19XSU5EUkVTX0ZPUl9UQVJHRVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjU2NSw3ICs2NTgyLDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHtuY25fcHJvZ25hbWV9Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke25jbl9wcm9nbmFtZX07IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjU2OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2NTg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfV0lORFJFU19GT1JfVEFSR0VUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTY2MTMsNyArNjYzMCw3IEBACiBSQVdfQ1hYX0ZPUl9UQVJHRVQ9IiRDWFhfRk9SX1RBUkdFVCIKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGFyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NjE3OiBjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgYXIiID4mNQorZWNobyAiY29uZmlndXJlOjY2MzQ6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBhciIgPiY1CiBpZiB0ZXN0ICJ4JHtidWlsZH0iICE9ICJ4JHtob3N0fSIgOyB0aGVuCiAgIGlmIGV4cHIgIngkQVJfRk9SX1RBUkdFVCIgOiAieC8iID4gL2Rldi9udWxsOyB0aGVuCiAgICAgIyBXZSBhbHJlYWR5IGZvdW5kIHRoZSBjb21wbGV0ZSBwYXRoCkBAIC02NjQ2LDcgKzY2NjMsNyBAQAogICBmaQogZmkKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBhcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjY1MDogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGFzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2NjY3OiBjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgYXMiID4mNQogaWYgdGVzdCAieCR7YnVpbGR9IiAhPSAieCR7aG9zdH0iIDsgdGhlbgogICBpZiBleHByICJ4JEFTX0ZPUl9UQVJHRVQiIDogIngvIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICMgV2UgYWxyZWFkeSBmb3VuZCB0aGUgY29tcGxldGUgcGF0aApAQCAtNjY3OSw3ICs2Njk2LDcgQEAKICAgZmkKIGZpCiBlY2hvICRhY19uICJjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgY2MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY2ODM6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBjYyIgPiY1CitlY2hvICJjb25maWd1cmU6NjcwMDogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGNjIiA+JjUKIGlmIHRlc3QgIngke2J1aWxkfSIgIT0gIngke2hvc3R9IiA7IHRoZW4KICAgaWYgZXhwciAieCRDQ19GT1JfVEFSR0VUIiA6ICJ4LyIgPiAvZGV2L251bGw7IHRoZW4KICAgICAjIFdlIGFscmVhZHkgZm91bmQgdGhlIGNvbXBsZXRlIHBhdGgKQEAgLTY3MTIsNyArNjcyOSw3IEBACiAgIGZpCiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGMrKyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjcxNjogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGMrKyIgPiY1CitlY2hvICJjb25maWd1cmU6NjczMzogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGMrKyIgPiY1CiBpZiB0ZXN0ICJ4JHtidWlsZH0iICE9ICJ4JHtob3N0fSIgOyB0aGVuCiAgIGlmIGV4cHIgIngkQ1hYX0ZPUl9UQVJHRVQiIDogIngvIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICMgV2UgYWxyZWFkeSBmb3VuZCB0aGUgY29tcGxldGUgcGF0aApAQCAtNjc0OCw3ICs2NzY1LDcgQEAKICAgZmkKIGZpCiBlY2hvICRhY19uICJjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgYysrIGZvciBsaWJzdGRjKysiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3NTI6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBjKysgZm9yIGxpYnN0ZGMrKyIgPiY1CitlY2hvICJjb25maWd1cmU6Njc2OTogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGMrKyBmb3IgbGlic3RkYysrIiA+JjUKIGlmIHRlc3QgIngke2J1aWxkfSIgIT0gIngke2hvc3R9IiA7IHRoZW4KICAgaWYgZXhwciAieCRSQVdfQ1hYX0ZPUl9UQVJHRVQiIDogIngvIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICMgV2UgYWxyZWFkeSBmb3VuZCB0aGUgY29tcGxldGUgcGF0aApAQCAtNjc4NCw3ICs2ODAxLDcgQEAKICAgZmkKIGZpCiBlY2hvICRhY19uICJjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgZGxsdG9vbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc4ODogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGRsbHRvb2wiID4mNQorZWNobyAiY29uZmlndXJlOjY4MDU6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBkbGx0b29sIiA+JjUKIGlmIHRlc3QgIngke2J1aWxkfSIgIT0gIngke2hvc3R9IiA7IHRoZW4KICAgaWYgZXhwciAieCRETExUT09MX0ZPUl9UQVJHRVQiIDogIngvIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICMgV2UgYWxyZWFkeSBmb3VuZCB0aGUgY29tcGxldGUgcGF0aApAQCAtNjgxNyw3ICs2ODM0LDcgQEAKICAgZmkKIGZpCiBlY2hvICRhY19uICJjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgZ2NjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2ODIxOiBjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgZ2NjIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2ODM4OiBjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgZ2NjIiA+JjUKIGlmIHRlc3QgIngke2J1aWxkfSIgIT0gIngke2hvc3R9IiA7IHRoZW4KICAgaWYgZXhwciAieCRHQ0NfRk9SX1RBUkdFVCIgOiAieC8iID4gL2Rldi9udWxsOyB0aGVuCiAgICAgIyBXZSBhbHJlYWR5IGZvdW5kIHRoZSBjb21wbGV0ZSBwYXRoCkBAIC02ODUwLDcgKzY4NjcsNyBAQAogICBmaQogZmkKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBnY2oiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY4NTQ6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBnY2oiID4mNQorZWNobyAiY29uZmlndXJlOjY4NzE6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBnY2oiID4mNQogaWYgdGVzdCAieCR7YnVpbGR9IiAhPSAieCR7aG9zdH0iIDsgdGhlbgogICBpZiBleHByICJ4JEdDSl9GT1JfVEFSR0VUIiA6ICJ4LyIgPiAvZGV2L251bGw7IHRoZW4KICAgICAjIFdlIGFscmVhZHkgZm91bmQgdGhlIGNvbXBsZXRlIHBhdGgKQEAgLTY4ODYsNyArNjkwMyw3IEBACiAgIGZpCiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGdmb3J0cmFuIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2ODkwOiBjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgZ2ZvcnRyYW4iID4mNQorZWNobyAiY29uZmlndXJlOjY5MDc6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBnZm9ydHJhbiIgPiY1CiBpZiB0ZXN0ICJ4JHtidWlsZH0iICE9ICJ4JHtob3N0fSIgOyB0aGVuCiAgIGlmIGV4cHIgIngkR0ZPUlRSQU5fRk9SX1RBUkdFVCIgOiAieC8iID4gL2Rldi9udWxsOyB0aGVuCiAgICAgIyBXZSBhbHJlYWR5IGZvdW5kIHRoZSBjb21wbGV0ZSBwYXRoCkBAIC02OTIyLDcgKzY5MzksNyBAQAogICBmaQogZmkKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjkyNjogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGxkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2OTQzOiBjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgbGQiID4mNQogaWYgdGVzdCAieCR7YnVpbGR9IiAhPSAieCR7aG9zdH0iIDsgdGhlbgogICBpZiBleHByICJ4JExEX0ZPUl9UQVJHRVQiIDogIngvIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICMgV2UgYWxyZWFkeSBmb3VuZCB0aGUgY29tcGxldGUgcGF0aApAQCAtNjk1NSw3ICs2OTcyLDcgQEAKICAgZmkKIGZpCiBlY2hvICRhY19uICJjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgbGlwbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njk1OTogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGxpcG8iID4mNQorZWNobyAiY29uZmlndXJlOjY5NzY6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBsaXBvIiA+JjUKIGlmIHRlc3QgIngke2J1aWxkfSIgIT0gIngke2hvc3R9IiA7IHRoZW4KICAgaWYgZXhwciAieCRMSVBPX0ZPUl9UQVJHRVQiIDogIngvIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICMgV2UgYWxyZWFkeSBmb3VuZCB0aGUgY29tcGxldGUgcGF0aApAQCAtNjk3OCw3ICs2OTk1LDcgQEAKICAgZmkKIGZpCiBlY2hvICRhY19uICJjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY5ODI6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBubSIgPiY1CitlY2hvICJjb25maWd1cmU6Njk5OTogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IG5tIiA+JjUKIGlmIHRlc3QgIngke2J1aWxkfSIgIT0gIngke2hvc3R9IiA7IHRoZW4KICAgaWYgZXhwciAieCROTV9GT1JfVEFSR0VUIiA6ICJ4LyIgPiAvZGV2L251bGw7IHRoZW4KICAgICAjIFdlIGFscmVhZHkgZm91bmQgdGhlIGNvbXBsZXRlIHBhdGgKQEAgLTcwMTEsNyArNzAyOCw3IEBACiAgIGZpCiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IG9iamR1bXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcwMTU6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBvYmpkdW1wIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3MDMyOiBjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgb2JqZHVtcCIgPiY1CiBpZiB0ZXN0ICJ4JHtidWlsZH0iICE9ICJ4JHtob3N0fSIgOyB0aGVuCiAgIGlmIGV4cHIgIngkT0JKRFVNUF9GT1JfVEFSR0VUIiA6ICJ4LyIgPiAvZGV2L251bGw7IHRoZW4KICAgICAjIFdlIGFscmVhZHkgZm91bmQgdGhlIGNvbXBsZXRlIHBhdGgKQEAgLTcwNDQsNyArNzA2MSw3IEBACiAgIGZpCiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IHJhbmxpYiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzA0ODogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IHJhbmxpYiIgPiY1CitlY2hvICJjb25maWd1cmU6NzA2NTogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IHJhbmxpYiIgPiY1CiBpZiB0ZXN0ICJ4JHtidWlsZH0iICE9ICJ4JHtob3N0fSIgOyB0aGVuCiAgIGlmIGV4cHIgIngkUkFOTElCX0ZPUl9UQVJHRVQiIDogIngvIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICMgV2UgYWxyZWFkeSBmb3VuZCB0aGUgY29tcGxldGUgcGF0aApAQCAtNzA3Nyw3ICs3MDk0LDcgQEAKICAgZmkKIGZpCiBlY2hvICRhY19uICJjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgc3RyaXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcwODE6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBzdHJpcCIgPiY1CitlY2hvICJjb25maWd1cmU6NzA5ODogY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IHN0cmlwIiA+JjUKIGlmIHRlc3QgIngke2J1aWxkfSIgIT0gIngke2hvc3R9IiA7IHRoZW4KICAgaWYgZXhwciAieCRTVFJJUF9GT1JfVEFSR0VUIiA6ICJ4LyIgPiAvZGV2L251bGw7IHRoZW4KICAgICAjIFdlIGFscmVhZHkgZm91bmQgdGhlIGNvbXBsZXRlIHBhdGgKQEAgLTcxMTAsNyArNzEyNyw3IEBACiAgIGZpCiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IHdpbmRyZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcxMTQ6IGNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCB3aW5kcmVzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3MTMxOiBjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgd2luZHJlcyIgPiY1CiBpZiB0ZXN0ICJ4JHtidWlsZH0iICE9ICJ4JHtob3N0fSIgOyB0aGVuCiAgIGlmIGV4cHIgIngkV0lORFJFU19GT1JfVEFSR0VUIiA6ICJ4LyIgPiAvZGV2L251bGw7IHRoZW4KICAgICAjIFdlIGFscmVhZHkgZm91bmQgdGhlIGNvbXBsZXRlIHBhdGgKQEAgLTcxNzEsNyArNzE4OCw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcxNzU6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3MTkyOiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1CiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCiAgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCkBAIC03MjMwLDYgKzcyNDcsMzggQEAKIGVzYWMKIAogCisjIEZsYWdzIG5lZWRlZCB0byBlbmFibGUgaHRtbCBpbnN0YWxsaW5nIGFuZCBidWlsZGluZworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kYXRhcm9vdGRpciBvciAtLXdpdGhvdXQtZGF0YXJvb3RkaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RhdGFyb290ZGlyK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2RhdGFyb290ZGlyIgorICBkYXRhcm9vdGRpcj0iXCR7cHJlZml4fS8ke3dpdGh2YWx9IgorZWxzZQorICBkYXRhcm9vdGRpcj0iXCR7cHJlZml4fS9zaGFyZSIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kb2NkaXIgb3IgLS13aXRob3V0LWRvY2RpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZG9jZGlyK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2RvY2RpciIKKyAgZG9jZGlyPSJcJHtwcmVmaXh9LyR7d2l0aHZhbH0iCitlbHNlCisgIGRvY2Rpcj0iXCR7ZGF0YXJvb3RkaXJ9L2RvYyIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1odG1sZGlyIG9yIC0td2l0aG91dC1odG1sZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9odG1sZGlyK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2h0bWxkaXIiCisgIGh0bWxkaXI9Ilwke3ByZWZpeH0vJHt3aXRodmFsfSIKK2Vsc2UKKyAgaHRtbGRpcj0iXCR7ZG9jZGlyfSIKK2ZpCisKKworCisKKworCiB0cmFwICcnIDEgMiAxNQogY2F0ID4gY29uZmNhY2hlIDw8XEVPRgogIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCkBAIC03Mjk2LDE1ICs3MzQ1LDM0IEBACiAjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KICMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCiAjIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCi1jYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCi1zJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZwotcyVcWyVcXCYlZwotcyVcXSVcXCYlZwotcyVcJCUkJCVnCi1FT0YKLURFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAotcm0gLWYgY29uZnRlc3QuZGVmcworIworIyBJZiB0aGUgZmlyc3Qgc2VkIHN1YnN0aXR1dGlvbiBpcyBleGVjdXRlZCAod2hpY2ggbG9va3MgZm9yIG1hY3JvcyB0aGF0CisjIHRha2UgYXJndW1lbnRzKSwgdGhlbiB3ZSBicmFuY2ggdG8gdGhlIHF1b3RlIHNlY3Rpb24uICBPdGhlcndpc2UsCisjIGxvb2sgZm9yIGEgbWFjcm8gdGhhdCBkb2Vzbid0IHRha2UgYXJndW1lbnRzLgorY2F0ID5jb25mZGVmMm9wdC5zZWQgPDxcX0FDRU9GCit0IGNsZWFyCis6IGNsZWFyCitzLF5bIAldKiNbIAldKmRlZmluZVsgCV1bIAldKlwoW14gCShdW14gCShdKihbXildKilcKVsgCV0qXCguKlwpLC1EXDE9XDIsZwordCBxdW90ZQorcyxeWyAJXSojWyAJXSpkZWZpbmVbIAldWyAJXSpcKFteIAldW14gCV0qXClbIAldKlwoLipcKSwtRFwxPVwyLGcKK3QgcXVvdGUKK2QKKzogcXVvdGUKK3MsWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dLFxcJixnCitzLFxbLFxcJixnCitzLFxdLFxcJixnCitzLFwkLCQkLGcKK3AKK19BQ0VPRgorIyBXZSB1c2UgZWNobyB0byBhdm9pZCBhc3N1bWluZyBhIHBhcnRpY3VsYXIgbGluZS1icmVha2luZyBjaGFyYWN0ZXIuCisjIFRoZSBleHRyYSBkb3QgaXMgdG8gcHJldmVudCB0aGUgc2hlbGwgZnJvbSBjb25zdW1pbmcgdHJhaWxpbmcKKyMgbGluZS1icmVha3MgZnJvbSB0aGUgc3ViLWNvbW1hbmQgb3V0cHV0LiAgQSBsaW5lLWJyZWFrIHdpdGhpbgorIyBzaW5nbGUtcXVvdGVzIGRvZXNuJ3Qgd29yayBiZWNhdXNlLCBpZiB0aGlzIHNjcmlwdCBpcyBjcmVhdGVkIGluIGEKKyMgcGxhdGZvcm0gdGhhdCB1c2VzIHR3byBjaGFyYWN0ZXJzIGZvciBsaW5lLWJyZWFrcyAoZS5nLiwgRE9TKSwgdHIKKyMgd291bGQgYnJlYWsuCithY19MRl9hbmRfRE9UPWBlY2hvOyBlY2hvIC5gCitERUZTPWBzZWQgLW4gLWYgY29uZmRlZjJvcHQuc2VkIGNvbmZkZWZzLmggfCB0ciAiJGFjX0xGX2FuZF9ET1QiICcgLidgCitybSAtZiBjb25mZGVmMm9wdC5zZWQKIAogCiAjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KQEAgLTc0NzUsNiArNzU0Myw5IEBACiBzJUBNQUlOVEAlJE1BSU5UJWcKIHMlQHN0YWdlMV9jZmxhZ3NAJSRzdGFnZTFfY2ZsYWdzJWcKIHMlQHN0YWdlMl93ZXJyb3JfZmxhZ0AlJHN0YWdlMl93ZXJyb3JfZmxhZyVnCitzJUBkYXRhcm9vdGRpckAlJGRhdGFyb290ZGlyJWcKK3MlQGRvY2RpckAlJGRvY2RpciVnCitzJUBodG1sZGlyQCUkaHRtbGRpciVnCiAKIENFT0YKIEVPRgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmluZGV4IGRhN2M2M2YuLmNkZmE3ZDggMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5pbgorKysgYi9jb25maWd1cmUuaW4KQEAgLTQ0NSw5ICs0NDUsNiBAQAogICAqLSotdnh3b3JrcyopCiAgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIHRhcmdldC1saWJpYmVydHkgdGFyZ2V0LWxpYnN0ZGMrKy12MyAke2xpYmdjan0iCiAgICAgOzsKLSAgbTMyYy0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJzdGRjKystdjMiCi0gICAgOzsKICAgYWxwaGEqLWRlYy1vc2YqKQogICAgICMgbGQgd29ya3MsIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCiAgICAgIyBuZXdsaWIgaXMgbm90IDY0IGJpdCByZWFkeS4gIEknbSBub3Qgc3VyZSBhYm91dCBmaWxldXRpbHMuCkBAIC0yMTI5LDYgKzIxMjYsMjAgQEAKICAgRkxBR1NfRk9SX1RBUkdFVD0kRkxBR1NfRk9SX1RBUkdFVCcgLUwkJHIvJChIT1NUX1NVQkRJUikvbGQnCiBmaQogCisjIFNlYXJjaCBmb3Igb3RoZXIgdGFyZ2V0LXNwZWNpZmljIGxpbmtlciBzY3JpcHRzIGFuZCBzdWNoLgorY2FzZSAiJHt0YXJnZXR9IiBpbgorICBtMzJjLSotKiApCisgICAgaWYgdGVzdCAtZCAke3NyY2Rpcn0vbGliZ2xvc3MvbTMyYzsgdGhlbgorICAgICAgIyBUaGlzIGlzIGZvciBjcnQwLm8KKyAgICAgIEZMQUdTX0ZPUl9UQVJHRVQ9JEZMQUdTX0ZPUl9UQVJHRVQnIC1CJCRyLyQoVEFSR0VUX1NVQkRJUikvbGliZ2xvc3MvbTMyYycKKyAgICAgICMgVGhpcyBpcyBmb3IgcjhjLmxkCisgICAgICBGTEFHU19GT1JfVEFSR0VUPSRGTEFHU19GT1JfVEFSR0VUJyAtTCQkci8kKFRBUkdFVF9TVUJESVIpL2xpYmdsb3NzL20zMmMnCisgICAgICAjIFRoaXMgaXMgZm9yIGxpYm5vc3lzLmEKKyAgICAgIEZMQUdTX0ZPUl9UQVJHRVQ9JEZMQUdTX0ZPUl9UQVJHRVQnIC1MJCRyLyQoVEFSR0VUX1NVQkRJUikvbGliZ2xvc3MvbGlibm9zeXMnCisgICAgZmkKKyAgICA7OworZXNhYworCiAjIE1ha2VmaWxlIGZyYWdtZW50cy4KIGZvciBmcmFnIGluIGhvc3RfbWFrZWZpbGVfZnJhZyB0YXJnZXRfbWFrZWZpbGVfZnJhZyBhbHBoYWllZWVfZnJhZyBvc3BhY2VfZnJhZzsKIGRvCkBAIC0yMjAzLDEwICsyMjE0LDEwIEBACiAgICoiIHRleGluZm8gIiopIE1BS0VJTkZPPSckJHIvJChCVUlMRF9TVUJESVIpL3RleGluZm8vbWFrZWluZm8vbWFrZWluZm8nIDs7CiAgICopCiBjaGFuZ2VxdW90ZSgsKQotICAgICMgRm9yIGFuIGluc3RhbGxlZCBtYWtlaW5mbywgd2UgcmVxdWlyZSBpdCB0byBiZSBmcm9tIHRleGluZm8gNC4yIG9yCisgICAgIyBGb3IgYW4gaW5zdGFsbGVkIG1ha2VpbmZvLCB3ZSByZXF1aXJlIGl0IHRvIGJlIGZyb20gdGV4aW5mbyA0LjQgb3IKICAgICAjIGhpZ2hlciwgZWxzZSB3ZSB1c2UgdGhlICJtaXNzaW5nIiBkdW1teS4KICAgICBpZiAke01BS0VJTkZPfSAtLXZlcnNpb24gXAotICAgICAgIHwgZWdyZXAgJ3RleGluZm9bXjAtOV0qKFsxLTNdWzAtOV18NFwuWzItOV18WzUtOV0pJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICB8IGVncmVwICd0ZXhpbmZvW14wLTldKihbMS0zXVswLTldfDRcLls0LTldfFs1LTldKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICA6CiAgICAgZWxzZQogICAgICAgTUFLRUlORk89IiRNSVNTSU5HIG1ha2VpbmZvIgpAQCAtMjM4NCw0ICsyMzk1LDI0IEBACiBlc2FjCiBBQ19TVUJTVChzdGFnZTJfd2Vycm9yX2ZsYWcpCiAKKyMgRmxhZ3MgbmVlZGVkIHRvIGVuYWJsZSBodG1sIGluc3RhbGxpbmcgYW5kIGJ1aWxkaW5nCitBQ19BUkdfV0lUSChkYXRhcm9vdGRpciwKK1sgIC0td2l0aC1kYXRhcm9vdGRpcglVc2UgZGF0YXJvb3RkaXIgYXMgdGhlIGRhdGEgcm9vdCBkaXJlY3RvcnkuXSwKK1tkYXRhcm9vdGRpcj0iXCR7cHJlZml4fS8ke3dpdGh2YWx9Il0sCitbZGF0YXJvb3RkaXI9Ilwke3ByZWZpeH0vc2hhcmUiXSkKKworQUNfQVJHX1dJVEgoZG9jZGlyLAorWyAgLS13aXRoLWRvY2RpcglJbnN0YWxsIGRvY3VtZW50YXRpb24gaW4gdGhpcyBkaXJlY3RvcnkuXSwKK1tkb2NkaXI9Ilwke3ByZWZpeH0vJHt3aXRodmFsfSJdLAorW2RvY2Rpcj0iXCR7ZGF0YXJvb3RkaXJ9L2RvYyJdKQorCitBQ19BUkdfV0lUSChodG1sZGlyLAorWyAgLS13aXRoLWh0bWxkaXIJSW5zdGFsbCBodG1sIGluIHRoaXMgZGlyZWN0b3J5Ll0sCitbaHRtbGRpcj0iXCR7cHJlZml4fS8ke3dpdGh2YWx9Il0sCitbaHRtbGRpcj0iXCR7ZG9jZGlyfSJdKQorCitBQ19TVUJTVChkYXRhcm9vdGRpcikKK0FDX1NVQlNUKGRvY2RpcikKK0FDX1NVQlNUKGh0bWxkaXIpCisKIEFDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvQ2hhbmdlTG9nIGIvY29udHJpYi9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGRlODUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTIwMDItMDctMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGNhbWJyaWRnZS5yZWRoYXQuY29tPgotCi0JKiBDaGFuZ2VMb2c6IE5ld2x5IGNyZWF0ZWQuCi0JKiB0ZXhpMnBvZC5wbDogSW1wb3J0ZWQgZnJvbSBGU0YgR0NDIHNvdXJjZXMuCi0JCi0JCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGV4aTJwb2QucGwgYi9jb250cmliL3RleGkycG9kLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTU2MGYzLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGV4aTJwb2QucGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotIyEgL3Vzci9iaW4vcGVybCAtdwotCi0jICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLQotIyBHTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIEdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgVGhpcyBkb2VzIHRyaXZpYWwgKGFuZCBJIG1lYW4gX3RyaXZpYWxfKSBjb252ZXJzaW9uIG9mIFRleGluZm8KLSMgbWFya3VwIHRvIFBlcmwgUE9EIGZvcm1hdC4gIEl0J3MgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBleHRyYWN0Ci0jIHNvbWV0aGluZyBzdWl0YWJsZSBmb3IgYSBtYW5wYWdlIGZyb20gYSBUZXhpbmZvIGRvY3VtZW50LgotCi0kb3V0cHV0ID0gMDsKLSRza2lwcGluZyA9IDA7Ci0lc2VjdHMgPSAoKTsKLSRzZWN0aW9uID0gIiI7Ci1AaWNzdGFjayA9ICgpOwotQGVuZHdzdGFjayA9ICgpOwotQHNrc3RhY2sgPSAoKTsKLUBpbnN0YWNrID0gKCk7Ci0kc2hpZnQgPSAiIjsKLSVkZWZzID0gKCk7Ci0kZm5ubyA9IDE7Ci0kaW5mID0gIiI7Ci0kaWJhc2UgPSAiIjsKLQotd2hpbGUgKCRfID0gc2hpZnQpIHsKLSAgICBpZiAoL14tRCguKikkLykgewotCWlmICgkMSBuZSAiIikgewotCSAgICAkZmxhZyA9ICQxOwotCX0gZWxzZSB7Ci0JICAgICRmbGFnID0gc2hpZnQ7Ci0JfQotCSR2YWx1ZSA9ICIiOwotCSgkZmxhZywgJHZhbHVlKSA9ICgkZmxhZyA9fiAvXihbXj1dKykoPzo9KC4rKSk/Lyk7Ci0JZGllICJubyBmbGFnIHNwZWNpZmllZCBmb3IgLURcbiIKLQkgICAgdW5sZXNzICRmbGFnIG5lICIiOwotCWRpZSAiZmxhZ3MgbWF5IG9ubHkgY29udGFpbiBsZXR0ZXJzLCBkaWdpdHMsIGh5cGhlbnMsIGRhc2hlcyBhbmQgdW5kZXJzY29yZXNcbiIKLQkgICAgdW5sZXNzICRmbGFnID1+IC9eW2EtekEtWjAtOV8tXSskLzsKLQkkZGVmc3skZmxhZ30gPSAkdmFsdWU7Ci0gICAgfSBlbHNpZiAoL14tLykgewotCXVzYWdlKCk7Ci0gICAgfSBlbHNlIHsKLQkkaW4gPSAkXywgbmV4dCB1bmxlc3MgZGVmaW5lZCAkaW47Ci0JJG91dCA9ICRfLCBuZXh0IHVubGVzcyBkZWZpbmVkICRvdXQ7Ci0JdXNhZ2UoKTsKLSAgICB9Ci19Ci0KLWlmIChkZWZpbmVkICRpbikgewotICAgICRpbmYgPSBnZW5zeW0oKTsKLSAgICBvcGVuKCRpbmYsICI8JGluIikgb3IgZGllICJvcGVuaW5nIFwiJGluXCI6ICQhXG4iOwotICAgICRpYmFzZSA9ICQxIGlmICRpbiA9fiBtfF4oLispL1teL10rJHw7Ci19IGVsc2UgewotICAgICRpbmYgPSBcKlNURElOOwotfQotCi1pZiAoZGVmaW5lZCAkb3V0KSB7Ci0gICAgb3BlbihTVERPVVQsICI+JG91dCIpIG9yIGRpZSAib3BlbmluZyBcIiRvdXRcIjogJCFcbiI7Ci19Ci0KLXdoaWxlKGRlZmluZWQgJGluZikgewotd2hpbGUoPCRpbmY+KSB7Ci0gICAgIyBDZXJ0YWluIGNvbW1hbmRzIGFyZSBkaXNjYXJkZWQgd2l0aG91dCBmdXJ0aGVyIHByb2Nlc3NpbmcuCi0gICAgL15cQCg/OgotCSBbYS16XStpbmRleAkJIyBAKmluZGV4OiB1c2VmdWwgb25seSBpbiBjb21wbGV0ZSBtYW51YWwKLQkgfG5lZWQJCQkjIEBuZWVkOiB1c2VmdWwgb25seSBpbiBwcmludGVkIG1hbnVhbAotCSB8KD86ZW5kXHMrKT9ncm91cAkjIEBncm91cCAuLiBAZW5kIGdyb3VwOiBkaXR0bwotCSB8cGFnZQkJCSMgQHBhZ2U6IGRpdHRvCi0JIHxub2RlCQkJIyBAbm9kZTogdXNlZnVsIG9ubHkgaW4gLmluZm8gZmlsZQotCSB8KD86ZW5kXHMrKT9pZm5vdHRleCAgICMgQGlmbm90dGV4IC4uIEBlbmQgaWZub3R0ZXg6IHVzZSBjb250ZW50cwotCSlcYi94IGFuZCBuZXh0OwotCi0gICAgY2hvbXA7Ci0KLSAgICAjIExvb2sgZm9yIGZpbGVuYW1lIGFuZCB0aXRsZSBtYXJrZXJzLgotICAgIC9eXEBzZXRmaWxlbmFtZVxzKyhbXi5dKykvIGFuZCAkZm4gPSAkMSwgbmV4dDsKLSAgICAvXlxAc2V0dGl0bGVccysoW14uXSspLyBhbmQgJHRsID0gcG9zdHByb2Nlc3MoJDEpLCBuZXh0OwotCi0gICAgIyBJZGVudGlmeSBhIG1hbiB0aXRsZSBidXQga2VlcCBvbmx5IHRoZSBvbmUgd2UgYXJlIGludGVyZXN0ZWQgaW4uCi0gICAgL15cQGNccyttYW5ccyt0aXRsZVxzKyhbQS1aYS16MC05LV0rKVxzKyguKykvIGFuZCBkbyB7Ci0JaWYgKGV4aXN0cyAkZGVmc3skMX0pIHsKLQkgICAgJGZuID0gJDE7Ci0JICAgICR0bCA9IHBvc3Rwcm9jZXNzKCQyKTsKLQl9Ci0JbmV4dDsKLSAgICB9OwotCi0gICAgIyBMb29rIGZvciBibG9ja3Mgc3Vycm91bmRlZCBieSBAYyBtYW4gYmVnaW4gU0VDVElPTiAuLi4gQGMgbWFuIGVuZC4KLSAgICAjIFRoaXMgcmVhbGx5IG91Z2h0YSBiZSBAaWZtYW4gLi4uIEBlbmQgaWZtYW4gYW5kIHRoZSBsaWtlLCBidXQgc3VjaAotICAgICMgd291bGQgcmVxdWlyZSByZXYnaW5nIGFsbCBvdGhlciBUZXhpbmZvIHRyYW5zbGF0b3JzLgotICAgIC9eXEBjXHMrbWFuXHMrYmVnaW5ccysoW0EtWl0rKVxzKyhbQS1aYS16MC05LV0rKS8gYW5kIGRvIHsKLQkkb3V0cHV0ID0gMSBpZiBleGlzdHMgJGRlZnN7JDJ9OwotICAgICAgICAkc2VjdCA9ICQxOwotCW5leHQ7Ci0gICAgfTsKLSAgICAvXlxAY1xzK21hblxzK2JlZ2luXHMrKFtBLVpdKykvIGFuZCAkc2VjdCA9ICQxLCAkb3V0cHV0ID0gMSwgbmV4dDsKLSAgICAvXlxAY1xzK21hblxzK2VuZC8gYW5kIGRvIHsKLQkkc2VjdHN7JHNlY3R9ID0gIiIgdW5sZXNzIGV4aXN0cyAkc2VjdHN7JHNlY3R9OwotCSRzZWN0c3skc2VjdH0gLj0gcG9zdHByb2Nlc3MoJHNlY3Rpb24pOwotCSRzZWN0aW9uID0gIiI7Ci0JJG91dHB1dCA9IDA7Ci0JbmV4dDsKLSAgICB9OwotCi0gICAgIyBoYW5kbGUgdmFyaWFibGVzCi0gICAgL15cQHNldFxzKyhbYS16QS1aMC05Xy1dKylccyooLiopJC8gYW5kIGRvIHsKLQkkZGVmc3skMX0gPSAkMjsKLQluZXh0OwotICAgIH07Ci0gICAgL15cQGNsZWFyXHMrKFthLXpBLVowLTlfLV0rKS8gYW5kIGRvIHsKLQlkZWxldGUgJGRlZnN7JDF9OwotCW5leHQ7Ci0gICAgfTsKLQotICAgIG5leHQgdW5sZXNzICRvdXRwdXQ7Ci0KLSAgICAjIERpc2NhcmQgY29tbWVudHMuICAoQ2FuJ3QgZG8gaXQgYWJvdmUsIGJlY2F1c2UgdGhlbiB3ZSdkIG5ldmVyIHNlZQotICAgICMgQGMgbWFuIGxpbmVzLikKLSAgICAvXlxAY1xiLyBhbmQgbmV4dDsKLQotICAgICMgRW5kLWJsb2NrIGhhbmRsZXIgZ29lcyB1cCBoZXJlIGJlY2F1c2UgaXQgbmVlZHMgdG8gb3BlcmF0ZSBldmVuCi0gICAgIyBpZiB3ZSBhcmUgc2tpcHBpbmcuCi0gICAgL15cQGVuZFxzKyhbYS16XSspLyBhbmQgZG8gewotCSMgSWdub3JlIEBlbmQgZm9vLCB3aGVyZSBmb28gaXMgbm90IGFuIG9wZXJhdGlvbiB3aGljaCBtYXkKLQkjIGNhdXNlIHVzIHRvIHNraXAsIGlmIHdlIGFyZSBwcmVzZW50bHkgc2tpcHBpbmcuCi0JbXkgJGVuZGVkID0gJDE7Ci0JbmV4dCBpZiAkc2tpcHBpbmcgJiYgJGVuZGVkICF+IC9eKD86aWZzZXR8aWZjbGVhcnxpZ25vcmV8bWVudXxpZnRleCkkLzsKLQotCWRpZSAiXEBlbmQgJGVuZGVkIHdpdGhvdXQgXEAkZW5kZWQgYXQgbGluZSAkLlxuIiB1bmxlc3MgZGVmaW5lZCAkZW5kdzsKLQlkaWUgIlxAJGVuZHcgZW5kZWQgYnkgXEBlbmQgJGVuZGVkIGF0IGxpbmUgJC5cbiIgdW5sZXNzICRlbmRlZCBlcSAkZW5kdzsKLQotCSRlbmR3ID0gcG9wIEBlbmR3c3RhY2s7Ci0KLQlpZiAoJGVuZGVkID1+IC9eKD86aWZzZXR8aWZjbGVhcnxpZ25vcmV8bWVudXxpZnRleCkkLykgewotCSAgICAkc2tpcHBpbmcgPSBwb3AgQHNrc3RhY2s7Ci0JICAgIG5leHQ7Ci0JfSBlbHNpZiAoJGVuZGVkID1+IC9eKD86ZXhhbXBsZXxzbWFsbGV4YW1wbGV8ZGlzcGxheSkkLykgewotCSAgICAkc2hpZnQgPSAiIjsKLQkgICAgJF8gPSAiIjsJIyBuZWVkIGEgcGFyYWdyYXBoIGJyZWFrCi0JfSBlbHNpZiAoJGVuZGVkID1+IC9eKD86aXRlbWl6ZXxlbnVtZXJhdGV8W2Z2XT90YWJsZSkkLykgewotCSAgICAkXyA9ICJcbj1iYWNrXG4iOwotCSAgICAkaWMgPSBwb3AgQGljc3RhY2s7Ci0JfSBlbHNlIHsKLQkgICAgZGllICJ1bmtub3duIGNvbW1hbmQgXEBlbmQgJGVuZGVkIGF0IGxpbmUgJC5cbiI7Ci0JfQotICAgIH07Ci0KLSAgICAjIFdlIG11c3QgaGFuZGxlIGNvbW1hbmRzIHdoaWNoIGNhbiBjYXVzZSBza2lwcGluZyBldmVuIHdoaWxlIHdlCi0gICAgIyBhcmUgc2tpcHBpbmcsIG90aGVyd2lzZSB3ZSB3aWxsIG5vdCBwcm9jZXNzIG5lc3RlZCBjb25kaXRpb25hbHMKLSAgICAjIGNvcnJlY3RseS4KLSAgICAvXlxAaWZzZXRccysoW2EtekEtWjAtOV8tXSspLyBhbmQgZG8gewotCXB1c2ggQGVuZHdzdGFjaywgJGVuZHc7Ci0JcHVzaCBAc2tzdGFjaywgJHNraXBwaW5nOwotCSRlbmR3ID0gImlmc2V0IjsKLQkkc2tpcHBpbmcgPSAxIHVubGVzcyBleGlzdHMgJGRlZnN7JDF9OwotCW5leHQ7Ci0gICAgfTsKLQotICAgIC9eXEBpZmNsZWFyXHMrKFthLXpBLVowLTlfLV0rKS8gYW5kIGRvIHsKLQlwdXNoIEBlbmR3c3RhY2ssICRlbmR3OwotCXB1c2ggQHNrc3RhY2ssICRza2lwcGluZzsKLQkkZW5kdyA9ICJpZmNsZWFyIjsKLQkkc2tpcHBpbmcgPSAxIGlmIGV4aXN0cyAkZGVmc3skMX07Ci0JbmV4dDsKLSAgICB9OwotCi0gICAgL15cQChpZ25vcmV8bWVudXxpZnRleClcYi8gYW5kIGRvIHsKLQlwdXNoIEBlbmR3c3RhY2ssICRlbmR3OwotCXB1c2ggQHNrc3RhY2ssICRza2lwcGluZzsKLQkkZW5kdyA9ICQxOwotCSRza2lwcGluZyA9IDE7Ci0JbmV4dDsKLSAgICB9OwotCi0gICAgbmV4dCBpZiAkc2tpcHBpbmc7Ci0KLSAgICAjIENoYXJhY3RlciBlbnRpdGllcy4gIEZpcnN0IHRoZSBvbmVzIHRoYXQgY2FuIGJlIHJlcGxhY2VkIGJ5IHJhdyB0ZXh0Ci0gICAgIyBvciBkaXNjYXJkZWQgb3V0cmlnaHQ6Ci0gICAgcy9cQGNvcHlyaWdodFx7XH0vKGMpL2c7Ci0gICAgcy9cQGRvdHNce1x9Ly4uLi9nOwotICAgIHMvXEBlbmRkb3RzXHtcfS8uLi4uL2c7Ci0gICAgcy9cQChbLiE/IF0pLyQxL2c7Ci0gICAgcy9cQFs6LV0vL2c7Ci0gICAgcy9cQGJ1bGxldCg/Olx7XH0pPy8qL2c7Ci0gICAgcy9cQFRlWFx7XH0vVGVYL2c7Ci0gICAgcy9cQHBvdW5kc1x7XH0vXCMvZzsKLSAgICBzL1xAbWludXMoPzpce1x9KT8vLS9nOwotICAgIHMvXFwsLywvZzsKLQotICAgICMgTm93IHRoZSBvbmVzIHRoYXQgaGF2ZSB0byBiZSByZXBsYWNlZCBieSBzcGVjaWFsIGVzY2FwZXMKLSAgICAjICh3aGljaCB3aWxsIGJlIHR1cm5lZCBiYWNrIGludG8gdGV4dCBieSB1bm11bmdlKCkpCi0gICAgcy8mLyZhbXA7L2c7Ci0gICAgcy9cQFx7LyZsYnJhY2U7L2c7Ci0gICAgcy9cQFx9LyZyYnJhY2U7L2c7Ci0gICAgcy9cQFxALyZhdDsvZzsKLQotICAgICMgSW5zaWRlIGEgdmVyYmF0aW0gYmxvY2ssIGhhbmRsZSBAdmFyIHNwZWNpYWxseS4KLSAgICBpZiAoJHNoaWZ0IG5lICIiKSB7Ci0Jcy9cQHZhclx7KFteXH1dKilcfS88JDE+L2c7Ci0gICAgfQotCi0gICAgIyBQT0QgZG9lc24ndCBpbnRlcnByZXQgRTw+IGluc2lkZSBhIHZlcmJhdGltIGJsb2NrLgotICAgIGlmICgkc2hpZnQgZXEgIiIpIHsKLQlzLzwvJmx0Oy9nOwotCXMvPi8mZ3Q7L2c7Ci0gICAgfSBlbHNlIHsKLQlzLzwvJkxUOy9nOwotCXMvPi8mR1Q7L2c7Ci0gICAgfQotCi0gICAgIyBTaW5nbGUgbGluZSBjb21tYW5kIGhhbmRsZXJzLgotCi0gICAgL15cQGluY2x1ZGVccysoLispJC8gYW5kIGRvIHsKLQlwdXNoIEBpbnN0YWNrLCAkaW5mOwotCSRpbmYgPSBnZW5zeW0oKTsKLQotCSMgVHJ5IGN3ZCBhbmQgJGliYXNlLgotCW9wZW4oJGluZiwgIjwiIC4gJDEpIAotCSAgICBvciBvcGVuKCRpbmYsICI8IiAuICRpYmFzZSAuICIvIiAuICQxKQotCQlvciBkaWUgImNhbm5vdCBvcGVuICQxIG9yICRpYmFzZS8kMTogJCFcbiI7Ci0JbmV4dDsKLSAgICB9OwotCi0gICAgL15cQCg/OnNlY3Rpb258dW5udW1iZXJlZHx1bm51bWJlcmVkc2VjfGNlbnRlcilccysoLispJC8KLQlhbmQgJF8gPSAiXG49aGVhZDIgJDFcbiI7Ci0gICAgL15cQHN1YnNlY3Rpb25ccysoLispJC8KLQlhbmQgJF8gPSAiXG49aGVhZDMgJDFcbiI7Ci0KLSAgICAjIEJsb2NrIGNvbW1hbmQgaGFuZGxlcnM6Ci0gICAgL15cQGl0ZW1pemVccysoXEBbYS16XSt8XCp8LSkvIGFuZCBkbyB7Ci0JcHVzaCBAZW5kd3N0YWNrLCAkZW5kdzsKLQlwdXNoIEBpY3N0YWNrLCAkaWM7Ci0JJGljID0gJDE7Ci0JJF8gPSAiXG49b3ZlciA0XG4iOwotCSRlbmR3ID0gIml0ZW1pemUiOwotICAgIH07Ci0KLSAgICAvXlxAZW51bWVyYXRlKD86XHMrKFthLXpBLVowLTldKykpPy8gYW5kIGRvIHsKLQlwdXNoIEBlbmR3c3RhY2ssICRlbmR3OwotCXB1c2ggQGljc3RhY2ssICRpYzsKLQlpZiAoZGVmaW5lZCAkMSkgewotCSAgICAkaWMgPSAkMSAuICIuIjsKLQl9IGVsc2UgewotCSAgICAkaWMgPSAiMS4iOwotCX0KLQkkXyA9ICJcbj1vdmVyIDRcbiI7Ci0JJGVuZHcgPSAiZW51bWVyYXRlIjsKLSAgICB9OwotCi0gICAgL15cQChbZnZdP3RhYmxlKVxzKyhcQFthLXpdKykvIGFuZCBkbyB7Ci0JcHVzaCBAZW5kd3N0YWNrLCAkZW5kdzsKLQlwdXNoIEBpY3N0YWNrLCAkaWM7Ci0JJGVuZHcgPSAkMTsKLQkkaWMgPSAkMjsKLQkkaWMgPX4gcy9cQCg/OnNhbXB8c3Ryb25nfGtleXxnY2N0YWJvcHR8ZW52KS9CLzsKLQkkaWMgPX4gcy9cQCg/OmNvZGV8a2JkKS9DLzsKLQkkaWMgPX4gcy9cQCg/OmRmbnx2YXJ8ZW1waHxjaXRlfGkpL0kvOwotCSRpYyA9fiBzL1xAKD86ZmlsZSkvRi87Ci0JJF8gPSAiXG49b3ZlciA0XG4iOwotICAgIH07Ci0KLSAgICAvXlxAKCg/OnNtYWxsKT9leGFtcGxlfGRpc3BsYXkpLyBhbmQgZG8gewotCXB1c2ggQGVuZHdzdGFjaywgJGVuZHc7Ci0JJGVuZHcgPSAkMTsKLQkkc2hpZnQgPSAiXHQiOwotCSRfID0gIiI7CSMgbmVlZCBhIHBhcmFncmFwaCBicmVhawotICAgIH07Ci0KLSAgICAvXlxAaXRlbXg/XHMqKC4rKT8kLyBhbmQgZG8gewotCWlmIChkZWZpbmVkICQxKSB7Ci0JICAgICMgRW50aXR5IGVzY2FwZXMgcHJldmVudCBtdW5naW5nIGJ5IHRoZSA8PiBwcm9jZXNzaW5nIGJlbG93LgotCSAgICAkXyA9ICJcbj1pdGVtICRpY1wmTFQ7JDFcJkdUO1xuIjsKLQl9IGVsc2UgewotCSAgICAkXyA9ICJcbj1pdGVtICRpY1xuIjsKLQkgICAgJGljID1+IHkvQS1ZYS15L0ItWmItei87Ci0JICAgICRpYyA9fiBzLyhcZCspLyQxICsgMS9lZzsKLQl9Ci0gICAgfTsKLQotICAgICRzZWN0aW9uIC49ICRzaGlmdC4kXy4iXG4iOwotfQotIyBFbmQgb2YgY3VycmVudCBmaWxlLgotY2xvc2UoJGluZik7Ci0kaW5mID0gcG9wIEBpbnN0YWNrOwotfQotCi1kaWUgIk5vIGZpbGVuYW1lIG9yIHRpdGxlXG4iIHVubGVzcyBkZWZpbmVkICRmbiAmJiBkZWZpbmVkICR0bDsKLQotJHNlY3Rze05BTUV9ID0gIiRmbiBcLSAkdGxcbiI7Ci0kc2VjdHN7Rk9PVE5PVEVTfSAuPSAiPWJhY2tcbiIgaWYgZXhpc3RzICRzZWN0c3tGT09UTk9URVN9OwotCi1mb3IgJHNlY3QgKHF3KE5BTUUgU1lOT1BTSVMgREVTQ1JJUFRJT04gT1BUSU9OUyBFTlZJUk9OTUVOVCBGSUxFUwotCSAgICAgIEJVR1MgTk9URVMgRk9PVE5PVEVTIFNFRUFMU08gQVVUSE9SIENPUFlSSUdIVCkpIHsKLSAgICBpZihleGlzdHMgJHNlY3RzeyRzZWN0fSkgewotCSRoZWFkID0gJHNlY3Q7Ci0JJGhlYWQgPX4gcy9TRUVBTFNPL1NFRSBBTFNPLzsKLQlwcmludCAiPWhlYWQxICRoZWFkXG5cbiI7Ci0JcHJpbnQgc2NhbGFyIHVubXVuZ2UgKCRzZWN0c3skc2VjdH0pOwotCXByaW50ICJcbiI7Ci0gICAgfQotfQotCi1zdWIgdXNhZ2UKLXsKLSAgICBkaWUgInVzYWdlOiAkMCBbLUQgdG9nZ2xlLi4uXSBbaW5maWxlIFtvdXRmaWxlXV1cbiI7Ci19Ci0KLXN1YiBwb3N0cHJvY2VzcwotewotICAgIGxvY2FsICRfID0gJF9bMF07Ci0KLSAgICAjIEB2YWx1ZXtmb299IGlzIHJlcGxhY2VkIGJ5IHdoYXRldmVyICdmb28nIGlzIGRlZmluZWQgYXMuCi0gICAgd2hpbGUgKG0vKFxAdmFsdWVceyhbYS16QS1aMC05Xy1dKylcfSkvZykgewotCWlmICghIGV4aXN0cyAkZGVmc3skMn0pIHsKLQkgICAgcHJpbnQgU1RERVJSICJPcHRpb24gJDIgbm90IGRlZmluZWRcbiI7Ci0JICAgIHMvXFEkMVxFLy87Ci0JfSBlbHNlIHsKLQkgICAgJHZhbHVlID0gJGRlZnN7JDJ9OwotCSAgICBzL1xRJDFcRS8kdmFsdWUvOwotCX0KLSAgICB9Ci0KLSAgICAjIEZvcm1hdHRpbmcgY29tbWFuZHMuCi0gICAgIyBUZW1wb3JhcnkgZXNjYXBlIGZvciBAci4KLSAgICBzL1xAclx7KFteXH1dKilcfS9SPCQxPi9nOwotICAgIHMvXEAoPzpkZm58dmFyfGVtcGh8Y2l0ZXxpKVx7KFteXH1dKilcfS9JPCQxPi9nOwotICAgIHMvXEAoPzpjb2RlfGtiZClceyhbXlx9XSopXH0vQzwkMT4vZzsKLSAgICBzL1xAKD86Z2Njb3B0bGlzdHxzYW1wfHN0cm9uZ3xrZXl8b3B0aW9ufGVudnxjb21tYW5kfGIpXHsoW15cfV0qKVx9L0I8JDE+L2c7Ci0gICAgcy9cQHNjXHsoW15cfV0qKVx9L1xVJDEvZzsKLSAgICBzL1xAZmlsZVx7KFteXH1dKilcfS9GPCQxPi9nOwotICAgIHMvXEB3XHsoW15cfV0qKVx9L1M8JDE+L2c7Ci0gICAgcy9cQCg/OmRtbnxtYXRoKVx7KFteXH1dKilcfS8kMS9nOwotCi0gICAgIyBDcm9zcyByZWZlcmVuY2VzIGFyZSB0aHJvd24gYXdheSwgYXMgYXJlIEBub2luZGVudCBhbmQgQHJlZmlsbC4KLSAgICAjIChAbm9pbmRlbnQgaXMgaW1wb3NzaWJsZSBpbiAucG9kLCBhbmQgQHJlZmlsbCBpcyB1bm5lY2Vzc2FyeS4pCi0gICAgIyBAKiBpcyBhbHNvIGltcG9zc2libGUgaW4gLnBvZDsgd2UgZGlzY2FyZCBpdCBhbmQgYW55IG5ld2xpbmUgdGhhdAotICAgICMgZm9sbG93cyBpdC4gIFNpbWlsYXJseSwgb3VyIG1hY3JvIEBnb2wgbXVzdCBiZSBkaXNjYXJkZWQuCi0KLSAgICBzL1woP1xAeHJlZlx7KD86W15cfV0qKVx9KD86W14uPF18KD86PFtePD5dKj4pKSpcLlwpPy8vZzsKLSAgICBzL1xzK1woXEBweHJlZlx7KD86W15cfV0qKVx9XCkvL2c7Ci0gICAgcy87XHMrXEBweHJlZlx7KD86W15cfV0qKVx9Ly9nOwotICAgIHMvXEBub2luZGVudFxzKi8vZzsKLSAgICBzL1xAcmVmaWxsLy9nOwotICAgIHMvXEBnb2wvL2c7Ci0gICAgcy9cQFwqXHMqXG4/Ly9nOwotCi0gICAgIyBAdXJlZiBjYW4gdGFrZSBvbmUsIHR3bywgb3IgdGhyZWUgYXJndW1lbnRzLCB3aXRoIGRpZmZlcmVudAotICAgICMgc2VtYW50aWNzIGVhY2ggdGltZS4gIEB1cmwgYW5kIEBlbWFpbCBhcmUganVzdCBsaWtlIEB1cmVmIHdpdGgKLSAgICAjIG9uZSBhcmd1bWVudCwgZm9yIG91ciBwdXJwb3Nlcy4KLSAgICBzL1xAKD86dXJlZnx1cmx8ZW1haWwpXHsoW15cfSxdKilcfS8mbHQ7QjwkMT4mZ3Q7L2c7Ci0gICAgcy9cQHVyZWZceyhbXlx9LF0qKSwoW15cfSxdKilcfS8kMiAoQzwkMT4pL2c7Ci0gICAgcy9cQHVyZWZceyhbXlx9LF0qKSwoW15cfSxdKiksKFteXH0sXSopXH0vJDMvZzsKLQotICAgICMgVW4tZXNjYXBlIDw+IGF0IHRoaXMgcG9pbnQuCi0gICAgcy8mTFQ7LzwvZzsKLSAgICBzLyZHVDsvPi9nOwotCi0gICAgIyBOb3cgdW4tbmVzdCBhbGwgQjw+LCBJPD4sIFI8Pi4gIFRoZW9yZXRpY2FsbHkgd2UgY291bGQgaGF2ZQotICAgICMgaW5kZWZpbml0ZWx5IGRlZXAgbmVzdGluZzsgaW4gcHJhY3RpY2UsIG9uZSBsZXZlbCBzdWZmaWNlcy4KLSAgICAxIHdoaWxlIHMvKFtCSVJdKTwoW148Pl0qKShbQklSXSk8KFtePD5dKik+LyQxPCQyPiQzPCQ0PiQxPC9nOwotCi0gICAgIyBSZXBsYWNlIFI8Li4uPiB3aXRoIGJhcmUgLi4uOyBlbGltaW5hdGUgZW1wdHkgbWFya3VwLCBCPD47Ci0gICAgIyBzaGlmdCB3aGl0ZSBzcGFjZSBhdCB0aGUgZW5kcyBvZiBbQkldPC4uLj4gZXhwcmVzc2lvbnMgb3V0c2lkZQotICAgICMgdGhlIGV4cHJlc3Npb24uCi0gICAgcy9SPChbXjw+XSopPi8kMS9nOwotICAgIHMvW0JJXTw+Ly9nOwotICAgIHMvKFtCSV0pPChccyspKFtePl0rKT4vJDIkMTwkMz4vZzsKLSAgICBzLyhbQkldKTwoW14+XSs/KShccyspPi8kMTwkMj4kMy9nOwotCi0gICAgIyBFeHRyYWN0IGZvb3Rub3Rlcy4gIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgYWxsIG90aGVyCi0gICAgIyBwcm9jZXNzaW5nIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSByZWdleHAgd2lsbCBjaG9rZSBvbiBmb3JtYXR0aW5nCi0gICAgIyBpbnNpZGUgQGZvb3Rub3RlLgotICAgIHdoaWxlICgvXEBmb290bm90ZS9nKSB7Ci0Jcy9cQGZvb3Rub3RlXHsoW15cfV0rKVx9L1skZm5ub10vOwotCWFkZF9mb290bm90ZSgkMSwgJGZubm8pOwotCSRmbm5vKys7Ci0gICAgfQotCi0gICAgcmV0dXJuICRfOwotfQotCi1zdWIgdW5tdW5nZQotewotICAgICMgUmVwbGFjZSBlc2NhcGVkIHN5bWJvbHMgd2l0aCB0aGVpciBlcXVpdmFsZW50cy4KLSAgICBsb2NhbCAkXyA9ICRfWzBdOwotCi0gICAgcy8mbHQ7L0U8bHQ+L2c7Ci0gICAgcy8mZ3Q7L0U8Z3Q+L2c7Ci0gICAgcy8mbGJyYWNlOy9cey9nOwotICAgIHMvJnJicmFjZTsvXH0vZzsKLSAgICBzLyZhdDsvXEAvZzsKLSAgICBzLyZhbXA7LyYvZzsKLSAgICByZXR1cm4gJF87Ci19Ci0KLXN1YiBhZGRfZm9vdG5vdGUKLXsKLSAgICB1bmxlc3MgKGV4aXN0cyAkc2VjdHN7Rk9PVE5PVEVTfSkgewotCSRzZWN0c3tGT09UTk9URVN9ID0gIlxuPW92ZXIgNFxuXG4iOwotICAgIH0KLQotICAgICRzZWN0c3tGT09UTk9URVN9IC49ICI9aXRlbSAkZm5uby5cblxuIjsgJGZubm8rKzsKLSAgICAkc2VjdHN7Rk9PVE5PVEVTfSAuPSAkX1swXTsKLSAgICAkc2VjdHN7Rk9PVE5PVEVTfSAuPSAiXG5cbiI7Ci19Ci0KLSMgc3RvbGVuIGZyb20gU3ltYm9sLnBtCi17Ci0gICAgbXkgJGdlbnNlcSA9IDA7Ci0gICAgc3ViIGdlbnN5bQotICAgIHsKLQlteSAkbmFtZSA9ICJHRU4iIC4gJGdlbnNlcSsrOwotCW15ICRyZWYgPSBcKnskbmFtZX07Ci0JZGVsZXRlICQ6OnskbmFtZX07Ci0JcmV0dXJuICRyZWY7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY3B1L0NoYW5nZUxvZyBiL2NwdS9DaGFuZ2VMb2cKaW5kZXggMmE4ODhlMC4uYzAwMTlkOCAxMDA2NDQKLS0tIGEvY3B1L0NoYW5nZUxvZworKysgYi9jcHUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTcgQEAKKzIwMDYtMDQtMTAgIERKIERlbG9yaWUgIDxkakByZWRoYXQuY29tPgorCisJKiBtMzJjLm9wYyAocGFyc2VfdW5zaWduZWRfYml0YmFzZSk6IFRha2UgYSBuZXcgcGFyYW1ldGVyIHdoaWNoCisJZGVjaWRlcyBpZiB0aGlzIGZ1bmN0aW9uIGFjY2VwdHMgc3ltYm9saWMgY29uc3RhbnRzIG9yIG5vdC4KKwkocGFyc2Vfc2lnbmVkX2JpdGJhc2UpOiBMaWtld2lzZS4KKwkocGFyc2VfdW5zaWduZWRfYml0YmFzZTgpOiBQYXNzIHRoZSBuZXcgcGFyYW1ldGVyLgorCShwYXJzZV91bnNpZ25lZF9iaXRiYXNlMTEpOiBMaWtld2lzZS4KKwkocGFyc2VfdW5zaWduZWRfYml0YmFzZTE2KTogTGlrZXdpc2UuCisJKHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2UxOSk6IExpa2V3aXNlLgorCShwYXJzZV91bnNpZ25lZF9iaXRiYXNlMjcpOiBMaWtld2lzZS4KKwkocGFyc2Vfc2lnbmVkX2JpdGJhc2U4KTogTGlrZXdpc2UuCisJKHBhcnNlX3NpZ25lZF9iaXRiYXNlMTEpOiBMaWtld2lzZS4KKwkocGFyc2Vfc2lnbmVkX2JpdGJhc2UxOSk6IExpa2V3aXNlLgorCQogMjAwNi0wMy0xMyAgREogRGVsb3JpZSAgPGRqQHJlZGhhdC5jb20+CiAKIAkqIG0zMmMuY3B1IChCaXQzLVMpOiBOZXcuCmRpZmYgLS1naXQgYS9jcHUvbTMyYy5vcGMgYi9jcHUvbTMyYy5vcGMKaW5kZXggZjY2NGU5YS4uNmI5ZWYxMSAxMDA2NDQKLS0tIGEvY3B1L20zMmMub3BjCisrKyBiL2NwdS9tMzJjLm9wYwpAQCAtNjA4LDEzICs2MDgsMTQgQEAKIHN0YXRpYyBjb25zdCBjaGFyICoKIHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2UgKENHRU5fQ1BVX0RFU0MgY2QsIGNvbnN0IGNoYXIgKipzdHJwLAogCQkJaW50IG9waW5kZXgsIHVuc2lnbmVkIGxvbmcgKnZhbHVlcCwKLQkJCXVuc2lnbmVkIGJpdHMpCisJCQl1bnNpZ25lZCBiaXRzLCBpbnQgYWxsb3dfc3ltcykKIHsKICAgY29uc3QgY2hhciAqZXJybXNnID0gMDsKICAgdW5zaWduZWQgbG9uZyBiaXQ7CiAgIHVuc2lnbmVkIGxvbmcgYmFzZTsKICAgY29uc3QgY2hhciAqbmV3cCA9ICpzdHJwOwogICB1bnNpZ25lZCBsb25nIGxvbmcgYml0YmFzZTsKKyAgbG9uZyBoYXZlX3plcm8gPSAwOwogCiAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsICYgbmV3cCwgb3BpbmRleCwgJiBiaXQpOwogICBpZiAoZXJybXNnKQpAQCAtNjI0LDYgKzYyNSwxMSBAQAogICAgIHJldHVybiAiTWlzc2luZyBiYXNlIGZvciBiaXQsYmFzZTo4IjsKIAogICArK25ld3A7CisKKyAgaWYgKHN0cm5jbXAgKG5ld3AsICIweDAiLCAzKSA9PSAwIAorICAgICAgfHwgKG5ld3BbMF0gPT0gJzAnICYmIG5ld3BbMV0gIT0gJ3gnKSkKKyAgICBoYXZlX3plcm8gPSAxOworCiAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsICYgbmV3cCwgb3BpbmRleCwgJiBiYXNlKTsKICAgaWYgKGVycm1zZykKICAgICByZXR1cm4gZXJybXNnOwpAQCAtNjMzLDYgKzYzOSwyMSBAQAogICBpZiAoYml0YmFzZSA+PSAoMXVsbCA8PCBiaXRzKSkKICAgICByZXR1cm4gXygiYml0LGJhc2UgaXMgb3V0IG9mIHJhbmdlIik7CiAKKyAgLyogSWYgdGhpcyBmaWVsZCBtYXkgcmVxdWlyZSBhIHJlbG9jYXRpb24gdGhlbiB1c2UgbGFyZ2VyIGRpc3BsYWNlbWVudC4gICovCisgIGlmICghIGhhdmVfemVybyAmJiBiYXNlID09IDApCisgICAgeworICAgICAgc3dpdGNoIChhbGxvd19zeW1zKSB7CisgICAgICBjYXNlIDA6CisJcmV0dXJuIF8oImJpdCxiYXNlIG91dCBvZiByYW5nZSBmb3Igc3ltYm9sIik7CisgICAgICBjYXNlIDE6CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisJaWYgKHN0cm5jbXAgKG5ld3AsICJbc2JdIiwgNCkgIT0gMCkKKwkgIHJldHVybiBfKCJiaXQsYmFzZSBvdXQgb2YgcmFuZ2UgZm9yIHN5bWJvbCIpOworCWJyZWFrOworICAgICAgfQorICAgIH0KKwogICAqdmFsdWVwID0gYml0YmFzZTsKICAgKnN0cnAgPSBuZXdwOwogICByZXR1cm4gMDsKQEAgLTY0MSw3ICs2NjIsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKgogcGFyc2Vfc2lnbmVkX2JpdGJhc2UgKENHRU5fQ1BVX0RFU0MgY2QsIGNvbnN0IGNoYXIgKipzdHJwLAogCQkgICAgICBpbnQgb3BpbmRleCwgc2lnbmVkIGxvbmcgKnZhbHVlcCwKLQkJICAgICAgdW5zaWduZWQgYml0cykKKwkJICAgICAgdW5zaWduZWQgYml0cywgaW50IGFsbG93X3N5bXMpCiB7CiAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IDA7CiAgIHVuc2lnbmVkIGxvbmcgYml0OwpAQCAtNjQ5LDYgKzY3MCw3IEBACiAgIGNvbnN0IGNoYXIgKm5ld3AgPSAqc3RycDsKICAgbG9uZyBsb25nIGJpdGJhc2U7CiAgIGxvbmcgbG9uZyBsaW1pdDsKKyAgbG9uZyBoYXZlX3plcm8gPSAwOwogCiAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsICYgbmV3cCwgb3BpbmRleCwgJiBiaXQpOwogICBpZiAoZXJybXNnKQpAQCAtNjU4LDYgKzY4MCwxMSBAQAogICAgIHJldHVybiAiTWlzc2luZyBiYXNlIGZvciBiaXQsYmFzZTo4IjsKIAogICArK25ld3A7CisKKyAgaWYgKHN0cm5jbXAgKG5ld3AsICIweDAiLCAzKSA9PSAwIAorICAgICAgfHwgKG5ld3BbMF0gPT0gJzAnICYmIG5ld3BbMV0gIT0gJ3gnKSkKKyAgICBoYXZlX3plcm8gPSAxOworCiAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCAmIG5ld3AsIG9waW5kZXgsICYgYmFzZSk7CiAgIGlmIChlcnJtc2cpCiAgICAgcmV0dXJuIGVycm1zZzsKQEAgLTY2OCw2ICs2OTUsMTAgQEAKICAgaWYgKGJpdGJhc2UgPCAtbGltaXQgfHwgYml0YmFzZSA+PSBsaW1pdCkKICAgICByZXR1cm4gXygiYml0LGJhc2UgaXMgb3V0IG9mIHJhbmdlIik7CiAKKyAgLyogSWYgdGhpcyBmaWVsZCBtYXkgcmVxdWlyZSBhIHJlbG9jYXRpb24gdGhlbiB1c2UgbGFyZ2VyIGRpc3BsYWNlbWVudC4gICovCisgIGlmICghIGhhdmVfemVybyAmJiBiYXNlID09IDAgJiYgISBhbGxvd19zeW1zKQorICAgIHJldHVybiBfKCJiaXQsYmFzZSBvdXQgb2YgcmFuZ2UgZm9yIHN5bWJvbCIpOworCiAgICp2YWx1ZXAgPSBiaXRiYXNlOwogICAqc3RycCA9IG5ld3A7CiAgIHJldHVybiAwOwpAQCAtNjc3LDU2ICs3MDgsNTYgQEAKIHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2U4IChDR0VOX0NQVV9ERVNDIGNkLCBjb25zdCBjaGFyICoqc3RycCwKIAkJCSBpbnQgb3BpbmRleCwgdW5zaWduZWQgbG9uZyAqdmFsdWVwKQogewotICByZXR1cm4gcGFyc2VfdW5zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgOCk7CisgIHJldHVybiBwYXJzZV91bnNpZ25lZF9iaXRiYXNlIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCA4LCAwKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKgogcGFyc2VfdW5zaWduZWRfYml0YmFzZTExIChDR0VOX0NQVV9ERVNDIGNkLCBjb25zdCBjaGFyICoqc3RycCwKIAkJCSBpbnQgb3BpbmRleCwgdW5zaWduZWQgbG9uZyAqdmFsdWVwKQogewotICByZXR1cm4gcGFyc2VfdW5zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMTEpOworICByZXR1cm4gcGFyc2VfdW5zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMTEsIDApOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqCiBwYXJzZV91bnNpZ25lZF9iaXRiYXNlMTYgKENHRU5fQ1BVX0RFU0MgY2QsIGNvbnN0IGNoYXIgKipzdHJwLAogCQkJICBpbnQgb3BpbmRleCwgdW5zaWduZWQgbG9uZyAqdmFsdWVwKQogewotICByZXR1cm4gcGFyc2VfdW5zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMTYpOworICByZXR1cm4gcGFyc2VfdW5zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMTYsIDEpOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqCiBwYXJzZV91bnNpZ25lZF9iaXRiYXNlMTkgKENHRU5fQ1BVX0RFU0MgY2QsIGNvbnN0IGNoYXIgKipzdHJwLAogCQkJIGludCBvcGluZGV4LCB1bnNpZ25lZCBsb25nICp2YWx1ZXApCiB7Ci0gIHJldHVybiBwYXJzZV91bnNpZ25lZF9iaXRiYXNlIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxOSk7CisgIHJldHVybiBwYXJzZV91bnNpZ25lZF9iaXRiYXNlIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxOSwgMik7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICoKIHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2UyNyAoQ0dFTl9DUFVfREVTQyBjZCwgY29uc3QgY2hhciAqKnN0cnAsCiAJCQkgaW50IG9waW5kZXgsIHVuc2lnbmVkIGxvbmcgKnZhbHVlcCkKIHsKLSAgcmV0dXJuIHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDI3KTsKKyAgcmV0dXJuIHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDI3LCAxKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKgogcGFyc2Vfc2lnbmVkX2JpdGJhc2U4IChDR0VOX0NQVV9ERVNDIGNkLCBjb25zdCBjaGFyICoqc3RycCwKIAkJICAgICAgIGludCBvcGluZGV4LCBzaWduZWQgbG9uZyAqdmFsdWVwKQogewotICByZXR1cm4gcGFyc2Vfc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDgpOworICByZXR1cm4gcGFyc2Vfc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDgsIDEpOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqCiBwYXJzZV9zaWduZWRfYml0YmFzZTExIChDR0VOX0NQVV9ERVNDIGNkLCBjb25zdCBjaGFyICoqc3RycCwKIAkJICAgICAgIGludCBvcGluZGV4LCBzaWduZWQgbG9uZyAqdmFsdWVwKQogewotICByZXR1cm4gcGFyc2Vfc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDExKTsKKyAgcmV0dXJuIHBhcnNlX3NpZ25lZF9iaXRiYXNlIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxMSwgMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICoKIHBhcnNlX3NpZ25lZF9iaXRiYXNlMTkgKENHRU5fQ1BVX0RFU0MgY2QsIGNvbnN0IGNoYXIgKipzdHJwLAogCQkgICAgICAgaW50IG9waW5kZXgsIHNpZ25lZCBsb25nICp2YWx1ZXApCiB7Ci0gIHJldHVybiBwYXJzZV9zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMTkpOworICByZXR1cm4gcGFyc2Vfc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDE5LCAxKTsKIH0KIAogLyogUGFyc2UgdGhlIHN1ZmZpeCBhcyA6PGNoYXI+IG9yIGFzIG5vdGhpbmcgZm9sbG93ZWQgYnkgYSB3aGl0ZXNwYWNlLiAgKi8KZGlmZiAtLWdpdCBhL2V0Yy9DaGFuZ2VMb2cgYi9ldGMvQ2hhbmdlTG9nCmluZGV4IDY0ZmRlZTYuLjBkMmI4MGMgMTAwNjQ0Ci0tLSBhL2V0Yy9DaGFuZ2VMb2cKKysrIGIvZXRjL0NoYW5nZUxvZwpAQCAtMSwzICsxLDExIEBACisyMDA2LTA0LTA2ICBDYXJsb3MgTydEb25lbGwgIDxjYXJsb3NAY29kZXNvdXJjZXJ5LmNvbT4KKworCSogTWFrZWZpbGUuaW46IEFkZCBpbnN0YWxsLWh0bWwgdGFyZ2V0LiBBZGQgaHRtbGRpciwKKwlkb2NkaXIgYW5kIGRhdGFyb290ZGlyLgorCSogY29uZmlndXJlLnRleGk6IERvY3VtZW50IGluc3RhbGwtaHRtbCB0YXJnZXQuCisJKiBjb25maWd1cmUuaW46IEFDX1NVQlNUIGRhdGFyb290ZGlyLCBkb2NkaXIsIGh0bWxkaXIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKIDIwMDYtMDItMjcgIENhcmxvcyBPJ0RvbmVsbCAgPGNhcmxvc0Bjb2Rlc291cmNlcnkuY29tPgogCiAJKiBNYWtlZmlsZS5pbjogVEVYSTJIVE1MIHVzZXMgbWFrZWluZm8uIERlZmluZSAKZGlmZiAtLWdpdCBhL2V0Yy9NYWtlZmlsZS5pbiBiL2V0Yy9NYWtlZmlsZS5pbgppbmRleCBkZjQ2MWNmLi43ZDA2MDdkIDEwMDY0NAotLS0gYS9ldGMvTWFrZWZpbGUuaW4KKysrIGIvZXRjL01ha2VmaWxlLmluCkBAIC0yNSw3ICsyNSwxMCBAQAogbWFuN2RpciA9ICQobWFuZGlyKS9tYW43CiBtYW44ZGlyID0gJChtYW5kaXIpL21hbjgKIG1hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAogaW5mb2RpciA9IEBpbmZvZGlyQAoraHRtbGRpciA9IEBodG1sZGlyQAogCiBTSEVMTCA9IC9iaW4vc2gKIApAQCAtOTcsNiArMTAwLDIwIEBACiAJICBmaTsgXAogCWRvbmUKIAoraW5zdGFsbC1odG1sOiBodG1sCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21raW5zdGFsbGRpcnMgJChERVNURElSKSQoaHRtbGRpcikKKwlpZiB0ZXN0ICEgLWYgc3RhbmRhcmRzLmh0bWw7IHRoZW4gY2QgJChzcmNkaXIpOyBmaTsgXAorCWlmIHRlc3QgLWYgc3RhbmRhcmRzLmh0bWw7IHRoZW4gXAorCSAgZm9yIGkgaW4gc3RhbmRhcmRzLmh0bWwqOyBkbyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGkgJChERVNURElSKSQoaHRtbGRpcikvJCRpOyBcCisJICBkb25lOyBcCisJZmkKKwlpZiB0ZXN0ICEgLWYgY29uZmlndXJlLmh0bWw7IHRoZW4gY2QgJChzcmNkaXIpOyBmaTsgXAorCWlmIHRlc3QgLWYgY29uZmlndXJlLmh0bWw7IHRoZW4gXAorCSAgZm9yIGkgaW4gY29uZmlndXJlLmh0bWwqOyBkbyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGkgJChERVNURElSKSQoaHRtbGRpcikvJCRpOyBcCisJICBkb25lOyBcCisJZmkKIAogZHZpOgogCWZvciBmIGluICQoRFZJRklMRVMpOyBkbyBcCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlIGIvZXRjL2NvbmZpZ3VyZQppbmRleCAxMDFmY2VmLi44MjAzM2U5IDEwMDc1NQotLS0gYS9ldGMvY29uZmlndXJlCisrKyBiL2V0Yy9jb25maWd1cmUKQEAgLTEsMjYgKzEsMjg4IEBACiAjISAvYmluL3NoCi0KICMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OS4KICMKKyMgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCiAKLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQorIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCitlbGlmIHRlc3QgLW4gIiR7QkFTSF9WRVJTSU9OK3NldH0iICYmIChzZXQgLW8gcG9zaXgpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBzZXQgLW8gcG9zaXgKK2ZpCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgoraWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Vuc2V0PXVuc2V0CitlbHNlCisgIGFzX3Vuc2V0PWZhbHNlCitmaQorCisKKyMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorJGFzX3Vuc2V0IEVOViBNQUlMIE1BSUxQQVRICitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK2ZvciBhc192YXIgaW4gXAorICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAorICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAorICBMQ19URUxFUEhPTkUgTENfVElNRQorZG8KKyAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KKyAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKKyAgZWxzZQorICAgICRhc191bnNldCAkYXNfdmFyCisgIGZpCitkb25lCisKKyMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgoraWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKKworIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorYXNfbWU9YCRhc19iYXNlbmFtZSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCkkJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXC9cKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXC9cKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKworCisjIFBBVEggbmVlZHMgQ1IsIGFuZCBMSU5FTk8gbmVlZHMgQ1IgYW5kIFBBVEguCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCisgIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKKyAgY2htb2QgK3ggY29uZiQkLnNoCisgIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIGVsc2UKKyAgICBQQVRIX1NFUEFSQVRPUj06CisgIGZpCisgIHJtIC1mIGNvbmYkJC5zaAorZmkKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTworICBhc19saW5lbm9fMz1gKGV4cHIgJGFzX2xpbmVub18xICsgMSkgMj4vZGV2L251bGxgCisgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorICB0ZXN0ICJ4JGFzX2xpbmVub18zIiAgPSAieCRhc19saW5lbm9fMiIgIHx8IHsKKyAgIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gcGF0aCBhdCBhbGwKKyAgIyByZWxhdGl2ZSBvciBub3QuCisgIGNhc2UgJDAgaW4KKyAgICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworZG9uZQorCisgICAgICAgOzsKKyAgZXNhYworICAjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisgICMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorICBpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgICAgYXNfbXlzZWxmPSQwCisgIGZpCisgIGlmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorICBjYXNlICRDT05GSUdfU0hFTEwgaW4KKyAgJycpCisgICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCisJIGNhc2UgJGFzX2RpciBpbgorCSAvKikKKwkgICBpZiAoIiRhc19kaXIvJGFzX2Jhc2UiIC1jICcKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAnKSAyPi9kZXYvbnVsbDsgdGhlbgorCSAgICAgJGFzX3Vuc2V0IEJBU0hfRU5WIHx8IHRlc3QgIiR7QkFTSF9FTlYrc2V0fSIgIT0gc2V0IHx8IHsgQkFTSF9FTlY9OyBleHBvcnQgQkFTSF9FTlY7IH0KKwkgICAgICRhc191bnNldCBFTlYgfHwgdGVzdCAiJHtFTlYrc2V0fSIgIT0gc2V0IHx8IHsgRU5WPTsgZXhwb3J0IEVOVjsgfQorCSAgICAgQ09ORklHX1NIRUxMPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKKwkgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkMCIgJHsxKyIkQCJ9CisJICAgZmk7OworCSBlc2FjCisgICAgICAgZG9uZQorZG9uZQorOzsKKyAgZXNhYworCisgICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KKyAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQorICAjIGxpbmUtbnVtYmVyIGxpbmUgYmVmb3JlIGVhY2ggbGluZTsgdGhlIHNlY29uZCAnc2VkJyBkb2VzIHRoZSByZWFsCisgICMgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaCBsaW5lLW51bWJlciBsaW5lCisgICMgd2l0aCB0aGUgbnVtYmVyZWQgbGluZSwgYW5kIGFwcGVuZHMgdHJhaWxpbmcgJy0nIGR1cmluZworICAjIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbCBjYXNlIGF0IGxpbmUgZW5kLgorICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKKyAgIyBzZWNvbmQgJ3NlZCcgc2NyaXB0LiAgQmxhbWUgTGVlIEUuIE1jTWFob24gZm9yIHNlZCdzIHN5bnRheC4gIDotKQorICBzZWQgJz0nIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgTgorICAgICAgcywkLC0sCisgICAgICA6IGxvb3AKKyAgICAgIHMsXlwoWyckYXNfY3JfZGlnaXRzJ10qXClcKC4qXClbJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXVwpLFwxXDJcMVwzLAorICAgICAgdCBsb29wCisgICAgICBzLC0kLCwKKyAgICAgIHMsXlsnJGFzX2NyX2RpZ2l0cyddKlxuLCwKKyAgICAnID4kYXNfbWUubGluZW5vICYmCisgIGNobW9kICt4ICRhc19tZS5saW5lbm8gfHwKKyAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCisgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQorICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2libGUgdG8gdGhpcykuCisgIC4gLi8kYXNfbWUubGluZW5vCisgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgorICBleGl0Cit9CisKKworY2FzZSBgZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsM2AsYGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsM2AgaW4KKyAgKmMqLC1uKikgRUNIT19OPSBFQ0hPX0M9JworJyBFQ0hPX1Q9JwknIDs7CisgICpjKiwqICApIEVDSE9fTj0tbiBFQ0hPX0M9IEVDSE9fVD0gOzsKKyAgKikgICAgICAgRUNIT19OPSBFQ0hPX0M9J1xjJyBFQ0hPX1Q9IDs7Citlc2FjCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAjIFdlIGNvdWxkIGp1c3QgY2hlY2sgZm9yIERKR1BQOyBidXQgdGhpcyB0ZXN0IGEpIHdvcmtzIGIpIGlzIG1vcmUgZ2VuZXJpYworICAjIGFuZCBjKSB3aWxsIHJlbWFpbiB2YWxpZCBvbmNlIERKR1BQIHN1cHBvcnRzIHN5bWxpbmtzIChESkdQUCAyLjA0KS4KKyAgaWYgdGVzdCAtZiBjb25mJCQuZXhlOyB0aGVuCisgICAgIyBEb24ndCB1c2UgbG4gYXQgYWxsOyB3ZSBkb24ndCBoYXZlIGFueSBsaW5rcworICAgIGFzX2xuX3M9J2NwIC1wJworICBlbHNlCisgICAgYXNfbG5fcz0nbG4gLXMnCisgIGZpCitlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPWxuCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD06CitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2FzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLgorYXNfbmw9JworJworSUZTPSIgCSRhc19ubCIKKworIyBDRFBBVEguCiskYXNfdW5zZXQgQ0RQQVRICisKKworIyBOYW1lIG9mIHRoZSBob3N0LgorIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKK2V4ZWMgNj4mMQorCisjCisjIEluaXRpYWxpemF0aW9ucy4KKyMKIGFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2NvbmZpZ19saWJvYmpfZGlyPS4KK2Nyb3NzX2NvbXBpbGluZz1ubworc3ViZGlycz0KK01GTEFHUz0KK01BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KKyMgVGhpcyB2YXJpYWJsZSBzZWVtcyBvYnNvbGV0ZS4gIEl0IHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkLCBhbmQKKyMgb25seSBhY19tYXhfc2VkX2xpbmVzIHNob3VsZCBiZSB1c2VkLgorOiAke2FjX21heF9oZXJlX2xpbmVzPTM4fQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0KK1BBQ0tBR0VfVEFSTkFNRT0KK1BBQ0tBR0VfVkVSU0lPTj0KK1BBQ0tBR0VfU1RSSU5HPQorUEFDS0FHRV9CVUdSRVBPUlQ9CisKK2FjX3VuaXF1ZV9maWxlPSJNYWtlZmlsZS5pbiIKK2FjX3N1YnN0X3ZhcnM9J1NIRUxMIFBBVEhfU0VQQVJBVE9SIFBBQ0tBR0VfTkFNRSBQQUNLQUdFX1RBUk5BTUUgUEFDS0FHRV9WRVJTSU9OIFBBQ0tBR0VfU1RSSU5HIFBBQ0tBR0VfQlVHUkVQT1JUIGV4ZWNfcHJlZml4IHByZWZpeCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpciBidWlsZF9hbGlhcyBob3N0X2FsaWFzIHRhcmdldF9hbGlhcyBERUZTIEVDSE9fQyBFQ0hPX04gRUNIT19UIExJQlMgSU5TVEFMTF9QUk9HUkFNIElOU1RBTExfU0NSSVBUIElOU1RBTExfREFUQSBkYXRhcm9vdGRpciBkb2NkaXIgaHRtbGRpciBMSUJPQkpTIExUTElCT0JKUycKK2FjX3N1YnN0X2ZpbGVzPScnCiAKICMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KK2FjX2luaXRfaGVscD0KK2FjX2luaXRfdmVyc2lvbj1mYWxzZQogIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKICMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2NhY2hlX2ZpbGU9L2Rldi9udWxsCiBleGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKIG5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCiBub19yZWN1cnNpb249CiBwcmVmaXg9Tk9ORQogcHJvZ3JhbV9wcmVmaXg9Tk9ORQpAQCAtMjksMTAgKzI5MSwxNSBAQAogc2lsZW50PQogc2l0ZT0KIHNyY2Rpcj0KLXRhcmdldD1OT05FCiB2ZXJib3NlPQogeF9pbmNsdWRlcz1OT05FCiB4X2xpYnJhcmllcz1OT05FCisKKyMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgorIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCisjIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAorIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgorIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KIGJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwogc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKIGxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCkBAIC00NiwxNyArMzEzLDkgQEAKIGluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwogbWFuZGlyPScke3ByZWZpeH0vbWFuJwogCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQogYWNfcHJldj0KIGZvciBhY19vcHRpb24KIGRvCi0KICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCiAgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgogICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgpAQCAtNjQsNTkgKzMyMyw1OSBAQAogICAgIGNvbnRpbnVlCiAgIGZpCiAKLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYworICBhY19vcHRhcmc9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4W149XSo9XCguKlwpJ2AKIAogICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgogCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCisgIGNhc2UgJGFjX29wdGlvbiBpbgogCiAgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCiAgICAgYWNfcHJldj1iaW5kaXIgOzsKICAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKIAogICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CiAgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKIAogICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCiAgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQogICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwogICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKICAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworCisgIC0tY29uZmlnLWNhY2hlIHwgLUMpCisgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKIAogICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKICAgICBhY19wcmV2PWRhdGFkaXIgOzsKICAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCiAgIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisgICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7CiAKICAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAogICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisgICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJGFjX2ZlYXR1cmU9bm8iIDs7CiAKICAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAogICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgJGFjX29wdGlvbiBpbgorICAgICAgKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKICAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKICAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT0nJGFjX29wdGFyZyciIDs7CiAKICAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAogICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCkBAIC0xMjUsOTUgKzM4NCw0NyBAQAogICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKICAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKICAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisgICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OwogCiAgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCiAgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCiAgICAgd2l0aF9nYXM9eWVzIDs7CiAKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCisgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKyAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQorICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OwogCiAgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OworICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OwogICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisgICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7CiAKICAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAogICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQogICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwogICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAogICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKyAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKIAogICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQogICAgIGFjX3ByZXY9aW5mb2RpciA7OwogICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CiAKICAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKICAgICBhY19wcmV2PWxpYmRpciA7OwogICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CiAKICAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAogICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKICAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKICAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKICAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKIAogICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCiAgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKQEAgLTIyMiwxOSArNDMzLDE5IEBACiAgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAogICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKICAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisgICAgbG9jYWxzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CiAKICAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKICAgICBhY19wcmV2PW1hbmRpciA7OwogICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CiAKICAgLW5mcCB8IC0tbmZwIHwgLS1uZikKICAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgogICAgIHdpdGhfZnA9bm8gOzsKIAogICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQogICAgIG5vX2NyZWF0ZT15ZXMgOzsKIAogICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKQEAgLTI0OCwyNiArNDU5LDI2IEBACiAgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAogICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCiAgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKyAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKIAogICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQogICAgIGFjX3ByZXY9cHJlZml4IDs7CiAgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKIAogICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAogICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKICAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CiAgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAogICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OwogCiAgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCiAgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQogICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKICAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCiAgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CiAKICAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAogICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCkBAIC0yODQsNyArNDk1LDcgQEAKICAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKICAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAogICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSRhY19vcHRhcmcgOzsKIAogICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAogICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKQEAgLTI5NCw3ICs1MDUsNyBAQAogICAgIGFjX3ByZXY9c2JpbmRpciA7OwogICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAogICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKyAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKIAogICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKICAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCkBAIC0zMDUsNTggKzUxNiw1NyBAQAogICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAogICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKICAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKIAogICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQogICAgIGFjX3ByZXY9c2l0ZSA7OwogICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisgICAgc2l0ZT0kYWNfb3B0YXJnIDs7CiAKICAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKICAgICBhY19wcmV2PXNyY2RpciA7OwogICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwogCiAgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKICAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCiAgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CiAgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCiAgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworICAgIHN5c2NvbmZkaXI9JGFjX29wdGFyZyA7OwogCiAgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OwogICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworICAgIHRhcmdldF9hbGlhcz0kYWNfb3B0YXJnIDs7CiAKICAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKICAgICB2ZXJib3NlPXllcyA7OwogCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLVYpCisgICAgYWNfaW5pdF92ZXJzaW9uPTogOzsKIAogICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAogICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQorICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi1fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiAgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OworICAgIGNhc2UgJGFjX29wdGlvbiBpbgorICAgICAgKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKICAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKICAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKyAgICBldmFsICJ3aXRoXyRhY19wYWNrYWdlPSckYWNfb3B0YXJnJyIgOzsKIAogICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRob3V0LVwoLipcKSdgCiAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisgICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyRhY19wYWNrYWdlPW5vIiA7OwogCiAgIC0teCkKICAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCkBAIC0zNjcsOTkgKzU3NywxMTAgQEAKICAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKICAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKICAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CiAKICAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKICAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCiAgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwogICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCiAgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKIAotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiAgICAgOzsKIAorICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2VudnZhciIgOiAiLipbXl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFyaWFibGUgbmFtZTogJGFjX2VudnZhciIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgCisgICAgZXZhbCAiJGFjX2VudnZhcj0nJGFjX29wdGFyZyciCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKwogICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQogICAgIDs7CiAKICAgZXNhYwogZG9uZQogCiBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CisgIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKKyAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBmaQogCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKKyMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIHBhdGhzLgorZm9yIGFjX3ZhciBpbiBleGVjX3ByZWZpeCBwcmVmaXgKIGRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qIHwgTk9ORSB8ICcnICkgOzsKKyAgICAqKSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CiAgIGVzYWMKIGRvbmUKIAotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgcGF0aHMuCitmb3IgYWNfdmFyIGluIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIFwKKwkgICAgICBsb2NhbHN0YXRlZGlyIGxpYmRpciBpbmNsdWRlZGlyIG9sZGluY2x1ZGVkaXIgaW5mb2RpciBtYW5kaXIKK2RvCisgIGV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAorICBjYXNlICRhY192YWwgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSA7OworICAgICopICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgZXNhYworZG9uZQogCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCisjIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCisjIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2J1aWxkPSRidWlsZF9hbGlhcworaG9zdD0kaG9zdF9hbGlhcwordGFyZ2V0PSR0YXJnZXRfYWxpYXMKIAotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgorICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCiAKICMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KIGlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCiAgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCiAgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIGFjX2NvbmZkaXI9YChkaXJuYW1lICIkMCIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiQwIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJDAiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAogICBzcmNkaXI9JGFjX2NvbmZkaXIKICAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCiAgICAgc3JjZGlyPS4uCkBAIC00NjksMTMgKzY5MCw0MjIgQEAKIGZpCiBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KICAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRhY19jb25mZGlyIG9yIC4uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KICAgZmkKIGZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKyhjZCAkc3JjZGlyICYmIHRlc3QgLXIgLi8kYWNfdW5pcXVlX2ZpbGUpIDI+L2Rldi9udWxsIHx8CisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogc291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK3NyY2Rpcj1gZWNobyAiJHNyY2RpciIgfCBzZWQgJ3MlXChbXlxcL11cKVtcXC9dKiQlXDElJ2AKK2FjX2Vudl9idWlsZF9hbGlhc19zZXQ9JHtidWlsZF9hbGlhcytzZXR9CithY19lbnZfYnVpbGRfYWxpYXNfdmFsdWU9JGJ1aWxkX2FsaWFzCithY19jdl9lbnZfYnVpbGRfYWxpYXNfc2V0PSR7YnVpbGRfYWxpYXMrc2V0fQorYWNfY3ZfZW52X2J1aWxkX2FsaWFzX3ZhbHVlPSRidWlsZF9hbGlhcworYWNfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfY3ZfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19jdl9lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfZW52X3RhcmdldF9hbGlhc19zZXQ9JHt0YXJnZXRfYWxpYXMrc2V0fQorYWNfZW52X3RhcmdldF9hbGlhc192YWx1ZT0kdGFyZ2V0X2FsaWFzCithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3NldD0ke3RhcmdldF9hbGlhcytzZXR9CithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPSR0YXJnZXRfYWxpYXMKIAorIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyB0aGlzIHBhY2thZ2UgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KKworVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KKworRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCisKK0NvbmZpZ3VyYXRpb246CisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworX0FDRU9GCisKKyAgY2F0IDw8X0FDRU9GCitJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorCQkJICBbUFJFRklYXQorCitCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KK1xgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CithbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAorZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKworRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCisKK0ZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbUFJFRklYL21hbl0KK19BQ0VPRgorCisgIGNhdCA8PFxfQUNFT0YKK19BQ0VPRgorZmkKKworaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KKworICBjYXQgPDxcX0FDRU9GCisKK19BQ0VPRgorZmkKKworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgorICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgorICBhY19wb3BkaXI9YHB3ZGAKKyAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKKyAgICB0ZXN0IC1kICRhY19kaXIgfHwgY29udGludWUKKyAgICBhY19idWlsZGRpcj0uCisKK2lmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAorICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwuLi8sZydgCitlbHNlCisgIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcj0KK2ZpCisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBpZiB0ZXN0IC16ICIkYWNfdG9wX2J1aWxkZGlyIjsgdGhlbgorICAgICAgIGFjX3RvcF9zcmNkaXI9LgorICAgIGVsc2UKKyAgICAgICBhY190b3Bfc3JjZGlyPWBlY2hvICRhY190b3BfYnVpbGRkaXIgfCBzZWQgJ3MsLyQsLCdgCisgICAgZmkgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIgOzsKK2VzYWMKKworIyBEbyBub3QgdXNlIGBjZCBmb28gJiYgcHdkYCB0byBjb21wdXRlIGFic29sdXRlIHBhdGhzLCBiZWNhdXNlCisjIHRoZSBkaXJlY3RvcmllcyBtYXkgbm90IGV4aXN0LgorY2FzZSBgcHdkYCBpbgorLikgYWNfYWJzX2J1aWxkZGlyPSIkYWNfZGlyIjs7CisqKQorICBjYXNlICIkYWNfZGlyIiBpbgorICAuKSBhY19hYnNfYnVpbGRkaXI9YHB3ZGA7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworICAqKSBhY19hYnNfYnVpbGRkaXI9YHB3ZGAvIiRhY19kaXIiOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3BfYnVpbGRkaXI9JHthY190b3BfYnVpbGRkaXJ9Ljs7CisqKQorICBjYXNlICR7YWNfdG9wX2J1aWxkZGlyfS4gaW4KKyAgLikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworICAqKSBhY19hYnNfdG9wX2J1aWxkZGlyPSRhY19hYnNfYnVpbGRkaXIvJHthY190b3BfYnVpbGRkaXJ9Ljs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfc3JjZGlyPSRhY19zcmNkaXI7OworKikKKyAgY2FzZSAkYWNfc3JjZGlyIGluCisgIC4pIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyAgKikgYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY19zcmNkaXI7OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworKikKKyAgY2FzZSAkYWNfdG9wX3NyY2RpciBpbgorICAuKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfdG9wX3NyY2Rpcjs7CisgICopIGFjX2Fic190b3Bfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXIvJGFjX3RvcF9zcmNkaXI7OworICBlc2FjOzsKK2VzYWMKKworICAgIGNkICRhY19kaXIKKyAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZTsgb3RoZXJ3aXNlIGdldCBDeWdudXMgc3R5bGUgY29uZmlndXJlLgorICAgIGlmIHRlc3QgLWYgJGFjX3NyY2Rpci9jb25maWd1cmUuZ251OyB0aGVuCisgICAgICBlY2hvCisgICAgICAkU0hFTEwgJGFjX3NyY2Rpci9jb25maWd1cmUuZ251ICAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlOyB0aGVuCisgICAgICBlY2hvCisgICAgICAkU0hFTEwgJGFjX3NyY2Rpci9jb25maWd1cmUgIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgJGFjX3NyY2Rpci9jb25maWd1cmUuYWMgfHwKKwkgICB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmluOyB0aGVuCisgICAgICBlY2hvCisgICAgICAkYWNfY29uZmlndXJlIC0taGVscAorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKKyAgICBmaQorICAgIGNkICRhY19wb3BkaXIKKyAgZG9uZQorZmkKKwordGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAwCitpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCisgIGNhdCA8PFxfQUNFT0YKKworQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KK19BQ0VPRgorICBleGl0IDAKK2ZpCitleGVjIDU+Y29uZmlnLmxvZworY2F0ID4mNSA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICAkICQwICRACisKK19BQ0VPRgoreworY2F0IDw8X0FTVU5BTUUKKyMjIC0tLS0tLS0tLSAjIworIyMgUGxhdGZvcm0uICMjCisjIyAtLS0tLS0tLS0gIyMKKworaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAorCisvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCitob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGwgICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisKK19BU1VOQU1FCisKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZWNobyAiUEFUSDogJGFzX2RpciIKK2RvbmUKKworfSA+JjUKKworY2F0ID4mNSA8PF9BQ0VPRgorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBDb3JlIHRlc3RzLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworX0FDRU9GCisKKworIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCisjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfY29uZmlndXJlX2FyZ3MwPQorYWNfY29uZmlndXJlX2FyZ3MxPQorYWNfc2VwPQorYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKK2ZvciBhY19wYXNzIGluIDEgMgorZG8KKyAgZm9yIGFjX2FyZworICBkbworICAgIGNhc2UgJGFjX2FyZyBpbgorICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKKyAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgICAgY29udGludWUgOzsKKyAgICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP1wiXCddKikKKyAgICAgIGFjX2FyZz1gZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICBlc2FjCisgICAgY2FzZSAkYWNfcGFzcyBpbgorICAgIDEpIGFjX2NvbmZpZ3VyZV9hcmdzMD0iJGFjX2NvbmZpZ3VyZV9hcmdzMCAnJGFjX2FyZyciIDs7CisgICAgMikKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzMT0iJGFjX2NvbmZpZ3VyZV9hcmdzMSAnJGFjX2FyZyciCisgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKwlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCisgICAgICBlbHNlCisJY2FzZSAkYWNfYXJnIGluCisJICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKKwkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKwkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQorCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyRhY19zZXAnJGFjX2FyZyciCisgICAgICAjIEdldCByaWQgb2YgdGhlIGxlYWRpbmcgc3BhY2UuCisgICAgICBhY19zZXA9IiAiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorZG9uZQorJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMCB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMCtzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczA9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MwOyB9CiskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MxK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczE7IH0KKworIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKyMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgorIyBXQVJOSU5HOiBCZSBzdXJlIG5vdCB0byB1c2Ugc2luZ2xlIHF1b3RlcyBpbiB0aGVyZSwgYXMgc29tZSBzaGVsbHMsCisjIHN1Y2ggYXMgb3VyIERVIDUuMCBmcmllbmQsIHdpbGwgdGhlbiBgY2xvc2UnIHRoZSB0cmFwLgordHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCisgIHsKKyAgICBlY2hvCisKKyAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisjIyBDYWNoZSB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICBlY2hvCisgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKK3sKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSBgKGFjX3NwYWNlPSciJyInICciJyInOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAgICphY19zcGFjZT1cICopCisgICAgICBzZWQgLW4gXAorCSJzLyciJyInLyciJyInXFxcXCciJyInJyInIicvZzsKKwkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9JyInIidcXDInIiciJy9wIgorICAgICAgOzsKKyAgICAqKQorICAgICAgc2VkIC1uIFwKKwkicy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT1cXDIvcCIKKyAgICAgIDs7CisgICAgZXNhYzsKK30KKyAgICBlY2hvCisKKyAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICBlY2hvCisgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfdmFycworICAgIGRvCisgICAgICBldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKyAgICAgIGVjaG8gIiRhY192YXI9JyInIickYWNfdmFsJyInIiciCisgICAgZG9uZSB8IHNvcnQKKyAgICBlY2hvCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgZmlsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCisgICAgICBkbworCWV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAorCWVjaG8gIiRhY192YXI9JyInIickYWNfdmFsJyInIiciCisgICAgICBkb25lIHwgc29ydAorICAgICAgZWNobworICAgIGZpCisKKyAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KKyAgICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBjb25mZGVmcy5oLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICAgZWNobworICAgICAgc2VkICIvXiQvZCIgY29uZmRlZnMuaCB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKyAgICAgIGVjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIgorICAgIGVjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCisgIH0gPiY1CisgIHJtIC1mIGNvcmUgKi5jb3JlICYmCisgIHJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMqIGNvbmYkJCogJGFjX2NsZWFuX2ZpbGVzICYmCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKKyAgICAgJyAwCitmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgeyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPmNvbmZkZWZzLmgKKworIyBQcmVkZWZpbmVkIHByZXByb2Nlc3NvciB2YXJpYWJsZXMuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9OQU1FICIkUEFDS0FHRV9OQU1FIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIiRQQUNLQUdFX1NUUklORyIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKK19BQ0VPRgorCisKKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgogIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCkBAIC00ODYsMzcgKzExMTYsMTAzIEBACiBmaQogZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCiAgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKICAgICAuICIkYWNfc2l0ZV9maWxlIgogICBmaQogZG9uZQogCiBpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQorICAjIFNvbWUgdmVyc2lvbnMgb2YgYmFzaCB3aWxsIGZhaWwgdG8gc291cmNlIC9kZXYvbnVsbCAoc3BlY2lhbAorICAjIGZpbGVzIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4KKyAgaWYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgorICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICRjYWNoZV9maWxlOzsKKyAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gLi8kY2FjaGVfZmlsZTs7CisgICAgZXNhYworICBmaQogZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICA+JGNhY2hlX2ZpbGUKK2ZpCisKKyMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKKyMgdmFsdWUuCithY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKK2ZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfAorCSAgICAgICBzZWQgLW4gJ3MvXmFjX2Vudl9cKFthLXpBLVpfMC05XSpcKV9zZXQ9LiovXDEvcCdgOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9IlwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZSIKKyAgZXZhbCBhY19uZXdfdmFsPSJcJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUiCisgIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KKyAgICBzZXQsKQorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsc2V0KQorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICwpOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1CitlY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mMjt9CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1CitlY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9CisJYWNfY2FjaGVfY29ycnVwdGVkPToKKyAgICAgIGZpOzsKKyAgZXNhYworICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCisgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgorICAgIGNhc2UgJGFjX25ld192YWwgaW4KKyAgICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP1wiXCddKikKKyAgICAgIGFjX2FyZz0kYWNfdmFyPWBlY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworICAgIGVzYWMKKyAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorICAgICAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICAgZXNhYworICBmaQorZG9uZQoraWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBmaQogCiBhY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgogYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKIAotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKwogCiAKIApAQCAtNTMwLDE0ICsxMjI2LDIwIEBACiAgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCiAgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKICAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9zaHRvb2w7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKyAgICBicmVhawogICBmaQogZG9uZQogaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIgorYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiCithY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KIAogIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCiAjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKQEAgLTU0NiwzMTcgKzEyNDgsOTkzIEBACiAjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKICMgSVJJWCAvc2Jpbi9pbnN0YWxsCiAjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcwogIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKICMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwogIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCiAjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU1NTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2CiBpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgoraWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorY2FzZSAkYXNfZGlyLyBpbgorICAuLyB8IC4vLyB8IC9jQy8qIHwgXAorICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKyAgPzpcXC9vczJcXC9pbnN0YWxsXFwvKiB8ID86XFwvT1MyXFwvSU5TVEFMTFxcLyogfCBcCisgIC91c3IvdWNiLyogKSA7OworICAqKQorICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgIyBieSBkZWZhdWx0LgorICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCWlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCiAJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgogCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCiAJICAgIDoKKwkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KKwkgICAgOgogCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorCSAgICBicmVhayAzCiAJICBmaQogCWZpCiAgICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKKyAgICBkb25lCisgICAgOzsKK2VzYWMKK2RvbmUKKwogCiBmaQogICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCiAgIGVsc2UKICAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCiAgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCiAgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKICAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKICAgZmkKIGZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRJTlNUQUxMIiA+JjYKIAogIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgogIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KIHRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKIAordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKwogdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKIAogCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorCisKKworCisKKyAgICAgICAgICBhY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUiCitjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKICMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQogIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgorIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAorIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCiAjCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgogIwotRU9GCisjIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcy4KKworX0FDRU9GCisKICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCiAjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgogIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgogIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCiAjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQoreworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAgICphY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICAgIHNlZCAtbiBcCisJInMvJy8nXFxcXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCisgICAgICA7OworICAgICopCisgICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgICAgc2VkIC1uIFwKKwkicy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT1cXDIvcCIKKyAgICAgIDs7CisgICAgZXNhYzsKK30gfAorICBzZWQgJworICAgICB0IGNsZWFyCisgICAgIDogY2xlYXIKKyAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLworICAgICB0IGVuZAorICAgICAvXmFjX2N2X2Vudi8hcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCisgICAgIDogZW5kJyA+PmNvbmZjYWNoZQoraWYgZGlmZiAkY2FjaGVfZmlsZSBjb25mY2FjaGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKICAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCiAgIGVsc2UKICAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKICAgZmkKIGZpCiBybSAtZiBjb25mY2FjaGUKIAotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQogdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAogIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCiB0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCiAKLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KKyMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgJChzcmNkaXIpLAorIyAke3NyY2Rpcn0gYW5kIEBzcmNkaXJAIGZyb20gVlBBVEggaWYgc3JjZGlyIGlzICIuIiwgc3RyaXAgbGVhZGluZyBhbmQKKyMgdHJhaWxpbmcgY29sb25zIGFuZCB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgbGluZSBpZiBWUEFUSCBiZWNvbWVzIGVtcHR5CisjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCiBpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCisgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0veworcy86KlwkKHNyY2Rpcik6Ki86LzsKK3MvOipcJHtzcmNkaXJ9OiovOi87CitzLzoqQHNyY2RpckA6Ki86LzsKK3MvXlwoW149XSo9WwkgXSpcKToqL1wxLzsKK3MvOiokLy87CitzL15bXj1dKj1bCSBdKiQvLzsKK30nCiBmaQogCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KICMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgogIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KICMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KLWNhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKLXMlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCi1zJVxbJVxcJiVnCi1zJVxdJVxcJiVnCi1zJVwkJSQkJWcKLUVPRgotREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCi1ybSAtZiBjb25mdGVzdC5kZWZzCisjCisjIElmIHRoZSBmaXJzdCBzZWQgc3Vic3RpdHV0aW9uIGlzIGV4ZWN1dGVkICh3aGljaCBsb29rcyBmb3IgbWFjcm9zIHRoYXQKKyMgdGFrZSBhcmd1bWVudHMpLCB0aGVuIHdlIGJyYW5jaCB0byB0aGUgcXVvdGUgc2VjdGlvbi4gIE90aGVyd2lzZSwKKyMgbG9vayBmb3IgYSBtYWNybyB0aGF0IGRvZXNuJ3QgdGFrZSBhcmd1bWVudHMuCitjYXQgPmNvbmZkZWYyb3B0LnNlZCA8PFxfQUNFT0YKK3QgY2xlYXIKKzogY2xlYXIKK3MsXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qXChbXgkgKF1bXgkgKF0qKFteKV0qKVwpWwkgXSpcKC4qXCksLURcMT1cMixnCit0IHF1b3RlCitzLF5bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKlwoW14JIF1bXgkgXSpcKVsJIF0qXCguKlwpLC1EXDE9XDIsZwordCBxdW90ZQorZAorOiBxdW90ZQorcyxbCSBgfiMkXiYqKCl7fVxcfDsnIjw+P10sXFwmLGcKK3MsXFssXFwmLGcKK3MsXF0sXFwmLGcKK3MsXCQsJCQsZworcAorX0FDRU9GCisjIFdlIHVzZSBlY2hvIHRvIGF2b2lkIGFzc3VtaW5nIGEgcGFydGljdWxhciBsaW5lLWJyZWFraW5nIGNoYXJhY3Rlci4KKyMgVGhlIGV4dHJhIGRvdCBpcyB0byBwcmV2ZW50IHRoZSBzaGVsbCBmcm9tIGNvbnN1bWluZyB0cmFpbGluZworIyBsaW5lLWJyZWFrcyBmcm9tIHRoZSBzdWItY29tbWFuZCBvdXRwdXQuICBBIGxpbmUtYnJlYWsgd2l0aGluCisjIHNpbmdsZS1xdW90ZXMgZG9lc24ndCB3b3JrIGJlY2F1c2UsIGlmIHRoaXMgc2NyaXB0IGlzIGNyZWF0ZWQgaW4gYQorIyBwbGF0Zm9ybSB0aGF0IHVzZXMgdHdvIGNoYXJhY3RlcnMgZm9yIGxpbmUtYnJlYWtzIChlLmcuLCBET1MpLCB0cgorIyB3b3VsZCBicmVhay4KK2FjX0xGX2FuZF9ET1Q9YGVjaG87IGVjaG8gLmAKK0RFRlM9YHNlZCAtbiAtZiBjb25mZGVmMm9wdC5zZWQgY29uZmRlZnMuaCB8IHRyICIkYWNfTEZfYW5kX0RPVCIgJyAuJ2AKK3JtIC1mIGNvbmZkZWYyb3B0LnNlZAogCiAKLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorYWNfbGlib2Jqcz0KK2FjX2x0bGlib2Jqcz0KK2ZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQorICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCisgIGFjX2k9YGVjaG8gIiRhY19pIiB8CisJIHNlZCAncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJ2AKKyAgIyAyLiBBZGQgdGhlbS4KKyAgYWNfbGlib2Jqcz0iJGFjX2xpYm9ianMgJGFjX2lcJFUuJGFjX29iamV4dCIKKyAgYWNfbHRsaWJvYmpzPSIkYWNfbHRsaWJvYmpzICRhY19pIickVS5sbycKK2RvbmUKK0xJQk9CSlM9JGFjX2xpYm9ianMKKworTFRMSUJPQkpTPSRhY19sdGxpYm9ianMKKworCisKIDogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgogIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKICMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgogCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQorZGVidWc9ZmFsc2UKK2FjX2NzX3JlY2hlY2s9ZmFsc2UKK2FjX2NzX3NpbGVudD1mYWxzZQorU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK19BQ0VPRgogCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKIAotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworZWxpZiB0ZXN0IC1uICIke0JBU0hfVkVSU0lPTitzZXR9IiAmJiAoc2V0IC1vIHBvc2l4KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgc2V0IC1vIHBvc2l4CiBmaQotRU9GCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCiAKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCiAKLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKworIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCiskYXNfdW5zZXQgRU5WIE1BSUwgTUFJTFBBVEgKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorZm9yIGFzX3ZhciBpbiBcCisgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCisgIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCisgIExDX1RFTEVQSE9ORSBMQ19USU1FCitkbworICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgorICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgorICBlbHNlCisgICAgJGFzX3Vuc2V0ICRhc192YXIKKyAgZmkKK2RvbmUKKworIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworCisjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCithc19tZT1gJGFzX2Jhc2VuYW1lICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKSQnIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorCisKKyMgUEFUSCBuZWVkcyBDUiwgYW5kIExJTkVOTyBuZWVkcyBDUiBhbmQgUEFUSC4KKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAgfHwgeworICAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBwYXRoIGF0IGFsbAorICAjIHJlbGF0aXZlIG9yIG5vdC4KKyAgY2FzZSAkMCBpbgorICAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCitkb25lCisKKyAgICAgICA7OworICBlc2FjCisgICMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyAgIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCisgIGlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgICBhc19teXNlbGY9JDAKKyAgZmkKKyAgaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCisgIGNhc2UgJENPTkZJR19TSEVMTCBpbgorICAnJykKKyAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgY2FzZSAkYXNfZGlyIGluCisJIC8qKQorCSAgIGlmICgiJGFzX2Rpci8kYXNfYmFzZSIgLWMgJworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICcpIDI+L2Rldi9udWxsOyB0aGVuCisJICAgICAkYXNfdW5zZXQgQkFTSF9FTlYgfHwgdGVzdCAiJHtCQVNIX0VOVitzZXR9IiAhPSBzZXQgfHwgeyBCQVNIX0VOVj07IGV4cG9ydCBCQVNIX0VOVjsgfQorCSAgICAgJGFzX3Vuc2V0IEVOViB8fCB0ZXN0ICIke0VOVitzZXR9IiAhPSBzZXQgfHwgeyBFTlY9OyBleHBvcnQgRU5WOyB9CisJICAgICBDT05GSUdfU0hFTEw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAkezErIiRAIn0KKwkgICBmaTs7CisJIGVzYWMKKyAgICAgICBkb25lCitkb25lCis7OwogICBlc2FjCiAKLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBiZWZvcmUgZWFjaCBsaW5lOyB0aGUgc2Vjb25kICdzZWQnIGRvZXMgdGhlIHJlYWwKKyAgIyB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoIGxpbmUtbnVtYmVyIGxpbmUKKyAgIyB3aXRoIHRoZSBudW1iZXJlZCBsaW5lLCBhbmQgYXBwZW5kcyB0cmFpbGluZyAnLScgZHVyaW5nCisgICMgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsIGNhc2UgYXQgbGluZSBlbmQuCisgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAnPScgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBOCisgICAgICBzLCQsLSwKKyAgICAgIDogbG9vcAorICAgICAgcyxeXChbJyRhc19jcl9kaWdpdHMnXSpcKVwoLipcKVskXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dXCksXDFcMlwxXDMsCisgICAgICB0IGxvb3AKKyAgICAgIHMsLSQsLAorICAgICAgcyxeWyckYXNfY3JfZGlnaXRzJ10qXG4sLAorICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggJGFzX21lLmxpbmVubyB8fAorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiAKLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpYmxlIHRvIHRoaXMpLgorICAuIC4vJGFzX21lLmxpbmVubworICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCisKK2Nhc2UgYGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDNgLGBlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDNgIGluCisgICpjKiwtbiopIEVDSE9fTj0gRUNIT19DPScKKycgRUNIT19UPScJJyA7OworICAqYyosKiAgKSBFQ0hPX049LW4gRUNIT19DPSBFQ0hPX1Q9IDs7CisgICopICAgICAgIEVDSE9fTj0gRUNIT19DPSdcYycgRUNIT19UPSA7OworZXNhYworCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2VjaG8gPmNvbmYkJC5maWxlCitpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgIyBXZSBjb3VsZCBqdXN0IGNoZWNrIGZvciBESkdQUDsgYnV0IHRoaXMgdGVzdCBhKSB3b3JrcyBiKSBpcyBtb3JlIGdlbmVyaWMKKyAgIyBhbmQgYykgd2lsbCByZW1haW4gdmFsaWQgb25jZSBESkdQUCBzdXBwb3J0cyBzeW1saW5rcyAoREpHUFAgMi4wNCkuCisgIGlmIHRlc3QgLWYgY29uZiQkLmV4ZTsgdGhlbgorICAgICMgRG9uJ3QgdXNlIGxuIGF0IGFsbDsgd2UgZG9uJ3QgaGF2ZSBhbnkgbGlua3MKKyAgICBhc19sbl9zPSdjcCAtcCcKICAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgICAgYXNfbG5fcz0nbG4gLXMnCisgIGZpCitlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPWxuCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD06CitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2FzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLgorYXNfbmw9JworJworSUZTPSIgCSRhc19ubCIKKworIyBDRFBBVEguCiskYXNfdW5zZXQgQ0RQQVRICisKK2V4ZWMgNj4mMQorCisjIE9wZW4gdGhlIGxvZyByZWFsIHNvb24sIHRvIGtlZXAgXCRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCisjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLiAgTG9nZ2luZyAtLXZlcnNpb24gZXRjLiBpcyBPSy4KK2V4ZWMgNT4+Y29uZmlnLmxvZworeworICBlY2hvCisgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCisjIyBSdW5uaW5nICRhc19tZS4gIyMKK19BU0JPWAorfSA+JjUKK2NhdCA+JjUgPDxfQ1NFT0YKKworVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUworICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKyAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUworICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCisgICQgJDAgJEAKKworX0NTRU9GCitlY2hvICJvbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAiID4mNQorZWNobyA+JjUKK19BQ0VPRgorCisjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2ZpbGVzIjsgdGhlbgorICBlY2hvICJjb25maWdfZmlsZXM9XCIkYWNfY29uZmlnX2ZpbGVzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19jb25maWdfaGVhZGVycyI7IHRoZW4KKyAgZWNobyAiY29uZmlnX2hlYWRlcnM9XCIkYWNfY29uZmlnX2hlYWRlcnNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19saW5rcyI7IHRoZW4KKyAgZWNobyAiY29uZmlnX2xpbmtzPVwiJGFjX2NvbmZpZ19saW5rc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2NvbW1hbmRzIjsgdGhlbgorICBlY2hvICJjb25maWdfY29tbWFuZHM9XCIkYWNfY29uZmlnX2NvbW1hbmRzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorCithY19jc191c2FnZT0iXAorXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCitjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisKK1VzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCisKKyAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKyAgLXEsIC0tcXVpZXQgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKKyAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvY29uZkBnbnUub3JnPi4iCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKK2FjX2NzX3ZlcnNpb249IlxcCitjb25maWcuc3RhdHVzCitjb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTksCisgIHdpdGggb3B0aW9ucyBcXCJgZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9bXFwiIlxgXCRdL1xcXFwmL2cnYFxcIgorCitDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCitzcmNkaXI9JHNyY2RpcgorSU5TVEFMTD0iJElOU1RBTEwiCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisjIElmIG5vIGZpbGUgYXJlIHNwZWNpZmllZCBieSB0aGUgdXNlciwgdGhlbiB3ZSBuZWVkIHRvIHByb3ZpZGUgZGVmYXVsdAorIyB2YWx1ZS4gIEJ5IHdlIG5lZWQgdG8ga25vdyBpZiBmaWxlcyB3ZXJlIHNwZWNpZmllZCBieSB0aGUgdXNlci4KK2FjX25lZWRfZGVmYXVsdHM9Ogord2hpbGUgdGVzdCAkIyAhPSAwCitkbworICBjYXNlICQxIGluCisgIC0tKj0qKQorICAgIGFjX29wdGlvbj1gZXhwciAieCQxIiA6ICd4XChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPWBleHByICJ4JDEiIDogJ3hbXj1dKj1cKC4qXCknYAorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAtKikKKyAgICBhY19vcHRpb249JDEKKyAgICBhY19vcHRhcmc9JDIKKyAgICBhY19zaGlmdD1zaGlmdAorICAgIDs7CisgICopICMgVGhpcyBpcyBub3QgYW4gb3B0aW9uLCBzbyB0aGUgdXNlciBoYXMgcHJvYmFibHkgZ2l2ZW4gZXhwbGljaXQKKyAgICAgIyBhcmd1bWVudHMuCisgICAgIGFjX29wdGlvbj0kMQorICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgZXNhYworCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgYWNfY3NfcmVjaGVjaz06IDs7CisgIC0tdmVyc2lvbiB8IC0tdmVycyogfCAtViApCisgICAgZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDAgOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGFtYmlndW91cyBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKKyAgICBlY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgLS1kZWJ1ZyB8IC0tZCogfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgICRhY19zaGlmdAorICAgIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyAkYWNfb3B0YXJnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCisgICAgJGFjX3NoaWZ0CisgICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkYWNfb3B0YXJnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCisgICAgYWNfY3Nfc2lsZW50PTogOzsKKworICAjIFRoaXMgaXMgYW4gZXJyb3IuCisgIC0qKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisKKyAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIgOzsKKworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2FjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQorCitpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKK2lmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorICBlY2hvICJydW5uaW5nICRTSEVMTCAkMCAiICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzICIgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iID4mNgorICBleGVjICRTSEVMTCAkMCAkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgorZmkKKworX0FDRU9GCisKKworCisKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgIiRhY19jb25maWdfdGFyZ2V0IiBpbgorICAjIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KKyAgIk1ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKKyAgKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHB1dCBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBob29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorJGRlYnVnIHx8Cit7CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/OyBybSAtcmYgJHRtcCAmJiBleGl0ICRleGl0X3N0YXR1cycgMAorICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQorfQorCisjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKworeworICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIuL2NvbmZzdGF0WFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mc3RhdCQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKQorfSB8fAoreworICAgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorfQorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKworIworIyBDT05GSUdfRklMRVMgc2VjdGlvbi4KKyMKKworIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2hlbiAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKK2lmIHRlc3QgLW4gIlwkQ09ORklHX0ZJTEVTIjsgdGhlbgorICAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorICBzZWQgJ3MvLEAvQEAvOyBzL0AsL0BALzsgcy8sO3QgdFwkL0A7dCB0LzsgL0A7dCB0XCQvcy9bXFxcXCYsXS9cXFxcJi9nOworICAgcy9AQC8sQC87IHMvQEAvQCwvOyBzL0A7dCB0XCQvLDt0IHQvJyA+XCR0bXAvc3Vicy5zZWQgPDxcXENFT0YKK3MsQFNIRUxMQCwkU0hFTEwsO3QgdAorcyxAUEFUSF9TRVBBUkFUT1JALCRQQVRIX1NFUEFSQVRPUiw7dCB0CitzLEBQQUNLQUdFX05BTUVALCRQQUNLQUdFX05BTUUsO3QgdAorcyxAUEFDS0FHRV9UQVJOQU1FQCwkUEFDS0FHRV9UQVJOQU1FLDt0IHQKK3MsQFBBQ0tBR0VfVkVSU0lPTkAsJFBBQ0tBR0VfVkVSU0lPTiw7dCB0CitzLEBQQUNLQUdFX1NUUklOR0AsJFBBQ0tBR0VfU1RSSU5HLDt0IHQKK3MsQFBBQ0tBR0VfQlVHUkVQT1JUQCwkUEFDS0FHRV9CVUdSRVBPUlQsO3QgdAorcyxAZXhlY19wcmVmaXhALCRleGVjX3ByZWZpeCw7dCB0CitzLEBwcmVmaXhALCRwcmVmaXgsO3QgdAorcyxAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAsJHByb2dyYW1fdHJhbnNmb3JtX25hbWUsO3QgdAorcyxAYmluZGlyQCwkYmluZGlyLDt0IHQKK3MsQHNiaW5kaXJALCRzYmluZGlyLDt0IHQKK3MsQGxpYmV4ZWNkaXJALCRsaWJleGVjZGlyLDt0IHQKK3MsQGRhdGFkaXJALCRkYXRhZGlyLDt0IHQKK3MsQHN5c2NvbmZkaXJALCRzeXNjb25mZGlyLDt0IHQKK3MsQHNoYXJlZHN0YXRlZGlyQCwkc2hhcmVkc3RhdGVkaXIsO3QgdAorcyxAbG9jYWxzdGF0ZWRpckAsJGxvY2Fsc3RhdGVkaXIsO3QgdAorcyxAbGliZGlyQCwkbGliZGlyLDt0IHQKK3MsQGluY2x1ZGVkaXJALCRpbmNsdWRlZGlyLDt0IHQKK3MsQG9sZGluY2x1ZGVkaXJALCRvbGRpbmNsdWRlZGlyLDt0IHQKK3MsQGluZm9kaXJALCRpbmZvZGlyLDt0IHQKK3MsQG1hbmRpckAsJG1hbmRpciw7dCB0CitzLEBidWlsZF9hbGlhc0AsJGJ1aWxkX2FsaWFzLDt0IHQKK3MsQGhvc3RfYWxpYXNALCRob3N0X2FsaWFzLDt0IHQKK3MsQHRhcmdldF9hbGlhc0AsJHRhcmdldF9hbGlhcyw7dCB0CitzLEBERUZTQCwkREVGUyw7dCB0CitzLEBFQ0hPX0NALCRFQ0hPX0MsO3QgdAorcyxARUNIT19OQCwkRUNIT19OLDt0IHQKK3MsQEVDSE9fVEAsJEVDSE9fVCw7dCB0CitzLEBMSUJTQCwkTElCUyw7dCB0CitzLEBJTlNUQUxMX1BST0dSQU1ALCRJTlNUQUxMX1BST0dSQU0sO3QgdAorcyxASU5TVEFMTF9TQ1JJUFRALCRJTlNUQUxMX1NDUklQVCw7dCB0CitzLEBJTlNUQUxMX0RBVEFALCRJTlNUQUxMX0RBVEEsO3QgdAorcyxAZGF0YXJvb3RkaXJALCRkYXRhcm9vdGRpciw7dCB0CitzLEBkb2NkaXJALCRkb2NkaXIsO3QgdAorcyxAaHRtbGRpckAsJGh0bWxkaXIsO3QgdAorcyxATElCT0JKU0AsJExJQk9CSlMsO3QgdAorcyxATFRMSUJPQkpTQCwkTFRMSUJPQkpTLDt0IHQKK0NFT0YKKworX0FDRU9GCisKKyAgY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisgICMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisgICMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorICBhY19tYXhfc2VkX2xpbmVzPTQ4CisgIGFjX3NlZF9mcmFnPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorICBhY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KKyAgYWNfZW5kPSRhY19tYXhfc2VkX2xpbmVzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KKyAgYWNfbW9yZV9saW5lcz06CisgIGFjX3NlZF9jbWRzPQorICB3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiAkdG1wL3N1YnMuc2VkID4kdG1wL3N1YnMuZnJhZworICAgIGVsc2UKKyAgICAgIHNlZCAiJHthY19lbmR9cSIgJHRtcC9zdWJzLnNlZCA+JHRtcC9zdWJzLmZyYWcKKyAgICBmaQorICAgIGlmIHRlc3QgISAtcyAkdG1wL3N1YnMuZnJhZzsgdGhlbgorICAgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIGVsc2UKKyAgICAgICMgVGhlIHB1cnBvc2Ugb2YgdGhlIGxhYmVsIGFuZCBvZiB0aGUgYnJhbmNoaW5nIGNvbmRpdGlvbiBpcyB0bworICAgICAgIyBzcGVlZCB1cCB0aGUgc2VkIHByb2Nlc3NpbmcgKGlmIHRoZXJlIGFyZSBubyBgQCcgYXQgYWxsLCB0aGVyZQorICAgICAgIyBpcyBubyBuZWVkIHRvIGJyb3dzZSBhbnkgb2YgdGhlIHN1YnN0aXR1dGlvbnMpLgorICAgICAgIyBUaGVzZSBhcmUgdGhlIHR3byBleHRyYSBzZWQgY29tbWFuZHMgbWVudGlvbmVkIGFib3ZlLgorICAgICAgKGVjaG8gJzp0CisgIC9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWInICYmIGNhdCAkdG1wL3N1YnMuZnJhZykgPiR0bXAvc3Vicy0kYWNfc2VkX2ZyYWcuc2VkCisgICAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisJYWNfc2VkX2NtZHM9InNlZCAtZiAkdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZCIKKyAgICAgIGVsc2UKKwlhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mICR0bXAvc3Vicy0kYWNfc2VkX2ZyYWcuc2VkIgorICAgICAgZmkKKyAgICAgIGFjX3NlZF9mcmFnPWBleHByICRhY19zZWRfZnJhZyArIDFgCisgICAgICBhY19iZWc9JGFjX2VuZAorICAgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9saW5lc2AKKyAgICBmaQorICBkb25lCisgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICBhY19zZWRfY21kcz1jYXQKKyAgZmkKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19GSUxFUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtIHwgKjotIHwgKjotOiogKSAjIGlucHV0IGZyb20gc3RkaW4KKwljYXQgPiR0bXAvc3RkaW4KKwlhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7CisgICo6KiApIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCisJYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworICBlc2FjCisKKyAgIyBDb21wdXRlIEBzcmNkaXJALCBAdG9wX3NyY2RpckAsIGFuZCBASU5TVEFMTEAgZm9yIHN1YmRpcmVjdG9yaWVzLgorICBhY19kaXI9YChkaXJuYW1lICIkYWNfZmlsZSIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICB7IGlmICRhc19ta2Rpcl9wOyB0aGVuCisgICAgbWtkaXIgLXAgIiRhY19kaXIiCisgIGVsc2UKKyAgICBhc19kaXI9IiRhY19kaXIiCisgICAgYXNfZGlycz0KKyAgICB3aGlsZSB0ZXN0ICEgLWQgIiRhc19kaXIiOyBkbworICAgICAgYXNfZGlycz0iJGFzX2RpciAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gKGRpcm5hbWUgIiRhc19kaXIiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgZG9uZQorICAgIHRlc3QgISAtbiAiJGFzX2RpcnMiIHx8IG1rZGlyICRhc19kaXJzCisgIGZpIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisKKyAgYWNfYnVpbGRkaXI9LgorCitpZiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKKyAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLi4vLGcnYAorZWxzZQorICBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXI9CitmaQorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KKyAgICAgICBhY190b3Bfc3JjZGlyPS4KKyAgICBlbHNlCisgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAorICAgIGZpIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyIDs7Citlc2FjCisKKyMgRG8gbm90IHVzZSBgY2QgZm9vICYmIHB3ZGAgdG8gY29tcHV0ZSBhYnNvbHV0ZSBwYXRocywgYmVjYXVzZQorIyB0aGUgZGlyZWN0b3JpZXMgbWF5IG5vdCBleGlzdC4KK2Nhc2UgYHB3ZGAgaW4KKy4pIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworKikKKyAgY2FzZSAiJGFjX2RpciIgaW4KKyAgLikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyAgKikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgLyIkYWNfZGlyIjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworKikKKyAgY2FzZSAke2FjX3RvcF9idWlsZGRpcn0uIGluCisgIC4pIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgKikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyLyR7YWNfdG9wX2J1aWxkZGlyfS47OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3NyY2RpciBpbgorICAuKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisgICopIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3RvcF9zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworICAqKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY190b3Bfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCisKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkZGlyJElOU1RBTEwgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgZmkKKyAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKKyAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgorICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiID0geC07IHRoZW4KKyAgICBjb25maWd1cmVfaW5wdXQ9CisgIGVsc2UKKyAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgIgorICBmaQorICBjb25maWd1cmVfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dCJHZW5lcmF0ZWQgZnJvbSBgZWNobyAkYWNfZmlsZV9pbiB8CisJCQkJICAgICBzZWQgJ3MsLiovLCwnYCBieSBjb25maWd1cmUuIgorCisgICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCisgICMgc3JjIHRyZWUuCisgIGFjX2ZpbGVfaW5wdXRzPWBJRlM9OgorICAgIGZvciBmIGluICRhY19maWxlX2luOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgLSkgZWNobyAkdG1wL3N0ZGluIDs7CisgICAgICBbXFwvJF0qKQorCSAjIEFic29sdXRlIChjYW4ndCBiZSBET1Mtc3R5bGUsIGFzIElGUz06KQorCSB0ZXN0IC1mICIkZiIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkgZWNobyAiJGYiOzsKKyAgICAgICopICMgUmVsYXRpdmUKKwkgaWYgdGVzdCAtZiAiJGYiOyB0aGVuCisJICAgIyBCdWlsZCB0cmVlCisJICAgZWNobyAiJGYiCisJIGVsaWYgdGVzdCAtZiAiJHNyY2Rpci8kZiI7IHRoZW4KKwkgICAjIFNvdXJjZSB0cmVlCisJICAgZWNobyAiJHNyY2Rpci8kZiIKKwkgZWxzZQorCSAgICMgL2Rldi9udWxsIHRyZWUKKwkgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCSBmaTs7CisgICAgICBlc2FjCisgICAgZG9uZWAgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCisgIHNlZCAiJGFjX3Zwc3ViCiskZXh0cmFzdWIKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorcyxAY29uZmlndXJlX2lucHV0QCwkY29uZmlndXJlX2lucHV0LDt0IHQKK3MsQHNyY2RpckAsJGFjX3NyY2Rpciw7dCB0CitzLEBhYnNfc3JjZGlyQCwkYWNfYWJzX3NyY2Rpciw7dCB0CitzLEB0b3Bfc3JjZGlyQCwkYWNfdG9wX3NyY2Rpciw7dCB0CitzLEBhYnNfdG9wX3NyY2RpckAsJGFjX2Fic190b3Bfc3JjZGlyLDt0IHQKK3MsQGJ1aWxkZGlyQCwkYWNfYnVpbGRkaXIsO3QgdAorcyxAYWJzX2J1aWxkZGlyQCwkYWNfYWJzX2J1aWxkZGlyLDt0IHQKK3MsQHRvcF9idWlsZGRpckAsJGFjX3RvcF9idWlsZGRpciw7dCB0CitzLEBhYnNfdG9wX2J1aWxkZGlyQCwkYWNfYWJzX3RvcF9idWlsZGRpciw7dCB0CitzLEBJTlNUQUxMQCwkYWNfSU5TVEFMTCw7dCB0CisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+JHRtcC9vdXQKKyAgcm0gLWYgJHRtcC9zdGRpbgorICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgbXYgJHRtcC9vdXQgJGFjX2ZpbGUKKyAgZWxzZQorICAgIGNhdCAkdG1wL291dAorICAgIHJtIC1mICR0bXAvb3V0CiAgIGZpCiAKLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCitkb25lCitfQUNFT0YKIAotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKIAotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi1leGl0IDAKLUVPRgoreyAoZXhpdCAwKTsgZXhpdCAwOyB9CitfQUNFT0YKIGNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KK2ZpCiAKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWd1cmUuaW4gYi9ldGMvY29uZmlndXJlLmluCmluZGV4IGI3ODUwNjguLjM4YmM2NTkgMTAwNjQ0Ci0tLSBhL2V0Yy9jb25maWd1cmUuaW4KKysrIGIvZXRjL2NvbmZpZ3VyZS5pbgpAQCAtNCw0ICs0LDkgQEAKIAogQUNfUFJPR19JTlNUQUxMCiAKK0FDX1NVQlNUKGRhdGFyb290ZGlyKQorQUNfU1VCU1QoZG9jZGlyKQorQUNfU1VCU1QoaHRtbGRpcikKKworCiBBQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlLnRleGkgYi9ldGMvY29uZmlndXJlLnRleGkKaW5kZXggMzg1YTdjNC4uNThjNTI4NSAxMDA2NDQKLS0tIGEvZXRjL2NvbmZpZ3VyZS50ZXhpCisrKyBiL2V0Yy9jb25maWd1cmUudGV4aQpAQCAtMjc2LDcgKzI3Niw5IEBACiAKIEluIHRoZSBDeWdudXMgdHJlZSBhdCBwcmVzZW50LCB0aGUgaW5mbyBmaWxlcyBhcmUgYnVpbHQgYW5kIGluc3RhbGxlZCBhcwogYSBzZXBhcmF0ZSBzdGVwLiAgVG8gYnVpbGQgdGhlbSwgcnVuIEBzYW1we21ha2UgaW5mb30uICBUbyBpbnN0YWxsIHRoZW0sCi1ydW4gQHNhbXB7bWFrZSBpbnN0YWxsLWluZm99LgorcnVuIEBzYW1we21ha2UgaW5zdGFsbC1pbmZvfS4gVGhlIGVxdWl2YWxlbnQgaHRtbCBmaWxlcyBhcmUgYWxzbyBidWlsdAorYW5kIGluc3RhbGxlZCBpbiBhIHNlcGFyYXRlIHN0ZXAuIFRvIGJ1aWxkIHRoZSBodG1sIGZpbGVzLCBydW4KK0BzYW1we21ha2UgaHRtbH0uIFRvIGluc3RhbGwgdGhlIGh0bWwgZmlsZXMgcnVuIEBzYW1we21ha2UgaW5zdGFsbC1odG1sfS4KIAogQWxsIEBzYW1we2NvbmZpZ3VyZX0gc2NyaXB0cyBzdXBwb3J0IGEgd2lkZSB2YXJpZXR5IG9mIG9wdGlvbnMuICBUaGUKIG1vc3QgaW50ZXJlc3Rpbmcgb25lcyBhcmUgQHNhbXB7LS13aXRofSBhbmQgQHNhbXB7LS1lbmFibGV9IG9wdGlvbnMKZGlmZiAtLWdpdCBhL2dkYi9DaGFuZ2VMb2cgYi9nZGIvQ2hhbmdlTG9nCmluZGV4IDY5ZDNiYTcuLmRjYjQzNmIgMTAwNjQ0Ci0tLSBhL2dkYi9DaGFuZ2VMb2cKKysrIGIvZ2RiL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQwOSBAQAorMjAwNi0wNC0yMCAgRGFuaWVsIEphY29ib3dpdHogIDxkYW5AY29kZXNvdXJjZXJ5LmNvbT4KKworCSogbTY4a2xpbnV4LXRkZXAuYyAobTY4a19saW51eF9zaWd0cmFtcF9mcmFtZV9wcmV2X3JlZ2lzdGVyKToKKwlDb3JyZWN0IHR5cGUgb2YgVkFMVUVQLiAgUmVwb3J0ZWQgYnkgSmVhbi1SZW5lIFBldWx2ZQorCTxqci5wZXVsdmVAd2FuYWRvby5mcj4uCisKKzIwMDYtMDQtMTkgIE1hc2FraSBNdXJhbmFrYSAgPG1vbmFrYUBtb25hbWktc29mdHdhcmUuY29tPgorCisJKiBtMzJyLXJvbS5jOiBPbiBNaW5HVywgaW5jbHVkZSB3aW5zb2NrLmggaW5zdGVhZCBvZiBzeXMvdHlwZXMuaCwKKwluZXRkYi5oLCBuZXRpbmV0L2luLmguCisJKG0zMnJfdXBsb2FkX2NvbW1hbmQpOyBBZGQgY2FsbHMgV1NBU3RhcnR1cCgpLgorCSogcmVtb3RlLW0zMnItc2RpLmM6IE9uIE1pbkdXLCBpbmNsdWRlIHdpbnNvY2suaCBpbnN0ZWFkIG9mCisJbmV0aW5ldC9pbi5oLgorCisyMDA2LTA0LTE4ICBEYW5pZWwgSmFjb2Jvd2l0eiAgPGRhbkBjb2Rlc291cmNlcnkuY29tPgorCisJKiBicmVha3BvaW50LmMgKGRlcHJlY2F0ZWRfcmVhZF9tZW1vcnlfbm9icHQpOiBVcGRhdGUgdG8gdXNlCisJc2hhZG93X2xlbi4KKwkoaW5zZXJ0X2JwX2xvY2F0aW9uLCByZWF0dGFjaF9icmVha3BvaW50cywgcmVtb3ZlX2JyZWFrcG9pbnQpCisJKGRlbGV0ZV9icmVha3BvaW50KTogVXBkYXRlIGNhbGxzIHRvIGNoYW5nZWQgbWV0aG9kcy4KKwkoZGVwcmVjYXRlZF9pbnNlcnRfcmF3X2JyZWFrcG9pbnQsIGRlcHJlY2F0ZWRfcmVtb3ZlX3Jhd19icmVha3BvaW50KQorCShzaW5nbGVfc3RlcF9icmVha3BvaW50cywgaW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQpCisJKHJlbW92ZV9zaW5nbGVfc3RlcF9icmVha3BvaW50cyk6IE5ldy4KKwkqIGJyZWFrcG9pbnQuaCAoc3RydWN0IGJwX3RhcmdldF9pbmZvKTogTmV3LgorCShzdHJ1Y3QgYnBfbG9jYXRpb24pOiBSZXBsYWNlIHNoYWRvd19jb250ZW50cyB3aXRoCisJdGFyZ2V0X2luZm8gYW5kIG92ZXJsYXlfdGFyZ2V0X2luZm8uCisJKGRlcHJlY2F0ZWRfaW5zZXJ0X3Jhd19icmVha3BvaW50LCBkZXByZWNhdGVkX3JlbW92ZV9yYXdfYnJlYWtwb2ludCkKKwkoaW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQsIHJlbW92ZV9zaW5nbGVfc3RlcF9icmVha3BvaW50cyk6IE5ldworCXByb3RvdHlwZXMuCisJKiBnZGJhcmNoLnNoOiBGb3J3YXJkIGRlY2xhcmUgc3RydWN0IGJwX3RhcmdldF9pbmZvIGluIGdkYmFyY2guaC4KKwkobWVtb3J5X2luc2VydF9icmVha3BvaW50LCBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQpOiBVcGRhdGUgc2Vjb25kCisJYXJndW1lbnQuCisJKiBtZW0tYnJlYWsuYyAoZGVmYXVsdF9tZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQpOiBVcGRhdGUuICBTZXQKKwlwbGFjZWRfYWRkcmVzcywgcGxhY2VkX3NpemUsIGFuZCBzaGFkb3dfbGVuLgorCShkZWZhdWx0X21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCk6IFVwZGF0ZS4gIERvbid0IHVzZQorCUJSRUFLUE9JTlRfRlJPTV9QQy4KKwkobWVtb3J5X2luc2VydF9icmVha3BvaW50LCBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQpOiBVcGRhdGUuCisJKiB0YXJnZXQuYyAodXBkYXRlX2N1cnJlbnRfdGFyZ2V0KTogVXBkYXRlIHByb3RvdHlwZXMgZm9yIGNoYW5nZWQKKwlmdW5jdGlvbnMuCisJKGRlYnVnX3RvX2luc2VydF9icmVha3BvaW50LCBkZWJ1Z190b19yZW1vdmVfYnJlYWtwb2ludCkKKwkoZGVidWdfdG9faW5zZXJ0X2h3X2JyZWFrcG9pbnQsIGRlYnVnX3RvX3JlbW92ZV9od19icmVha3BvaW50KToKKwlVcGRhdGUuCisJKiB0YXJnZXQuaDogRm9yd2FyZCBkZWNsYXJlIHN0cnVjdCBicF90YXJnZXRfaW5mby4KKwkoc3RydWN0IHRhcmdldF9vcHMpOiBVc2UgYSBicF90YXJnZXRfaW5mbyBhcmd1bWVudCBmb3IKKwl0b19pbnNlcnRfYnJlYWtwb2ludCwgdG9fcmVtb3ZlX2JyZWFrcG9pbnQsCisJdG9faW5zZXJ0X2h3X2JyZWFrcG9pbnQsIGFuZCB0b19yZW1vdmVfaHdfYnJlYWtwb2ludC4KKwkodGFyZ2V0X2luc2VydF9icmVha3BvaW50LCB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQpCisJKHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludCwgdGFyZ2V0X3JlbW92ZV9od19icmVha3BvaW50KQorCShtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQsIG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCkKKwkoZGVmYXVsdF9tZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQsIGRlZmF1bHRfbWVtb3J5X3JlbW92ZV9icmVha3BvaW50KToKKwlVcGRhdGUuCisJKiBjb25maWcvaTM4Ni9ubS1pMzg2Lmg6IEZvcndhcmQgZGVjbGFyZSBzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8uCisJKGkzODZfaW5zZXJ0X2h3X2JyZWFrcG9pbnQsIGkzODZfcmVtb3ZlX2h3X2JyZWFrcG9pbnQpOiBVcGRhdGUuCisJKHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludCwgdGFyZ2V0X3JlbW92ZV9od19icmVha3BvaW50KTogTGlrZXdpc2UuCisKKwkqIGdkYmFyY2guYywgZ2RiYXJjaC5oOiBSZWdlbmVyYXRlZC4KKworCSogYWxwaGEtdGRlcC5jIChhbHBoYV9zb2Z0d2FyZV9zaW5nbGVfc3RlcCk6IFVzZQorCWluc2VydF9zaW5nbGVfc3RlcF9icmVha3BvaW50IGFuZCByZW1vdmVfc2luZ2xlX3N0ZXBfYnJlYWtwb2ludHMuCisJUmVtb3ZlIHVudXNlZCBzdGF0aWNzLgorCSogYXJtLXRkZXAuYyAoYXJtX3NvZnR3YXJlX3NpbmdsZV9zdGVwKTogTGlrZXdpc2UuICBBZGQgYSBub3RlLgorCSogY3Jpcy10ZGVwLmMgKGNyaXNfc29mdHdhcmVfc2luZ2xlX3N0ZXApOiBMaWtld2lzZS4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX3NvZnR3YXJlX3NpbmdsZV9zdGVwKTogTGlrZXdpc2UuCisJKiByczYwMDAtdGRlcC5jIChyczYwMDBfc29mdHdhcmVfc2luZ2xlX3N0ZXApOiBMaWtld2lzZS4KKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfc29mdHdhcmVfc2luZ2xlX3N0ZXApOiBMaWtld2lzZS4KKwkqIHdpbmNlLmMgKHN0cnVjdCB0aHJlYWRfaW5mb19zdHJ1Y3QpOiBSZW1vdmUgc3RlcF9wcmV2LgorCSh1bmRvU1N0ZXApOiBVc2UgcmVtb3ZlX3NpbmdsZV9zdGVwX2JyZWFrcG9pbnRzLgorCSh3aW5jZV9zb2Z0d2FyZV9zaW5nbGVfc3RlcCk6IFVzZSBpbnNlcnRfc2luZ2xlX3N0ZXBfYnJlYWtwb2ludC4KKworCSogY29yZWxvdy5jIChpZ25vcmUpOiBSZW1vdmUgdW5uZWVkZWQgcHJvdG90eXBlLiAgVXBkYXRlIGFyZ3VtZW50cy4KKwkqIGV4ZWMuYyAoaWdub3JlKTogTGlrZXdpc2UuCisJKiBzb2wtdGhyZWFkLmMgKGlnbm9yZSk6IExpa2V3aXNlLgorCisJKiBwcm9jZnMuYyAoZGJ4X2xpbmtfc2hhZG93X2NvbnRlbnRzKTogRGVsZXRlLgorCShkYnhfbGlua19icHQpOiBOZXcuCisJKHByb2Nmc19tb3Vybl9pbmZlcmlvcik6IFJlbW92ZSBpdCBpZiBuZWNlc3NhcnkuCisJKHJlbW92ZV9kYnhfbGlua19icmVha3BvaW50KTogVXNlIGl0LgorCShpbnNlcnRfZGJ4X2xpbmtfYnB0X2luX2ZpbGUpOiBTZXQgaXQuCisJKHByb2Nmc19pbml0X2luZmVyaW9yKTogRG9uJ3QgdXBkYXRlIGRieF9saW5rX2JwdF9hZGRyLgorCSogcnM2MDAwLW5hdC5jIChleGVjX29uZV9kdW1teV9pbnNuKTogVXNlCisJZGVwcmVjYXRlZF9pbnNlcnRfcmF3X2JyZWFrcG9pbnQgYW5kCisJZGVwcmVjYXRlZF9yZW1vdmVfcmF3X2JyZWFrcG9pbnQuCisJKiBzb2xpYi1pcml4LmMgKHNoYWRvd19jb250ZW50cywgYnJlYWtwb2ludF9hZGRyKTogRGVsZXRlLgorCShiYXNlX2JyZWFrcG9pbnQpOiBOZXcuCisJKGRpc2FibGVfYnJlYWspOiBVc2UgaXQuCisJKGVuYWJsZV9icmVhayk6IFNldCBpdC4KKworCSogaTM4Ni1uYXQuYyAoaTM4Nl9pbnNlcnRfaHdfYnJlYWtwb2ludCwgaTM4Nl9yZW1vdmVfaHdfYnJlYWtwb2ludCk6CisJVXBkYXRlLgorCSogaWE2NC10ZGVwLmMgKGlhNjRfbWVtb3J5X2luc2VydF9icmVha3BvaW50KQorCShpYTY0X21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCk6IExpa2V3aXNlLgorCSogbTMyci10ZGVwLmMgKG0zMnJfbWVtb3J5X2luc2VydF9icmVha3BvaW50KQorCShtMzJyX21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCk6IExpa2V3aXNlLgorCSogbW9uaXRvci5jIChtb25pdG9yX2luc2VydF9icmVha3BvaW50LCBtb25pdG9yX3JlbW92ZV9icmVha3BvaW50KToKKwlMaWtld2lzZS4gIFJlbW92ZSB1bm5lY2Vzc2FyeSBwcm90b3R5cGVzLiAgVXNlIHBsYWNlZF9hZGRyZXNzCisJYW5kIHBsYWNlZF9zaXplLiAgUmVtb3ZlZCB1c2VsZXNzIHJlYWQgZnJvbSBtZW1vcnkuCisJKiBudG8tcHJvY2ZzLmMgKHByb2Nmc19pbnNlcnRfYnJlYWtwb2ludCkKKwkocHJvY2ZzX3JlbW92ZV9icmVha3BvaW50LCBwcm9jZnNfaW5zZXJ0X2h3X2JyZWFrcG9pbnQpCisJKHByb2Nmc19yZW1vdmVfaHdfYnJlYWtwb2ludCk6IFVwZGF0ZS4KKwkqIG9jZC5jIChvY2RfaW5zZXJ0X2JyZWFrcG9pbnQsIG9jZF9yZW1vdmVfYnJlYWtwb2ludCk6IExpa2V3aXNlLgorCSogb2NkLmggKG9jZF9pbnNlcnRfYnJlYWtwb2ludCwgb2NkX3JlbW92ZV9icmVha3BvaW50KTogTGlrZXdpc2UuCisJKiBwcGMtbGludXgtdGRlcC5jIChwcGNfbGludXhfbWVtb3J5X3JlbW92ZV9icmVha3BvaW50KTogTGlrZXdpc2UuCisJKiBwcGMtdGRlcC5oIChwcGNfbGludXhfbWVtb3J5X3JlbW92ZV9icmVha3BvaW50KTogTGlrZXdpc2UuCisJKiByZW1vdGUtZTcwMDAuYyAoZTcwMDBfaW5zZXJ0X2JyZWFrcG9pbnQpCisJKGU3MDAwX3JlbW92ZV9icmVha3BvaW50KTogTGlrZXdpc2UuCisJKiByZW1vdGUtbTMyci1zZGkuYyAobTMycl9pbnNlcnRfYnJlYWtwb2ludCkKKwkobTMycl9yZW1vdmVfYnJlYWtwb2ludCk6IExpa2V3aXNlLgorCSogcmVtb3RlLW1pcHMuYyAobWlwc19pbnNlcnRfYnJlYWtwb2ludCkKKwkobWlwc19yZW1vdmVfYnJlYWtwb2ludCk6IExpa2V3aXNlLgorCSogcmVtb3RlLXJkcC5jIChyZW1vdGVfcmRwX2luc2VydF9icmVha3BvaW50KQorCShyZW1vdGVfcmRwX3JlbW92ZV9icmVha3BvaW50KTogTGlrZXdpc2UuCisJKHJkcF9zdGVwKTogVXNlIGRlcHJlY2F0ZWRfaW5zZXJ0X3Jhd19icmVha3BvaW50IGFuZAorCWRlcHJlY2F0ZWRfcmVtb3ZlX3Jhd19icmVha3BvaW50LgorCSogcmVtb3RlLXNkcy5jIChzZHNfaW5zZXJ0X2JyZWFrcG9pbnQsIHNkc19yZW1vdmVfYnJlYWtwb2ludCk6CisJVXBkYXRlLgorCSogcmVtb3RlLXNpbS5jIChnZGJzaW1faW5zZXJ0X2JyZWFrcG9pbnQsIGdkYnNpbV9yZW1vdmVfYnJlYWtwb2ludCk6CisJRGVsZXRlLgorCShpbml0X2dkYnNpbV9vcHMpOiBVc2UgbWVtb3J5X2luc2VydF9icmVha3BvaW50IGFuZAorCW1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludC4KKwkqIHJlbW90ZS1zdC5jIChzdDIwMDBfaW5zZXJ0X2JyZWFrcG9pbnQpCisJKHN0MjAwMF9yZW1vdmVfYnJlYWtwb2ludCk6IFVwZGF0ZS4gIFJlbW92ZSB1bnVzZWQKKwlCUkVBS1BPSU5UX0ZST01fUEMuCisJKiByZW1vdGUuYyAocmVtb3RlX2luc2VydF9icmVha3BvaW50LCByZW1vdGVfcmVtb3ZlX2JyZWFrcG9pbnQpOgorCVVwZGF0ZS4gIFVzZSBwbGFjZWRfYWRkcmVzcyBhbmQgcGxhY2VkX3NpemUuCisJKHJlbW90ZV9pbnNlcnRfaHdfYnJlYWtwb2ludCwgcmVtb3RlX3JlbW92ZV9od19icmVha3BvaW50KTogTGlrZXdpc2UuCisKKzIwMDYtMDQtMTIgIERhbmllbCBKYWNvYm93aXR6ICA8ZGFuQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIHJlbW90ZS5jIChleHRlbmRlZF9yZW1vdGVfcmVzdGFydCk6IFBhc3MgdGhlIGNvcnJlY3QgbGVuZ3RoCisJdG8gZ2V0cGt0LgorCisyMDA2LTA0LTExICBKaW0gQmxhbmR5ICA8amltYkBjb2Rlc291cmNlcnkuY29tPgorCisJKiBzZXJpYWwuYyAoc2VyaWFsX29wZW4pOiBDaGVjayBmb3Igc3BlY2lhbCBjYXNlcyBhdCB0aGUgZnJvbnQgb2YKKwl0aGUgImRldmljZSIgbmFtZSBiZWZvcmUgc2Nhbm5pbmcgZm9yIHRoZSAnOicgdGhhdCB3b3VsZCBpbmRpY2F0ZQorCWFuIElQLWJhc2VkIGNvbm5lY3Rpb24uCisKKzIwMDYtMDQtMTAgIENocmlzdG9waGVyIEZheWxvciAgPGNnZkB0aW1lc3lzLmNvbT4KKworCSogd2luMzItbmF0LmMgKG9wZW5fc3ltYm9sX2ZpbGVfb2JqZWN0KTogTmV3IGZ1bmN0aW9uLgorCShpbl9keW5zeW1fcmVzb2x2ZV9jb2RlKTogRGl0dG8uCisJKGluaXRfd2luMzJfb3BzKTogRmlsbCBpbiBmaWVsZHMgd2hpY2ggb3VnaHQgbm90IHRvIGJlIE5VTEwuCisKKzIwMDYtMDQtMTAgIENocmlzdG9waGVyIEZheWxvciAgPGNnZkB0aW1lc3lzLmNvbT4KKworCSogd2luMzItbmF0LmMgKGRvX3dpbjMyX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyk6IERvbid0IGRvIGFueXRoaW5nCisJd2l0aCBzYXZlZCBjb250ZXh0IGlmIF9fQ09QWV9DT05URVhUX1NJWkUgaXMgbm90IGRlZmluZWQuCisJKGhhbmRsZV9vdXRwdXRfZGVidWdfc3RyaW5nKTogRGl0dG8uCisKKzIwMDYtMDQtMTAgIERhbmllbCBKYWNvYm93aXR6ICA8ZGFuQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIGFybS1saW51eC10ZGVwLmMgKGFybV9saW51eF9leHRyYWN0X3JldHVybl92YWx1ZSk6IFVzZSBnZGJfYnl0ZS4KKworMjAwNi0wNC0wOSAgRGF2aWQgUy4gTWlsbGVyICA8ZGF2ZW1Ac3Vuc2V0LmRhdmVtbG9mdC5uZXQ+CisKKwkqIHNwYXJjNjQtbGludXgtdGRlcC5jIChzcGFyYzY0X2xpbnV4X2luaXRfYWJpKTogQXBwZW5kIGR3YXJmMgorCWZyYW1lIHNuaWZmZXIuCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjMzJfZ2RiYXJjaF9pbml0KTogTWFrZSBzdXJlIHRvIGNhbGwKKwlkd2FyZjJfZnJhbWVfc2V0X2luaXRfcmVnKCkgYmVmb3JlIGdkYmFyY2hfaW5pdF9vc2FiaSgpIHNvCisJdGhhdCB0aGUgbGF0dGVyIGNhbiBvdmVycmlkZS4KKwkqIE1ha2VmaWxlLmluIChzcGFyYzY0LWxpbnV4LXRkZXAubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCisKKzIwMDYtMDQtMDkgIFVscmljaCBXZWlnYW5kICA8dXdlaWdhbmRAZGUuaWJtLmNvbT4KKworCSogczM5MC10ZGVwLmMgKHN0cnVjdCBzMzkwX3Byb2xvZ3VlX2RhdGEpOiBOZXcgZmllbGQgJ3N0YWNrJy4KKwkoczM5MF9zdG9yZSk6IENhbGwgcHZfYXJlYV9zdG9yZSB0byB0cmFjayBzdGFjayBzbG90cy4KKwkoczM5MF9sb2FkKTogQ2FsbCBwdl9hcmVhX2ZldGNoIHRvIHRyYWNrIHN0YWNrIHNsb3RzLgorCShzMzkwX2NoZWNrX2Zvcl9zYXZlZCk6IE5ldyBmdW5jdGlvbi4KKwkoczM5MF9hbmFseXplX3Byb2xvZ3VlKTogQ2FsbCBwdl9hcmVhX3NjYW4uICBBbGxvY2F0ZSBhbmQgZnJlZSBzdGFjay4KKworMjAwNi0wNC0wOSAgVWxyaWNoIFdlaWdhbmQgIDx1d2VpZ2FuZEBkZS5pYm0uY29tPgorCisJKiBNYWtlZmlsZS5pbiAoczM5MC10ZGVwLm8pOiBBZGQgZGVwZW5kZW5jeSBvbiAkKHByb2xvZ3VlX3ZhbHVlX2gpLgorCSogczM5MC10ZGVwLmM6IEluY2x1ZGUgInByb2xvZ3VlLXZhbHVlLmgiLgorCShzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUpOiBSZW1vdmUuCisJKHB2X3NldF90b191bmtub3duLCBwdl9zZXRfdG9fY29uc3RhbnQsIHB2X3NldF90b19yZWdpc3RlciwKKwlwdl9jb25zdGFudF9sYXN0LCBwdl9hZGQsIHB2X2FkZF9jb25zdGFudCwgcHZfc3VidHJhY3QsCisJcHZfbG9naWNhbF9hbmQsIHB2X2lzX2lkZW50aWNhbCwgcHZfaXNfcmVnaXN0ZXIpOiBSZW1vdmUuCisJKGNvbXB1dGVfeF9hZGRyKTogUmVtb3ZlLCByZXBsYWNlIGJ5IC4uLgorCShzMzkwX2FkZHIpOiAuLi4gdGhpcyBuZXcgZnVuY3Rpb24uCisJKHN0cnVjdCBzMzkwX3Byb2xvZ3VlX2RhdGEpOiBVc2UgcHZfdCBpbnN0ZWFkIG9mIHByb2xvZ3VlX3ZhbHVlLgorCShzMzkwX3N0b3JlLCBzMzkwX2xvYWQpOiBMaWtld2lzZS4KKwkoczM5MF9wcm9sb2d1ZV9mcmFtZV91bndpbmRfY2FjaGUpOiBMaWtld2lzZS4KKwkoczM5MF9hbmFseXplX3Byb2xvZ3VlKTogTGlrZXdpc2UuICBBbHNvLCBzaW1wbGlmeSBhbmQgY29tYmluZQorCXNldmVyYWwgY29uZGl0aW9uYWwgc3RhdGVtZW50cy4KKworMjAwNi0wNC0wOCAgSmltIEJsYW5keSAgPGppbWJAY29kZXNvdXJjZXJ5LmNvbT4KKworCSogTWFrZWZpbGUuaW4gKENPTU1PTl9PQlMpOiBMaXN0IHByb2xvZ3VlLXZhbHVlLm8uICAoT21pdHRlZCBmcm9tCisJbGFzdCBwYXRjaC4pCisKKzIwMDYtMDQtMDggIERhdmlkIFMuIE1pbGxlciAgPGRhdmVtQHN1bnNldC5kYXZlbWxvZnQubmV0PgorCisJKiBzcGFyYy1saW51eC10ZGVwLmMgKHNwYXJjMzJfbGludXhfc3RlcF90cmFwKTogTmV3LgorCShzcGFyYzMyX2xpbnV4X2luaXRfYWJpKTogSG9vayBpdCBpbnRvIHRkZXAtPnN0ZXBfdHJhcC4KKwkoc3BhcmMzMl9saW51eF9jb3JlX2dyZWdzZXQsCisJc3BhcmMzMl9saW51eF9zdXBwbHlfY29yZV9ncmVnc2V0LAorCXNwYXJjMzJfbGludXhfY29sbGVjdF9jb3JlX2dyZWdzZXQsCisJc3BhcmMzMl9saW51eF9zdXBwbHlfY29yZV9mcHJlZ3NldCwKKwlzcGFyYzMyX2xpbnV4X2NvbGxlY3RfY29yZV9mcHJlZ3NldCk6IE5ldy4KKwkoc3BhcmMzMl9saW51eF9pbml0X2FiaSk6IFJlZ2lzdGVyIHRoZW0gd2l0aCBnZW5lcmljIHNwYXJjCisJY29yZSByZWdzZXQgaW5mcmFzdHJ1Y3R1cmUuCisJKiBzcGFyYzY0LWxpbnV4LXRkZXAuYyAoc3BhcmM2NF9saW51eF9zdGVwX3RyYXApOiBOZXcuCisJKHNwYXJjNjRfbGludXhfaW5pdF9hYmkpOiBIb29rIGl0IGludG8gdGRlcC0+c3RlcF90cmFwLgorCShzcGFyYzY0X2xpbnV4X2NvcmVfZ3JlZ3NldCwKKwlzcGFyYzY0X2xpbnV4X3N1cHBseV9jb3JlX2dyZWdzZXQsCisJc3BhcmM2NF9saW51eF9jb2xsZWN0X2NvcmVfZ3JlZ3NldCwKKwlzcGFyYzY0X2xpbnV4X3N1cHBseV9jb3JlX2ZwcmVnc2V0LAorCXNwYXJjNjRfbGludXhfY29sbGVjdF9jb3JlX2ZwcmVnc2V0KTogTmV3LgorCShzcGFyYzY0X2xpbnV4X2luaXRfYWJpKTogUmVnaXN0ZXIgdGhlbSB3aXRoIGdlbmVyaWMgc3BhcmMKKwljb3JlIHJlZ3NldCBpbmZyYXN0cnVjdHVyZS4JCisJKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KKworMjAwNi0wNC0wNyAgRGF2aWQgUy4gTWlsbGVyICA8ZGF2ZW1Ac3Vuc2V0LmRhdmVtbG9mdC5uZXQ+CisKKwkqIGxpbnV4LW5hdC5jIChsaW51eF9uYXRfdGhyZWFkX2FsaXZlKTogSGFuZGxlIHRhcmdldHMgdGhhdAorCWRvIG5vdCBpbXBsZW1lbnQgUFRSQUNFX1BFRUtVU0VSLgorCisyMDA2LTA0LTA3ICBEYW5pZWwgSmFjb2Jvd2l0eiAgPGRhbkBjb2Rlc291cmNlcnkuY29tPgorCisJKiByZW1vdGUuYyAocmVtb3RlX3dhaXQpOiBDb252ZXJ0IHdhcm5pbmcgdG8gZXJyb3IgYmVmb3JlCisJcGFyc2luZyBjb3JydXB0IHBhY2tldHMuCisKKzIwMDYtMDQtMDcgIEFuZHJldyBTdHViYnMgIDxhbmRyZXcuc3R1YmJzQHN0LmNvbT4KKworCSogY2xpL2NsaS1zY3JpcHQuYyAoc3RydWN0IHVzZXJfYXJncyk6IEFkZCBjb21tYW5kIGZpZWxkLgorCShhcmdfY2xlYW51cCk6IEZyZWUgY29tbWFuZCBzdHJpbmcuCisJKHNldHVwX3VzZXJfYXJncyk6IENvcHkgdGhlIGNvbW1hbmQgbGluZSBiZWZvcmUgcmVseWluZyBvbiBpdC4KKworMjAwNi0wNC0wNiAgSm9lbCBCcm9iZWNrZXIgIDxicm9iZWNrZXJAYWRhY29yZS5jb20+CisKKwkqIGJyZWFrcG9pbnQuYyAoX2luaXRpYWxpemVfYnJlYWtwb2ludCk6IEFkZCAiZGVsIiBhcyBhbiBhbGlhcworCW9mIHRoZSAiZGVsZXRlIiBjb21tYW5kLgorCisyMDA2LTA0LTA2ICBSYW5kb2xwaCBDaHVuZyAgPHRhdXNxQGRlYmlhbi5vcmc+CisKKwkqIE1BSU5UQUlORVJTIChQYXRjaCBjaGFtcGlvbnMpOiBBZGQgbXlzZWxmLgorCisyMDA2LTA0LTA1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgorCisJKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KKworMjAwNi0wNC0wNSAgRGF2aWQgUy4gTWlsbGVyICA8ZGF2ZW1Ac3Vuc2V0LmRhdmVtbG9mdC5uZXQ+CisKKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmMzMl9kd2FyZjJfZnJhbWVfaW5pdF9yZWcpOiBOZXcuCisJKHNwYXJjMzJfZ2RiYXJjaF9pbml0KTogUGFzcyBpdCB0byBkd2FyZjJfZnJhbWVfc2V0X2luaXRfcmVnLgorCSogTWFrZWZpbGUuaW4gKHNwYXJjLXRkZXAubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCisJKiBzcGFyYy1saW51eC10ZGVwLmMgKHNwYXJjMzJfbGludXhfc2lnZnJhbWVfaW5pdCk6IFB1bGwgcmVnaXN0ZXIKKwl3aW5kb3cgb3V0IG9mIHRoZSBjb3JyZWN0IHN0YWNrIGZyYW1lLgorCSogc3BhcmM2NC1saW51eC10ZGVwLmMgKHNwYXJjNjRfbGludXhfc2lnZnJhbWVfaW5pdCk6IExpa2V3aXNlLgorCSogZHdhcmYyLWZyYW1lLmMgKGR3YXJmMl9mcmFtZV9vcHMgaW5pdF9yZWcpOiBBZGQgIm5leHRfZnJhbWUiCisJYXJndW1lbnQuCisJKGR3YXJmMl9mcmFtZV9kZWZhdWx0X2luaXRfcmVnKTogTGlrZXdpc2UuCisJKGR3YXJmMl9mcmFtZV9zZXRfaW5pdF9yZWcpOiBVcGRhdGUgaW5pdF9yZWcgYXJnLgorCShkd2FyZjJfZnJhbWVfaW5pdF9yZWcpOiBUYWtlICJuZXh0X2ZyYW1lIiBhbmQgcGFzcyBpdCB0bworCW9wcy0+aW5pdF9yZWcoKS4KKwkoZHdhcmYyX2ZyYW1lX2NhY2hlKTogUGFzcyBuZXh0X2ZyYW1lIHRvIGR3YXJmMl9mcmFtZV9pbml0X3JlZy4KKwkqIGR3YXJmMi1mcmFtZS5oIChkd2FyZjItZnJhbWVfc2V0X2luaXRfcmVnKTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCSogY3Jpcy10ZGVwLmMgKGNyaXNfZHdhcmYyX2ZyYW1lX2luaXRfcmVnKTogQWRkIG5leHRfZnJhbWUgYXJnLgorCSogczM5MC10ZGVwLmMgKHMzOTBfZHdhcmYyX2ZyYW1lX2luaXRfcmVnKTogTGlrZXdpc2UuCisJKiBzaC10ZGVwLmMgKHNoX2R3YXJmMl9mcmFtZV9pbml0X3JlZyk6IExpa2V3aXNlLgorCSogc3BhcmM2NC10ZGVwLmMgKHNwYXJjNjRfZHdhcmYyX2ZyYW1lX2luaXRfcmVnKTogTGlrZXdpc2UuCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjMzJfc3RydWN0X3JldHVybl9mcm9tX3N5bSk6IE5ldyBmdW5jdGlvbi4KKwkoc3BhcmMzMl9mcmFtZV9jYWNoZSk6IENhbGwgaXQuCisJKHNwYXJjMzJfZHdhcmYyX3N0cnVjdF9yZXR1cm5fcCk6IE5ldyBmdW5jdGlvbi4KKwkoc3BhcmNfZHdhcmYyX2ZyYW1lX2luaXRfcmVnKTogVXNlIGl0IHRvIGRldGVybWluZSBpZiB0aGUgZnVuY3Rpb24KKwlyZXR1cm5zIGEgc3RydWN0dXJlIGFuZCB0aHVzIHdlIGhhdmUgdG8gaW5kaWNhdGUgdGhlIHJldHVybiBQQyBhbmQKKwlOUEMgYXJlIDQgYnl0ZXMgbGF0ZXIgdGhhbiB1c3VhbC4KKwkqIHNwYXJjLWxpbnV4LXRkZXAuYyAoc3BhcmMzMl9saW51eF9pbml0X2FiaSk6IEFwcGVuZAorCWR3YXJmMiBmcmFtZSBzbmlmZmVyLgorCSogTWFrZWZpbGUuaW4gKHNwYXJjLWxpbnV4LXRkZXAubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCisJCisyMDA2LTA0LTA0ICBEYXZpZCBTLiBNaWxsZXIgIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorCisJKiBjb25maWcvbGludXgubWggKE5BVERFUEZJTEVTKTogUmVtb3ZlIHNwYXJjLXNvbDItbmF0Lm8KKwkqIGNvbmZpZy9saW51eDY0LmggKE5BVERFUEZJTEVTKTogTGlrZXdpc2UKKwkqIHNwYXJjLWxpbnV4LW5hdC5jIChzdXBwbHlfZ3JlZ3NldCwgc3VwcGx5X2ZwcmVnc2V0LCBmaWxsX2dyZWdzZXQsCisJZmlsbF9mcHJlZ3NldCk6IE5ldy4KKwkqIHNwYXJjNjQtbGludXgtbmF0LmMgKHN1cHBseV9ncmVnc2V0LCBzdXBwbHlfZnByZWdzZXQsIGZpbGxfZ3JlZ3NldCwKKwlmaWxsX2ZwcmVnc2V0KTogTmV3LgorCSogTWFrZWZpbGUuaW4gKHNwYXJjLWxpbnV4LW5hdC5vLCBzcGFyYzY0LWxpbnV4LW5hdC5vKTogVXBkYXRlIGZvcgorCW5ldyBpbmNsdWRlcy4KKwkKKzIwMDYtMDQtMDQgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+CisKKwkqIE1ha2VmaWxlLmluIChlbGZfY29tbW9uX2gpOiBEZWZpbmUuCisKKzIwMDYtMDQtMDMgIEFuZHJldyBTdHViYnMgIDxhbmRyZXcuc3R1YmJzQHN0LmNvbT4KKworCSogc2gtdGRlcC5jIChzaF9kd2FyZjJfZnJhbWVfaW5pdF9yZWcpOiBOZXcgZnVuY3Rpb24uCisJKHNoX2dkYmFyY2hfaW5pdCk6IENhbGwgZHdhcmYyX2ZyYW1lX3NldF9pbml0X3JlZygpLgorCisyMDA2LTAzLTMxICBBbmRyZXcgU3R1YmJzICA8YW5kcmV3LnN0dWJic0BzdC5jb20+CisKKwkqIHZhbHVlLmggKHN0cnVjdCBpbnRlcm5hbHZhcik6IEFkZCBmaWVsZCAnZW5kaWFuJy4KKwkqIHZhbHVlLmMgKGxvb2t1cF9pbnRlcm5hbHZhcik6IEluaXRpYWxpc2UgZW5kaWFuLgorCSh2YWx1ZV9vZl9pbnRlcm5hbHZhcik6IEZsaXAgdGhlIGVuZGlhbiBvZiBidWlsdC1pbiB0eXBlcyBpZiByZXF1aXJlZC4KKwkoc2V0X2ludGVybmFsdmFyKTogU2V0IHRoZSBlbmRpYW4uCisJKHNob3dfY29udmVuaWVuY2UpOiBBY2Nlc3MgdGhlIHZhbHVlIHRocm91Z2ggdmFsdWVfb2ZfaW50ZXJuYWx2YXIoKS4KKworMjAwNi0wMy0zMCAgVmxhZGltaXIgUHJ1cyAgPGdob3N0QGNzLm1zdS5zdT4KKworCSogcmVtb3RlLmMgKHdhdGNocG9pbnRfdG9fWl9wYWNrZXQpOiBVc2UgdmFsdWVzIG9mIFpfcGFja2V0X3R5cGUgZW51bQorCWluc3RlYWQgb2YgaGFyZGNvZGVkIGludGVnZXIgbGl0ZXJhbHMuCisKKzIwMDYtMDMtMzAgIERhbmllbCBKYWNvYm93aXR6ICA8ZGFuQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIGNsaS9jbGktc2NyaXB0LmMgKGluc2VydF9hcmdzKTogSGFuZGxlIE5VTEwgdXNlcl9hcmdzLgorCisyMDA2LTAzLTMwICBEYW5pZWwgSmFjb2Jvd2l0eiAgPGRhbkBjb2Rlc291cmNlcnkuY29tPgorCisJKiBhcm0tdGRlcC5jICh0aHVtYl9zY2FuX3Byb2xvZ3VlKTogRG9uJ3QgdHJ5IHRvIGFuYWx5emUKKwl0aGUgZnVuY3Rpb24gYXQgemVybyBpZiB3ZSBoYXZlIG5vIHN5bWJvbHMuCisKKzIwMDYtMDMtMzAgIEFkcmllbiBLdW55c3ogIDxhX2t1bnlzekB5YWhvby5jb20+CisKKwkqIGkzODYtc3R1Yi5jIChnZXRwYWNrZXQpOiBGaXggYXJyYXkgb3ZlcmZsb3cuCisJKiBtMzJyLXN0dWIuYyAoZ2V0cGFja2V0KTogTGlrZXdpc2UuCisJKiBtNjhrLXN0dWIuYyAoZ2V0cGFja2V0KTogTGlrZXdpc2UuCisJKiBzaC1zdHViLmMgKGdldHBhY2tldCk6IExpa2V3aXNlLgorCSogc3BhcmMtc3R1Yi5jIChnZXRwYWNrZXQpOiBMaWtld2lzZS4KKworMjAwNi0wMy0zMCAgRGFuaWVsIEphY29ib3dpdHogIDxkYW5AY29kZXNvdXJjZXJ5LmNvbT4KKyAKKwkqIGZyYW1lLmggKHNldF9jdXJyZW50X3NhbF9mcm9tX2ZyYW1lKTogTmV3IHByb3RvdHlwZS4KKwkqIHN0YWNrLmMgKHNldF9jdXJyZW50X3NhbF9mcm9tX2ZyYW1lKTogTWFrZSBnbG9iYWwuCisJKiBpbmZydW4uYyAobm9ybWFsX3N0b3ApOiBDYWxsIHNldF9jdXJyZW50X3NhbF9mcm9tX2ZyYW1lLgorCisyMDA2LTAzLTMwICBEYW5pZWwgSmFjb2Jvd2l0eiAgPGRhbkBjb2Rlc291cmNlcnkuY29tPgorCisJKiBsaW51eC10aHJlYWQtZGIuYzogSW5jbHVkZSAibGludXgtbmF0LmgiLgorCShjaGVja19mb3JfdGhyZWFkX2RiKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgZnJvbQorCXRocmVhZF9kYl9uZXdfb2JqZmlsZS4gIFJlbW92ZSBkZWFkIGNoZWNrIGZvciBhY3RpdmUKKwl0aHJlYWRfZGIgb24gaW5hcHBsaWNhYmxlIHRhcmdldHMuCisJKHRocmVhZF9kYl9uZXdfb2JqZmlsZSk6IENhbGwgY2hlY2tfZm9yX3RocmVhZF9kYi4KKwkqIE1ha2VmaWxlLmluIChsaW51eC10aHJlYWQtZGIubyk6IFVwZGF0ZS4KKwkqIGxpbnV4LW5hdC5jIChjaGlsZF9wb3N0X2F0dGFjaCk6IENhbGwgY2hlY2tfZm9yX3RocmVhZF9kYi4KKwkobGludXhfY2hpbGRfcG9zdF9zdGFydHVwX2luZmVyaW9yKTogTGlrZXdpc2UuCisJKGxpbl9sd3BfYXR0YWNoX2x3cCk6IENhbGwgdGFyZ2V0X3Bvc3RfYXR0YWNoIGluc3RlYWQgb2YKKwljaGlsZF9wb3N0X2F0dGFjaC4KKwkqIGxpbnV4LW5hdC5oIChjaGVja19mb3JfdGhyZWFkX2RiKTogTmV3IHByb3RvdHlwZS4KKworMjAwNi0wMy0zMCAgRGFuaWVsIEphY29ib3dpdHogIDxkYW5AY29kZXNvdXJjZXJ5LmNvbT4KKworCSogcmVtb3RlLmMgKHN0cnVjdCByZW1vdGVfc3RhdGUpOiBBZGQgQlVGIGFuZCBCVUZfU0laRS4KKwkoaW5pdF9yZW1vdGVfc3RhdGUpOiBJbml0aWFsaXplIHRoZSBuZXcgZmllbGRzLgorCShnZXRfbWVtb3J5X3BhY2tldF9zaXplKTogVXBkYXRlIEJVRiBhbmQgQlVGX1NJWkUgaWYgbmVjZXNzYXJ5LgorCShzZXRfdGhyZWFkLCByZW1vdGVfdGhyZWFkX2FsaXZlLCByZW1vdGVfdW5wYWNrX3RocmVhZF9pbmZvX3Jlc3BvbnNlKQorCShyZW1vdGVfZ2V0X3RocmVhZGluZm8sIHBhcnNlX3RocmVhZGxpc3RfcmVzcG9uc2UpCisJKHJlbW90ZV9nZXRfdGhyZWFkbGlzdCwgcmVtb3RlX2N1cnJlbnRfdGhyZWFkLCByZW1vdGVfdGhyZWFkc19pbmZvKQorCShyZW1vdGVfdGhyZWFkc19leHRyYV9pbmZvLCBleHRlbmRlZF9yZW1vdGVfcmVzdGFydCwgZ2V0X29mZnNldHMpCisJKHJlbW90ZV9jaGVja19zeW1ib2xzLCByZW1vdGVfb3Blbl8xLCByZW1vdGVfZGV0YWNoKQorCShyZW1vdmVfdmNvbnRfcHJvYmUsIHJlbW90ZV92Y29udF9yZXN1bWUsIHJlbW90ZV9yZXN1bWUpCisJKHJlbW90ZV93YWl0LCByZW1vdGVfYXN5bmNfd2FpdCwgZmV0Y2hfcmVnaXN0ZXJfdXNpbmdfcCkKKwkocmVtb3RlX2ZldGNoX3JlZ2lzdGVycywgc3RvcmVfcmVnaXN0ZXJfdXNpbmdfUCkKKwkocmVtb3RlX3N0b3JlX3JlZ2lzdGVycywgY2hlY2tfYmluYXJ5X2Rvd25sb2FkLCByZW1vdGVfd3JpdGVfYnl0ZXMpCisJKHJlbW90ZV9yZWFkX2J5dGVzLCByZW1vdGVfaW5zZXJ0X2JyZWFrcG9pbnQpCisJKHJlbW90ZV9yZW1vdmVfYnJlYWtwb2ludCwgcmVtb3RlX2luc2VydF93YXRjaHBvaW50KQorCShyZW1vdGVfcmVtb3ZlX3dhdGNocG9pbnQsIHJlbW90ZV9pbnNlcnRfaHdfYnJlYWtwb2ludCkKKwkocmVtb3RlX3JlbW92ZV9od19icmVha3BvaW50LCBjb21wYXJlX3NlY3Rpb25zX2NvbW1hbmQpCisJKHJlbW90ZV94ZmVyX3BhcnRpYWwsIHJlbW90ZV9yY21kLCBwYWNrZXRfY29tbWFuZCkKKwkocmVtb3RlX2dldF90aHJlYWRfbG9jYWxfYWRkcmVzcyk6IFVzZSB0aGUgZ2xvYmFsIGluY29taW5nIGJ1ZmZlcgorCWluc3RlYWQgb2YgYWxsb2NhIG9yIHhtYWxsb2MuICBMaW1pdCBvdXRnb2luZyBwYWNrZXRzIHRvCisJcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSBhbmQgaW5jb21pbmcgcGFja2V0cyB0byBycy0+YnVmX3NpemUuCisJVXBkYXRlIGNhbGxzIHRvIGdldHBrdCBhbmQgcmVtb3RlX3NlbmQuCisJKHJlbW90ZV9zZW5kKTogVGFrZSBhcmd1bWVudHMgYnkgcmVmZXJlbmNlLgorCShwdXRwa3RfYmluYXJ5KTogRWxpbWluYXRlIGp1bmtidWYuICBVc2Ugc2tpcF9mcmFtZS4KKwkoc2tpcF9mcmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkocmVhZF9mcmFtZSk6IFRha2UgYXJndW1lbnRzIGJ5IHJlZmVyZW5jZS4gIEV4cGFuZCB0aGUgcGFja2V0CisJYnVmZmVyIGluc3RlYWQgb2YgaXNzdWluZyBhbiBlcnJvci4KKwkoZ2V0cGt0LCBnZXRwa3Rfc2FuZSk6IFRha2UgYXJndW1lbnRzIGJ5IHJlZmVyZW5jZS4KKwkqIHJlbW90ZS5oIChnZXRwa3QpOiBVcGRhdGUgcHJvdG90eXBlIGFuZCBkb2MuCisJKiB0cmFjZXBvaW50LmMgKHJlbW90ZV9nZXRfbm9pc3lfcmVwbHkpOiBUYWtlIGFyZ3VtZW50cyBieQorCXJlZmVyZW5jZS4KKwkodGFyZ2V0X2J1Zik6IENoYW5nZSBmcm9tIGFycmF5IHRvIHBvaW50ZXIuCisJKHRhcmdldF9idWZfc2l6ZSk6IE5ldyB2YXJpYWJsZS4KKwkocmVtb3RlX3NldF90cmFuc3BhcmVudF9yYW5nZXMpOiBVcGRhdGUgY2FsbCB0byBnZXRwa3QuCisJKHRyYWNlX3N0YXJ0X2NvbW1hbmQsIHRyYWNlX3N0b3BfY29tbWFuZCwgdHJhY2Vfc3RhdHVzX2NvbW1hbmQpOgorCVVwZGF0ZSBjYWxscyB0byByZW1vdGVfZ2V0X25vaXN5X3JlcGx5LgorCShmaW5pc2hfdGZpbmRfY29tbWFuZCk6IFRha2UgYXJndW1lbnRzIGJ5IHJlZmVyZW5jZS4KKwkodHJhY2VfZmluZF9jb21tYW5kLCB0cmFjZV9maW5kX3BjX2NvbW1hbmQpCisJKHRyYWNlX2ZpbmRfdHJhY2Vwb2ludF9jb21tYW5kLCB0cmFjZV9maW5kX2xpbmVfY29tbWFuZCk6CisJKHRyYWNlX2ZpbmRfcmFuZ2VfY29tbWFuZCwgdHJhY2VfZmluZF9vdXRzaWRlX2NvbW1hbmQpOiBVcGRhdGUKKwljYWxscyB0byBmaW5pc2hfdGZpbmRfY29tbWFuZC4KKwkoX2luaXRpYWxpemVfdHJhY2Vwb2ludCk6IEluaXRpYWxpemUgdGFyZ2V0X2J1Zl9zaXplIGFuZCB0YXJnZXRfYnVmLgorCisyMDA1LTAzLTMwICBSYW5kb2xwaCBDaHVuZyAgPHRhdXNxQGRlYmlhbi5vcmc+CisKKwkqIGhwcGEtbGludXgtdGRlcC5jOiBJbmNsdWRlIHJlZ3NldC5oLgorCShHUl9SRUdOVU0sIFRSX1JFR05VTSwgZ3JlZ19tYXApOiBOZXcuCisJKGhwcGFfbGludXhfc3VwcGx5X3JlZ3NldCwgaHBwYV9saW51eF9zdXBwbHlfZnByZWdzZXQpOiBOZXcuCisJKGhwcGFfbGludXhfcmVnc2V0LCBocHBhX2xpbnV4X2ZwcmVnc2V0KTogTmV3LgorCShocHBhX2xpbnV4X3JlZ3NldF9mcm9tX2NvcmVfc2VjdGlvbik6IE5ldy4KKwkoaHBwYV9saW51eF9pbml0X2FiaSk6IFNldCByZWdzZXRfZnJvbV9jb3JlX3NlY3Rpb24uCisJKF9pbml0aWFsaXplX2hwcGFfbGludXhfdGRlcCk6IFJlZ2lzdGVyIG9zYWJpIGhhbmRsZXIgZm9yCisJNjQtYml0IExpbnV4LgorCSogTWFrZWZpbGUuaW4gKGhwcGEtbGludXgtdGRlcC5vKTogVXBkYXRlIGRlcGVuZGVuY2llcy4KKwkqIGNvbmZpZy9wYS9saW51eC5taDogU3RvcCB1c2luZyBjb3JlLXJlZ3NldC5vCisKKzIwMDYtMDMtMzAgIFJhbmRvbHBoIENodW5nICA8dGF1c3FAZGViaWFuLm9yZz4KKworCSogaHBwYS10ZGVwLmMgKGhwcGFfZmluZF91bndpbmRfZW50cnlfaW5fYmxvY2spOiBOZXcuCisJKGhwcGFfZnJhbWVfY2FjaGUpOiBVc2UgbmV3IGZ1bmN0aW9uIHRvIGZpbmQgdW53aW5kIGVudHJ5LgorCShocHBhX2ZyYW1lX3RoaXNfaWQpOiBMaWtld2lzZS4KKwkoaHBwYV9mcmFtZV91bndpbmRfc25pZmZlcik6IExpa2V3aXNlLgorCiAyMDA2LTAzLTI5ICBEYW5pZWwgSmFjb2Jvd2l0eiAgPGRhbkBjb2Rlc291cmNlcnkuY29tPgogCiAJKiBORVdTOiBNZW50aW9uIHRoZSByZW1vdmFsIG9mIE5MTS4KZGlmZiAtLWdpdCBhL2dkYi9NQUlOVEFJTkVSUyBiL2dkYi9NQUlOVEFJTkVSUwppbmRleCA1OWI5M2M5Li5kYmQyZjkzIDEwMDY0NAotLS0gYS9nZGIvTUFJTlRBSU5FUlMKKysrIGIvZ2RiL01BSU5UQUlORVJTCkBAIC0xOTIsNiArMTkyLDcgQEAKIAogQ3VycmVudCBwYXRjaCBjaGFtcGlvbnMgKGluIGFscGhhYmV0aWNhbCBvcmRlcik6CiAKKwlSYW5kb2xwaCBDaHVuZyAgICAgPHRhdXNxQGRlYmlhbi5vcmc+CiAJRGFuaWVsIEphY29ib3dpdHogIDxkYW5AZGViaWFuLm9yZz4KIAogCmRpZmYgLS1naXQgYS9nZGIvTWFrZWZpbGUuaW4gYi9nZGIvTWFrZWZpbGUuaW4KaW5kZXggNjQ0ZTlkOS4uYmVhYjU3YyAxMDA2NDQKLS0tIGEvZ2RiL01ha2VmaWxlLmluCisrKyBiL2dkYi9NYWtlZmlsZS5pbgpAQCAtNTc2LDYgKzU3Niw3IEBACiBjb2ZmX2Vjb2ZmX2ggPQkkKElOQ0xVREVfRElSKS9jb2ZmL2Vjb2ZmLmgKIGNvZmZfaW50ZXJuYWxfaCA9CSQoSU5DTFVERV9ESVIpL2NvZmYvaW50ZXJuYWwuaAogZGlzX2FzbV9oID0JJChJTkNMVURFX0RJUikvZGlzLWFzbS5oICQoYmZkX2gpCitlbGZfY29tbW9uX2ggPQkkKElOQ0xVREVfRElSKS9lbGYvY29tbW9uLmgKIGVsZl9yZWxvY19tYWNyb3NfaCA9CSQoSU5DTFVERV9ESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAogZWxmX3NoX2ggPQkkKElOQ0xVREVfRElSKS9lbGYvc2guaAogZWxmX2FybV9oID0JJChJTkNMVURFX0RJUikvZWxmL2FybS5oICQoZWxmX3JlbG9jX21hY3Jvc19oKQpAQCAtOTUxLDcgKzk1Miw4IEBACiAJcmVnZ3JvdXBzLm8gcmVnc2V0Lm8gXAogCXRyYWQtZnJhbWUubyBcCiAJdHJhbXAtZnJhbWUubyBcCi0Jc29saWIubyBzb2xpYi1udWxsLm8KKwlzb2xpYi5vIHNvbGliLW51bGwubyBcCisJcHJvbG9ndWUtdmFsdWUubwogCiBUU09CUyA9IGluZmxvdy5vCiAKQEAgLTIwMzMsNyArMjAzNSw3IEBACiBocHBhLWxpbnV4LXRkZXAubzogaHBwYS1saW51eC10ZGVwLmMgJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKG9zYWJpX2gpIFwKIAkkKHRhcmdldF9oKSAkKG9iamZpbGVzX2gpICQoc29saWJfc3ZyNF9oKSAkKGdsaWJjX3RkZXBfaCkgXAogCSQoZnJhbWVfdW53aW5kX2gpICQodHJhZF9mcmFtZV9oKSAkKGR3YXJmMl9mcmFtZV9oKSAkKHZhbHVlX2gpIFwKLQkkKGhwcGFfdGRlcF9oKSAkKGVsZl9jb21tb25faCkKKwkkKGhwcGFfdGRlcF9oKSAkKGVsZl9jb21tb25faCkgJChyZWdzZXRfaCkKIGhwcGEtdGRlcC5vOiBocHBhLXRkZXAuYyAkKGRlZnNfaCkgJChiZmRfaCkgJChpbmZlcmlvcl9oKSAkKHJlZ2NhY2hlX2gpIFwKIAkkKGNvbXBsZXRlcl9oKSAkKG9zYWJpX2gpICQoZ2RiX2Fzc2VydF9oKSAkKGFyY2hfdXRpbHNfaCkgXAogCSQoc3ltdGFiX2gpICQoZGlzX2FzbV9oKSAkKHRyYWRfZnJhbWVfaCkgJChmcmFtZV91bndpbmRfaCkgXApAQCAtMjE5NCwxMyArMjE5NiwxMyBAQAogCSQobGludXhfbmF0X2gpCiBsaW51eC1uYXQubzogbGludXgtbmF0LmMgJChkZWZzX2gpICQoaW5mZXJpb3JfaCkgJCh0YXJnZXRfaCkgJChnZGJfc3RyaW5nX2gpIFwKIAkkKGdkYl93YWl0X2gpICQoZ2RiX2Fzc2VydF9oKSAkKGxpbnV4X25hdF9oKSAkKGdkYnRocmVhZF9oKSBcCi0JJChnZGJjbWRfaCkgJChyZWdjYWNoZV9oKSAkKGluZl9wdHJhY2UuaCkgJChhdXh2LmgpICQoZWxmX2JmZF9oKSBcCisJJChnZGJjbWRfaCkgJChyZWdjYWNoZV9oKSAkKGluZl9wdHJhY2VfaCkgJChhdXh2X2gpICQoZWxmX2JmZF9oKSBcCiAJJChncmVnc2V0X2gpICQoZ2RiY29yZV9oKSAkKGdkYnRocmVhZF9oKSAkKGdkYl9zdGF0X2gpIFwKIAkkKGxpbnV4X2ZvcmtfaCkKIGxpbnV4LXRocmVhZC1kYi5vOiBsaW51eC10aHJlYWQtZGIuYyAkKGRlZnNfaCkgJChnZGJfYXNzZXJ0X2gpIFwKIAkkKGdkYl9wcm9jX3NlcnZpY2VfaCkgJChnZGJfdGhyZWFkX2RiX2gpICQoYmZkX2gpICQoZXhjZXB0aW9uc19oKSBcCiAJJChnZGJ0aHJlYWRfaCkgJChpbmZlcmlvcl9oKSAkKHN5bWZpbGVfaCkgJChvYmpmaWxlc19oKSAkKHRhcmdldF9oKSBcCi0JJChyZWdjYWNoZV9oKSAkKHNvbGliX3N2cjRfaCkgJChnZGJjb3JlX2gpCisJJChyZWdjYWNoZV9oKSAkKHNvbGliX3N2cjRfaCkgJChnZGJjb3JlX2gpICQobGludXhfbmF0X2gpCiBseW54LW5hdC5vOiBseW54LW5hdC5jICQoZGVmc19oKSAkKGZyYW1lX2gpICQoaW5mZXJpb3JfaCkgJCh0YXJnZXRfaCkgXAogCSQoZ2RiY29yZV9oKSAkKHJlZ2NhY2hlX2gpCiBtMi1leHAubzogbTItZXhwLmMgJChkZWZzX2gpICQoZ2RiX3N0cmluZ19oKSAkKGV4cHJlc3Npb25faCkgJChsYW5ndWFnZV9oKSBcCkBAIC0yMzM2LDkgKzIzMzgsOSBAQAogCSQoZnJhbWVfaCkgJCh0cmFkX2ZyYW1lX2gpICQodHJhbXBfZnJhbWVfaCkKIG1uMTAzMDAtdGRlcC5vOiBtbjEwMzAwLXRkZXAuYyAkKGRlZnNfaCkgJChhcmNoX3V0aWxzX2gpICQoZGlzX2FzbV9oKSBcCiAJJChnZGJ0eXBlc19oKSAkKHJlZ2NhY2hlX2gpICQoZ2RiX3N0cmluZ19oKSAkKGdkYl9hc3NlcnRfaCkgXAorCSQoZ2RiY29yZV9oKSAkKHZhbHVlX2gpICQoZ2RidHlwZXNfaCkgXAogCSQoZnJhbWVfaCkgJChmcmFtZV91bndpbmRfaCkgJChmcmFtZV9iYXNlX2gpICQodHJhZF9mcmFtZV9oKSBcCiAJJChzeW10YWJfaCkgJChkd2FyZjJfZnJhbWVfaCkgJChvc2FiaV9oKSAkKG1uMTAzMDBfdGRlcF9oKQotCiBtb25pdG9yLm86IG1vbml0b3IuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQodGFyZ2V0X2gpICQoZXhjZXB0aW9uc19oKSBcCiAJJChnZGJfc3RyaW5nX2gpICQoY29tbWFuZF9oKSAkKHNlcmlhbF9oKSAkKG1vbml0b3JfaCkgJChnZGJjbWRfaCkgXAogCSQoaW5mZXJpb3JfaCkgJChnZGJfcmVnZXhfaCkgJChzcmVjX2gpICQocmVnY2FjaGVfaCkKQEAgLTIzNjksNyArMjM3MSw3IEBACiBvYmpmaWxlcy5vOiBvYmpmaWxlcy5jICQoZGVmc19oKSAkKGJmZF9oKSAkKHN5bXRhYl9oKSAkKHN5bWZpbGVfaCkgXAogCSQob2JqZmlsZXNfaCkgJChnZGJfc3RhYnNfaCkgJCh0YXJnZXRfaCkgJChiY2FjaGVfaCkgJChtZGVidWdyZWFkX2gpIFwKIAkkKGdkYl9hc3NlcnRfaCkgJChnZGJfc3RhdF9oKSAkKGdkYl9vYnN0YWNrX2gpICQoZ2RiX3N0cmluZ19oKSBcCi0JJChoYXNodGFiX2gpICQoYnJlYWtwb2ludF9oKSAkKGJsb2NrX2gpICQoZGljdGlvbmFyeV9oKQorCSQoaGFzaHRhYl9oKSAkKGJyZWFrcG9pbnRfaCkgJChibG9ja19oKSAkKGRpY3Rpb25hcnlfaCkgJChzb3VyY2VfaCkKIG9ic2VydmVyLm86IG9ic2VydmVyLmMgJChkZWZzX2gpICQob2JzZXJ2ZXJfaCkgJChjb21tYW5kX2gpICQoZ2RiY21kX2gpIFwKIAkkKG9ic2VydmVyX2luYykKIG9ic2QtdGRlcC5vOiBvYnNkLXRkZXAuYyAkKGRlZnNfaCkgJChmcmFtZV9oKSAkKHN5bXRhYl9oKSAkKG9ic2RfdGRlcF9oKQpAQCAtMjM4MCw4ICsyMzgyLDggQEAKIAkkKGFyY2hfdXRpbHNfaCkgJChnZGJjbWRfaCkgJChjb21tYW5kX2gpICQoZWxmX2JmZF9oKQogcGFyc2UubzogcGFyc2UuYyAkKGRlZnNfaCkgJChnZGJfc3RyaW5nX2gpICQoc3ltdGFiX2gpICQoZ2RidHlwZXNfaCkgXAogCSQoZnJhbWVfaCkgJChleHByZXNzaW9uX2gpICQodmFsdWVfaCkgJChjb21tYW5kX2gpICQobGFuZ3VhZ2VfaCkgXAotCSQocGFyc2VyX2RlZnNfaCkgJChnZGJjbWRfaCkgJChzeW1maWxlX2gpICQoaW5mZXJpb3JfaCkgXAotCSQoZG91Ymxlc3RfaCkgJChnZGJfYXNzZXJ0X2gpICQoYmxvY2tfaCkKKwkkKGZfbGFuZ19oKSAkKHBhcnNlcl9kZWZzX2gpICQoZ2RiY21kX2gpICQoc3ltZmlsZV9oKSAkKGluZmVyaW9yX2gpIFwKKwkkKGRvdWJsZXN0X2gpICQoZ2RiX2Fzc2VydF9oKSAkKGJsb2NrX2gpICQoc291cmNlX2gpCiBwLWV4cC5vOiBwLWV4cC5jICQoZGVmc19oKSAkKGdkYl9zdHJpbmdfaCkgJChleHByZXNzaW9uX2gpICQodmFsdWVfaCkgXAogCSQocGFyc2VyX2RlZnNfaCkgJChsYW5ndWFnZV9oKSAkKHBfbGFuZ19oKSAkKGJmZF9oKSAkKHN5bWZpbGVfaCkgXAogCSQob2JqZmlsZXNfaCkgJChibG9ja19oKQpAQCAtMjQxNiw4ICsyNDE4LDggQEAKIAkkKGJzZF9rdm1faCkKIHBwY29ic2QtdGRlcC5vOiBwcGNvYnNkLXRkZXAuYyAkKGRlZnNfaCkgJChhcmNoX3V0aWxzX2gpICQoZmxvYXRmb3JtYXRfaCkgXAogCSQoZnJhbWVfaCkgJChmcmFtZV91bndpbmRfaCkgJChvc2FiaV9oKSAkKHJlZ2NhY2hlX2gpICQocmVnc2V0X2gpIFwKLQkkKHRyYWRfZnJhbWVfaCkgJChnZGJfYXNzZXJ0X2gpICQoZ2RiX3N0cmluZ19oKSAkKHBwY190ZGVwX2gpIFwKLQkkKHBwY29ic2RfdGRlcF9oKSAkKHNvbGliX3N2cjRfaCkKKwkkKHN5bXRhYl9oKSAkKHRyYWRfZnJhbWVfaCkgJChnZGJfYXNzZXJ0X2gpICQoZ2RiX3N0cmluZ19oKSBcCisJJChwcGNfdGRlcF9oKSAkKHBwY29ic2RfdGRlcF9oKSAkKHNvbGliX3N2cjRfaCkKIHBwYy1zeXN2LXRkZXAubzogcHBjLXN5c3YtdGRlcC5jICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKSBcCiAJJChyZWdjYWNoZV9oKSAkKHZhbHVlX2gpICQoZ2RiX3N0cmluZ19oKSAkKGdkYl9hc3NlcnRfaCkgXAogCSQocHBjX3RkZXBfaCkgJCh0YXJnZXRfaCkgJChvYmpmaWxlc19oKSAkKGluZmNhbGxfaCkKQEAgLTI0MzMsNyArMjQzNSw3IEBACiBwcm9jZnMubzogcHJvY2ZzLmMgJChkZWZzX2gpICQoaW5mZXJpb3JfaCkgJCh0YXJnZXRfaCkgJChnZGJjb3JlX2gpIFwKIAkkKGVsZl9iZmRfaCkgJChnZGJjbWRfaCkgJChnZGJ0aHJlYWRfaCkgJChnZGJfd2FpdF9oKSBcCiAJJChnZGJfc3RyaW5nX2gpICQoZ2RiX2Fzc2VydF9oKSAkKGluZmxvd19oKSAkKGF1eHZfaCkgXAotCSQoZ2RiX2RpcmVudF9oKSAkKFhfT0spICQoZ2RiX3N0YXRfaCkgJChwcm9jX3V0aWxzX2gpICQoZ3JlZ3NldF9oKQorCSQoZ2RiX2RpcmVudF9oKSAkKGdkYl9zdGF0X2gpICQocHJvY191dGlsc19oKSAkKGdyZWdzZXRfaCkKIHByb2Mtc2VydmljZS5vOiBwcm9jLXNlcnZpY2UuYyAkKGRlZnNfaCkgJChnZGJfcHJvY19zZXJ2aWNlX2gpICQoaW5mZXJpb3JfaCkgXAogCSQoc3ltdGFiX2gpICQodGFyZ2V0X2gpICQoZ3JlZ3NldF9oKQogcHJvYy13aHkubzogcHJvYy13aHkuYyAkKGRlZnNfaCkgJChwcm9jX3V0aWxzX2gpCkBAIC0yNTE0LDcgKzI1MTYsOCBAQAogCSQoc3ltdGFiX2gpICQodGFyZ2V0X2gpICQoZ2RiY29yZV9oKSAkKGdkYmNtZF9oKSAkKG9iamZpbGVzX2gpIFwKIAkkKGZsb2F0Zm9ybWF0X2gpICQocmVnY2FjaGVfaCkgJCh0cmFkX2ZyYW1lX2gpICQoZnJhbWVfYmFzZV9oKSBcCiAJJChmcmFtZV91bndpbmRfaCkgJChkd2FyZjJfZnJhbWVfaCkgJChyZWdncm91cHNfaCkgJChyZWdzZXRfaCkgXAotCSQodmFsdWVfaCkgJChnZGJfYXNzZXJ0X2gpICQoZGlzX2FzbV9oKSAkKHNvbGliX3N2cjRfaCkgJChzMzkwX3RkZXBfaCkKKwkkKHZhbHVlX2gpICQoZ2RiX2Fzc2VydF9oKSAkKGRpc19hc21faCkgJChzb2xpYl9zdnI0X2gpIFwKKwkkKHByb2xvZ3VlX3ZhbHVlX2gpICQoczM5MF90ZGVwX2gpCiBzY20tZXhwLm86IHNjbS1leHAuYyAkKGRlZnNfaCkgJChzeW10YWJfaCkgJChnZGJ0eXBlc19oKSAkKGV4cHJlc3Npb25faCkgXAogCSQocGFyc2VyX2RlZnNfaCkgJChsYW5ndWFnZV9oKSAkKHZhbHVlX2gpICQoY19sYW5nX2gpICQoc2NtX2xhbmdfaCkgXAogCSQoc2NtX3RhZ3NfaCkKQEAgLTI1NjAsNyArMjU2Myw3IEBACiAJJChnZGJfYXNzZXJ0X2gpICQoYXJjaF91dGlsc19oKSAkKGZsb2F0Zm9ybWF0X2gpICQocmVnY2FjaGVfaCkgXAogCSQoZG91Ymxlc3RfaCkgJChvc2FiaV9oKSAkKHNoX3RkZXBfaCkgJChlbGZfYmZkX2gpICQoc29saWJfc3ZyNF9oKSBcCiAJJChlbGZfc2hfaCkgJChnZGJfc2ltX3NoX2gpICQocmVnZ3JvdXBzX2gpCi1zb2wyLXRkZXAubzogc29sMi10ZGVwLmMgJChkZWZzX2gpICQoZnJhbWVfaCkgJChzeW10YWJfaCkKK3NvbDItdGRlcC5vOiBzb2wyLXRkZXAuYyAkKGRlZnNfaCkgJChmcmFtZV9oKSAkKHN5bXRhYl9oKSAkKHNvbDJfdGRlcF9oKQogc29saWItYWl4NS5vOiBzb2xpYi1haXg1LmMgJChkZWZzX2gpICQoZ2RiX3N0cmluZ19oKSAkKGVsZl9leHRlcm5hbF9oKSBcCiAJJChzeW10YWJfaCkgJChiZmRfaCkgJChzeW1maWxlX2gpICQob2JqZmlsZXNfaCkgJChnZGJjb3JlX2gpIFwKIAkkKGNvbW1hbmRfaCkgJCh0YXJnZXRfaCkgJChmcmFtZV9oKSAkKGdkYl9yZWdleF9oKSAkKGluZmVyaW9yX2gpIFwKQEAgLTI2MTEsMTEgKzI2MTQsMTMgQEAKIAkkKGZyYW1lX3Vud2luZF9oKSAkKGdkYmNvcmVfaCkgJChvc2FiaV9oKSAkKHJlZ2NhY2hlX2gpICQocmVnc2V0X2gpIFwKIAkkKHRhcmdldF9oKSAkKHRyYWRfZnJhbWVfaCkgJChnZGJfYXNzZXJ0X2gpICQoZ2RiX3N0cmluZ19oKSBcCiAJJChzcGFyYzY0X3RkZXBfaCkgJChzb2xpYl9zdnI0X2gpCi1zcGFyYzY0LWxpbnV4LW5hdC5vOiBzcGFyYzY0LWxpbnV4LW5hdC5jICQoZGVmc19oKSAkKHNwYXJjNjRfdGRlcF9oKSBcCitzcGFyYzY0LWxpbnV4LW5hdC5vOiBzcGFyYzY0LWxpbnV4LW5hdC5jICQoZGVmc19oKSAkKHJlZ2NhY2hlX2gpIFwKKwkkKGdyZWdzZXRfaCkgJChzcGFyYzY0X3RkZXBfaCkgJChzcGFyY190ZGVwX2gpIFwKIAkkKHNwYXJjX25hdF9oKSAkKGluZmVyaW9yX2gpICQodGFyZ2V0X2gpICQobGludXhfbmF0X2gpCiBzcGFyYzY0LWxpbnV4LXRkZXAubzogc3BhcmM2NC1saW51eC10ZGVwLmMgJChkZWZzX2gpICQoZnJhbWVfaCkgXAotCSQoZnJhbWVfdW53aW5kX2gpICQoZ2RiYXJjaF9oKSAkKG9zYWJpX2gpICQoc29saWJfc3ZyNF9oKSBcCi0JJChzeW10YWJfaCkgJCh0cmFkX2ZyYW1lX2gpICQodHJhbXBfZnJhbWVfaCkgJChzcGFyYzY0X3RkZXBfaCkKKwkkKGZyYW1lX3Vud2luZF9oKSAkKGR3YXJmMi1mcmFtZV9oKSAkKHJlZ3NldF9oKSAkKHJlZ2NhY2hlX2gpIFwKKwkkKGdkYmFyY2hfaCkgJChnZGJjb3JlX2gpICQob3NhYmlfaCkgJChzb2xpYl9zdnI0X2gpICQoc3ltdGFiX2gpIFwKKwkkKHRyYWRfZnJhbWVfaCkgJCh0cmFtcF9mcmFtZV9oKSAkKHNwYXJjNjRfdGRlcF9oKQogc3BhcmM2NC1uYXQubzogc3BhcmM2NC1uYXQuYyAkKGRlZnNfaCkgJChnZGJhcmNoX2gpICQoc3BhcmM2NF90ZGVwX2gpIFwKIAkkKHNwYXJjX25hdF9oKQogc3BhcmM2NG5ic2QtbmF0Lm86IHNwYXJjNjRuYnNkLW5hdC5jICQoZGVmc19oKSAkKHJlZ2NhY2hlX2gpICQodGFyZ2V0X2gpIFwKQEAgLTI2MzAsMTggKzI2MzUsMjAgQEAKIAkkKG9ic2RfdGRlcF9oKSAkKHNwYXJjNjRfdGRlcF9oKSAkKHNvbGliX3N2cjRfaCkgJChic2RfdXRocmVhZF9oKQogc3BhcmM2NC1zb2wyLXRkZXAubzogc3BhcmM2NC1zb2wyLXRkZXAuYyAkKGRlZnNfaCkgJChmcmFtZV9oKSBcCiAJJChmcmFtZV91bndpbmRfaCkgJChnZGJhcmNoX2gpICQoc3ltdGFiX2gpICQob2JqZmlsZXNfaCkgJChvc2FiaV9oKSBcCi0JJCh0cmFkX2ZyYW1lX2gpICQoZ2RiX2Fzc2VydF9oKSAkKHNwYXJjNjRfdGRlcF9oKSAkKHNvbGliX3N2cjRfaCkKKwkkKHRyYWRfZnJhbWVfaCkgJChnZGJfYXNzZXJ0X2gpICQoc29sMl90ZGVwX2gpICQoc3BhcmM2NF90ZGVwX2gpIFwKKwkkKHNvbGliX3N2cjRfaCkKIHNwYXJjNjQtdGRlcC5vOiBzcGFyYzY0LXRkZXAuYyAkKGRlZnNfaCkgJChhcmNoX3V0aWxzX2gpICQoZHdhcmYyX2ZyYW1lX2gpIFwKIAkkKGZsb2F0Zm9ybWF0X2gpICQoZnJhbWVfaCkgJChmcmFtZV9iYXNlX2gpICQoZnJhbWVfdW53aW5kX2gpIFwKIAkkKGdkYmNvcmVfaCkgJChnZGJ0eXBlc19oKSAkKGluZmVyaW9yX2gpICQoc3ltdGFiX2gpICQob2JqZmlsZXNfaCkgXAogCSQob3NhYmlfaCkgJChyZWdjYWNoZV9oKSAkKHRhcmdldF9oKSAkKHZhbHVlX2gpICQoZ2RiX2Fzc2VydF9oKSBcCiAJJChnZGJfc3RyaW5nX2gpICQoc3BhcmM2NF90ZGVwX2gpCi1zcGFyYy1saW51eC1uYXQubzogc3BhcmMtbGludXgtbmF0LmMgJChkZWZzX2gpICQoaW5mZXJpb3JfaCkgJCh0YXJnZXRfaCkgXAorc3BhcmMtbGludXgtbmF0Lm86IHNwYXJjLWxpbnV4LW5hdC5jICQoZGVmc19oKSAkKHJlZ2NhY2hlX2gpICQoZ3JlZ3NldF9oKSBcCisJJChzcGFyY190ZGVwX2gpICQoc3BhcmNfbmF0X2gpICQoaW5mZXJpb3JfaCkgJCh0YXJnZXRfaCkgXAogCSQobGludXhfbmF0X2gpCi1zcGFyYy1saW51eC10ZGVwLm86IHNwYXJjLWxpbnV4LXRkZXAuYyAkKGRlZnNfaCkgJChmbG9hdGZvcm1hdF9oKSAkKGZyYW1lX2gpIFwKLQkkKGZyYW1lX3Vud2luZF9oKSAkKGdkYmFyY2hfaCkgJChnZGJjb3JlX2gpICQob3NhYmlfaCkgJChyZWdjYWNoZV9oKSBcCi0JJChzb2xpYl9zdnI0X2gpICQoc3ltdGFiX2gpICQodHJhZF9mcmFtZV9oKSAkKHRyYW1wX2ZyYW1lX2gpIFwKLQkkKHNwYXJjX3RkZXBfaCkKK3NwYXJjLWxpbnV4LXRkZXAubzogc3BhcmMtbGludXgtdGRlcC5jICQoZGVmc19oKSAkKGR3YXJmMl9mcmFtZV9oKSBcCisJJChmbG9hdGZvcm1hdF9oKSAkKGZyYW1lX2gpICQoZnJhbWVfdW53aW5kX2gpICQocmVnc2V0X2gpIFwKKwkkKGdkYmFyY2hfaCkgJChnZGJjb3JlX2gpICQob3NhYmlfaCkgJChyZWdjYWNoZV9oKSAkKHNvbGliX3N2cjRfaCkgXAorCSQoc3ltdGFiX2gpICQodHJhZF9mcmFtZV9oKSAkKHRyYW1wX2ZyYW1lX2gpICQoc3BhcmNfdGRlcF9oKQogc3BhcmMtbmF0Lm86IHNwYXJjLW5hdC5jICQoZGVmc19oKSAkKGluZmVyaW9yX2gpICQocmVnY2FjaGVfaCkgJCh0YXJnZXRfaCkgXAogCSQoZ2RiX2Fzc2VydF9oKSAkKGdkYl9zdHJpbmdfaCkgJChnZGJfd2FpdF9oKSAkKHNwYXJjX3RkZXBfaCkgXAogCSQoc3BhcmNfbmF0X2gpICQoaW5mX3B0cmFjZV9oKQpAQCAtMjY2MCwxMyArMjY2NywxMyBAQAogc3BhcmMtc29sMi10ZGVwLm86IHNwYXJjLXNvbDItdGRlcC5jICQoZGVmc19oKSAkKGZyYW1lX2gpICQoZnJhbWVfdW53aW5kX2gpIFwKIAkkKGdkYmNvcmVfaCkgJChzeW10YWJfaCkgJChvYmpmaWxlc19oKSAkKG9zYWJpX2gpICQocmVnY2FjaGVfaCkgXAogCSQodGFyZ2V0X2gpICQodHJhZF9mcmFtZV9oKSAkKGdkYl9hc3NlcnRfaCkgJChnZGJfc3RyaW5nX2gpIFwKLQkkKHNwYXJjX3RkZXBfaCkgJChzb2xpYl9zdnI0X2gpCisJJChzb2wyX3RkZXBfaCkgJChzcGFyY190ZGVwX2gpICQoc29saWJfc3ZyNF9oKQogc3BhcmMtc3R1Yi5vOiBzcGFyYy1zdHViLmMKIHNwYXJjLXRkZXAubzogc3BhcmMtdGRlcC5jICQoZGVmc19oKSAkKGFyY2hfdXRpbHNfaCkgJChkaXNfYXNtX2gpIFwKLQkkKGZsb2F0Zm9ybWF0X2gpICQoZnJhbWVfaCkgJChmcmFtZV9iYXNlX2gpICQoZnJhbWVfdW53aW5kX2gpIFwKLQkkKGdkYmNvcmVfaCkgJChnZGJ0eXBlc19oKSAkKGluZmVyaW9yX2gpICQoc3ltdGFiX2gpICQob2JqZmlsZXNfaCkgXAotCSQob3NhYmlfaCkgJChyZWdjYWNoZV9oKSAkKHRhcmdldF9oKSAkKHZhbHVlX2gpICQoZ2RiX2Fzc2VydF9oKSBcCi0JJChnZGJfc3RyaW5nX2gpICQoc3BhcmNfdGRlcF9oKQorCSQoZHdhcmYyX2ZyYW1lX2gpICQoZmxvYXRmb3JtYXRfaCkgJChmcmFtZV9oKSAkKGZyYW1lX2Jhc2VfaCkgXAorCSQoZnJhbWVfdW53aW5kX2gpICQoZ2RiY29yZV9oKSAkKGdkYnR5cGVzX2gpICQoaW5mZXJpb3JfaCkgXAorCSQoc3ltdGFiX2gpICQob2JqZmlsZXNfaCkgJChvc2FiaV9oKSAkKHJlZ2NhY2hlX2gpICQodGFyZ2V0X2gpIFwKKwkkKHZhbHVlX2gpICQoZ2RiX2Fzc2VydF9oKSAkKGdkYl9zdHJpbmdfaCkgJChzcGFyY190ZGVwX2gpCiBzdGFic3JlYWQubzogc3RhYnNyZWFkLmMgJChkZWZzX2gpICQoZ2RiX3N0cmluZ19oKSAkKGJmZF9oKSAkKGdkYl9vYnN0YWNrX2gpIFwKIAkkKHN5bXRhYl9oKSAkKGdkYnR5cGVzX2gpICQoZXhwcmVzc2lvbl9oKSAkKHN5bWZpbGVfaCkgJChvYmpmaWxlc19oKSBcCiAJJChhb3V0X3N0YWJfZ251X2gpICQobGliYW91dF9oKSAkKGFvdXRfYW91dDY0X2gpICQoZ2RiX3N0YWJzX2gpIFwKQEAgLTI2NzcsNyArMjY4NCw3IEBACiAJJCh0YXJnZXRfaCkgJChzb3VyY2VfaCkgJChicmVha3BvaW50X2gpICQoZGVtYW5nbGVfaCkgJChpbmZlcmlvcl9oKSBcCiAJJChhbm5vdGF0ZV9oKSAkKHVpX291dF9oKSAkKGJsb2NrX2gpICQoc3RhY2tfaCkgJChkaWN0aW9uYXJ5X2gpIFwKIAkkKGV4Y2VwdGlvbnNfaCkgJChyZWdncm91cHNfaCkgJChyZWdjYWNoZV9oKSAkKHNvbGliX2gpIFwKLQkkKHZhbHByaW50LmgpJChnZGJfYXNzZXJ0X2gpICQoZ2RiX3N0cmluZ19oKQorCSQodmFscHJpbnRfaCkgJChnZGJfYXNzZXJ0X2gpICQoZ2RiX3N0cmluZ19oKQogc3RkLXJlZ3Mubzogc3RkLXJlZ3MuYyAkKGRlZnNfaCkgJCh1c2VyX3JlZ3NfaCkgJChmcmFtZV9oKSAkKGdkYnR5cGVzX2gpIFwKIAkkKHZhbHVlX2gpICQoZ2RiX3N0cmluZ19oKQogc3RvcC1nZGIubzogc3RvcC1nZGIuYyAkKGRlZnNfaCkKQEAgLTI2OTQsOCArMjcwMSw4IEBACiBzeW1taXNjLm86IHN5bW1pc2MuYyAkKGRlZnNfaCkgJChzeW10YWJfaCkgJChnZGJ0eXBlc19oKSAkKGJmZF9oKSBcCiAJJChzeW1maWxlX2gpICQob2JqZmlsZXNfaCkgJChicmVha3BvaW50X2gpICQoY29tbWFuZF9oKSBcCiAJJChnZGJfb2JzdGFja19oKSAkKGV4Y2VwdGlvbnNfaCkgJChsYW5ndWFnZV9oKSAkKGJjYWNoZV9oKSBcCi0JJChibG9ja19oKSAkKGdkYl9yZWdleF9oKSAkKGRpY3Rpb25hcnlfaCkgJChnZGJfc3RyaW5nX2gpIFwKLQkkKHJlYWRsaW5lX2gpCisJJChibG9ja19oKSAkKGdkYl9yZWdleF9oKSAkKGdkYl9zdGF0X2gpICQoZGljdGlvbmFyeV9oKSBcCisJJChnZGJfc3RyaW5nX2gpICQocmVhZGxpbmVfaCkKIHN5bXRhYi5vOiBzeW10YWIuYyAkKGRlZnNfaCkgJChzeW10YWJfaCkgJChnZGJ0eXBlc19oKSAkKGdkYmNvcmVfaCkgXAogCSQoZnJhbWVfaCkgJCh0YXJnZXRfaCkgJCh2YWx1ZV9oKSAkKHN5bWZpbGVfaCkgJChvYmpmaWxlc19oKSBcCiAJJChnZGJjbWRfaCkgJChjYWxsX2NtZHNfaCkgJChnZGJfcmVnZXhfaCkgJChleHByZXNzaW9uX2gpIFwKQEAgLTI3NjQsMjYgKzI3NzEsMjcgQEAKIAkkKHZhbHVlX2gpICQoZ2RiY29yZV9oKSAkKGNvbW1hbmRfaCkgJChnZGJjbWRfaCkgJCh0YXJnZXRfaCkgXAogCSQobGFuZ3VhZ2VfaCkgJChzY21fbGFuZ19oKSAkKGRlbWFuZ2xlX2gpICQoZG91Ymxlc3RfaCkgXAogCSQoZ2RiX2Fzc2VydF9oKSAkKHJlZ2NhY2hlX2gpICQoYmxvY2tfaCkKLXZhcm9iai5vOiB2YXJvYmouYyAkKGRlZnNfaCkgJCh2YWx1ZV9oKSAkKGV4cHJlc3Npb25faCkgJChmcmFtZV9oKSBcCi0JJChsYW5ndWFnZV9oKSAkKHdyYXBwZXJfaCkgJChnZGJjbWRfaCkgJChnZGJfc3RyaW5nX2gpICQodmFyb2JqX2gpCit2YXJvYmoubzogdmFyb2JqLmMgJChkZWZzX2gpICQoZXhjZXB0aW9uc19oKSAkKHZhbHVlX2gpICQoZXhwcmVzc2lvbl9oKSBcCisJJChmcmFtZV9oKSAkKGxhbmd1YWdlX2gpICQod3JhcHBlcl9oKSAkKGdkYmNtZF9oKSAkKGdkYl9hc3NlcnRfaCkgXAorCSQoZ2RiX3N0cmluZ19oKSAkKHZhcm9ial9oKQogdmF4YnNkLW5hdC5vOiB2YXhic2QtbmF0LmMgJChkZWZzX2gpICQoaW5mZXJpb3JfaCkgJChyZWdjYWNoZV9oKSAkKHRhcmdldF9oKSBcCiAJJCh2YXhfdGRlcF9oKSAkKGluZl9wdHJhY2VfaCkgJChic2Rfa3ZtX2gpCiB2YXgtbmF0Lm86IHZheC1uYXQuYyAkKGRlZnNfaCkgJChpbmZlcmlvcl9oKSAkKGdkYl9hc3NlcnRfaCkgJCh2YXhfdGRlcF9oKSBcCiAJJChpbmZfcHRyYWNlX2gpCiB2YXhuYnNkLXRkZXAubzogdmF4bmJzZC10ZGVwLmMgJChkZWZzX2gpICQoYXJjaF91dGlsc19oKSAkKG9zYWJpX2gpIFwKIAkkKHZheF90ZGVwX2gpICQoc29saWJfc3ZyNF9oKSAkKGdkYl9zdHJpbmdfaCkKLXZheG9ic2QtdGRlcC5vOiB2YXhvYnNkLXRkZXAuYyAgJChkZWZzX2gpICQoYXJjaF91dGlsc19oKSAkKGZyYW1lX2gpIFwKK3ZheG9ic2QtdGRlcC5vOiB2YXhvYnNkLXRkZXAuYyAkKGRlZnNfaCkgJChhcmNoX3V0aWxzX2gpICQoZnJhbWVfaCkgXAogCSQoZnJhbWVfdW53aW5kX2gpICQob3NhYmlfaCkgJChzeW10YWJfaCkgJCh0cmFkX2ZyYW1lX2gpIFwKIAkkKHZheF90ZGVwX2gpICQoZ2RiX3N0cmluZ19oKQogdmF4LXRkZXAubzogdmF4LXRkZXAuYyAkKGRlZnNfaCkgJChhcmNoX3V0aWxzX2gpICQoZGlzX2FzbV9oKSBcCi0JJChmbG9hdF9mb3JtYXRfaCkkKGZyYW1lX2gpICQoZnJhbWVfYmFzZV9oKSAkKGZyYW1lX3Vud2luZF9oKSBcCisJJChmbG9hdF9mb3JtYXRfaCkgJChmcmFtZV9oKSAkKGZyYW1lX2Jhc2VfaCkgJChmcmFtZV91bndpbmRfaCkgXAogCSQoZ2RiY29yZV9oKSAkKGdkYnR5cGVzX2gpICQob3NhYmlfaCkgJChyZWdjYWNoZV9oKSAkKHJlZ3NldF9oKSBcCiAJJCh0cmFkX2ZyYW1lX2gpICQodmFsdWVfaCkgJChnZGJfc3RyaW5nX2gpICQodmF4X3RkZXBfaCkKIHdpbjMyLW5hdC5vOiB3aW4zMi1uYXQuYyAkKGRlZnNfaCkgJChmcmFtZV9oKSAkKGluZmVyaW9yX2gpICQodGFyZ2V0X2gpIFwKIAkkKGV4Y2VwdGlvbnNfaCkgJChnZGJjb3JlX2gpICQoY29tbWFuZF9oKSAkKGNvbXBsZXRlcl9oKSBcCiAJJChyZWdjYWNoZV9oKSAkKHRvcF9oKSAkKGJ1aWxkc3ltX2gpICQoc3ltZmlsZV9oKSAkKG9iamZpbGVzX2gpIFwKLQkkKGdkYl9zdHJpbmdfaCkgJChnZGJ0aHJlYWRfaCkgJChnZGJjbWRfaCkgJChleGVjX2gpICQoaTM4Nl90ZGVwX2gpIFwKLQkkKGkzODdfdGRlcF9oKQorCSQoZ2RiX3N0cmluZ19oKSAkKGdkYnRocmVhZF9oKSAkKGdkYmNtZF9oKSAkKGV4ZWNfaCkgJChzb2xpc3RfaCkgXAorCSQoc29saWJfaCkgJChpMzg2X3RkZXBfaCkgJChpMzg3X3RkZXBfaCkKIHdpbmNlLm86IHdpbmNlLmMgJChkZWZzX2gpICQoZnJhbWVfaCkgJChpbmZlcmlvcl9oKSAkKHRhcmdldF9oKSBcCiAJJChleGNlcHRpb25zX2gpICQoZ2RiY29yZV9oKSAkKGNvbW1hbmRfaCkgJChidWlsZHN5bV9oKSAkKHN5bWZpbGVfaCkgXAogCSQob2JqZmlsZXNfaCkgJChnZGJfc3RyaW5nX2gpICQoZ2RidGhyZWFkX2gpICQoZ2RiY21kX2gpIFwKQEAgLTI4MTksOCArMjgyNyw4IEBACiAJJCh0dWlfaCkKIAkkKENDKSAtYyAkKElOVEVSTkFMX0NGTEFHUykgJChzcmNkaXIpL2NsaS9jbGktY21kcy5jCiBjbGktZGVjb2RlLm86ICQoc3JjZGlyKS9jbGkvY2xpLWRlY29kZS5jICQoZGVmc19oKSAkKHN5bXRhYl9oKSBcCi0JJChnZGJfcmVnZXhfaCkgJChnZGJfc3RyaW5nX2gpICQodWlfb3V0X2gpICQoY2xpX2NtZHNfaCkgXAotCSQoY2xpX2RlY29kZV9oKSAkKHR1aV9oKSAkKGdkYl9hc3NlcnRfaCkKKwkkKGdkYl9yZWdleF9oKSAkKGdkYl9zdHJpbmdfaCkgJChjb21wbGV0ZXJfaCkgJCh1aV9vdXRfaCkgXAorCSQoY2xpX2NtZHNfaCkgJChjbGlfZGVjb2RlX2gpICQodHVpX2gpICQoZ2RiX2Fzc2VydF9oKQogCSQoQ0MpIC1jICQoSU5URVJOQUxfQ0ZMQUdTKSAkKHNyY2RpcikvY2xpL2NsaS1kZWNvZGUuYwogY2xpLWR1bXAubzogJChzcmNkaXIpL2NsaS9jbGktZHVtcC5jICQoZGVmc19oKSAkKGdkYl9zdHJpbmdfaCkgXAogCSQoY2xpX2RlY29kZV9oKSAkKGNsaV9jbWRzX2gpICQodmFsdWVfaCkgJChjb21wbGV0ZXJfaCkgXApAQCAtMzA1MCw3ICszMDU4LDcgQEAKIG1pLXN5bWJvbC1jbWRzLm86ICQoc3JjZGlyKS9taS9taS1zeW1ib2wtY21kcy5jICQoZGVmc19oKSAkKG1pX2NtZHNfaCkgXAogCSQoc3ltdGFiX2gpICQodWlfb3V0X2gpCiAJJChDQykgLWMgJChJTlRFUk5BTF9DRkxBR1MpICQoc3JjZGlyKS9taS9taS1zeW1ib2wtY21kcy5jCi1taS1jb21tb24ubzogJChzcmNkaXIpL21pL21pLWNvbW1vbi5jICQobWlfY29tbW9uX2gpCittaS1jb21tb24ubzogJChzcmNkaXIpL21pL21pLWNvbW1vbi5jICQoZGVmc19oKSAkKG1pX2NvbW1vbl9oKQogCSQoQ0MpIC1jICQoSU5URVJOQUxfQ0ZMQUdTKSAkKHNyY2RpcikvbWkvbWktY29tbW9uLmMKIAogIwpAQCAtMzA5OSw3ICszMTA3LDggQEAKIAkkKENDKSAtYyAkKElOVEVSTkFMX0NGTEFHUykgJChzcmNkaXIpL3R1aS90dWktaG9va3MuYwogdHVpLWludGVycC5vOiAkKHNyY2RpcikvdHVpL3R1aS1pbnRlcnAuYyAkKGRlZnNfaCkgJChpbnRlcnBzX2gpICQodG9wX2gpIFwKIAkkKGV2ZW50X3RvcF9oKSAkKGV2ZW50X2xvb3BfaCkgJCh1aV9vdXRfaCkgJChjbGlfb3V0X2gpIFwKLQkkKHR1aV9kYXRhX2gpICQocmVhZGxpbmVfaCkgJCh0dWlfd2luX2gpICQodHVpX2gpICQodHVpX2lvX2gpCisJJCh0dWlfZGF0YV9oKSAkKHJlYWRsaW5lX2gpICQodHVpX3dpbl9oKSAkKHR1aV9oKSAkKHR1aV9pb19oKSBcCisJJChleGNlcHRpb25zX2gpCiAJJChDQykgLWMgJChJTlRFUk5BTF9DRkxBR1MpICQoc3JjZGlyKS90dWkvdHVpLWludGVycC5jCiB0dWktaW8ubzogJChzcmNkaXIpL3R1aS90dWktaW8uYyAkKGRlZnNfaCkgJCh0YXJnZXRfaCkgXAogCSQoZXZlbnRfbG9vcF9oKSAkKGV2ZW50X3RvcF9oKSAkKGNvbW1hbmRfaCkgJCh0b3BfaCkgJCh0dWlfaCkgXApkaWZmIC0tZ2l0IGEvZ2RiL2FscGhhLXRkZXAuYyBiL2dkYi9hbHBoYS10ZGVwLmMKaW5kZXggOTYwYjA1MS4uNDQ4MGIyMSAxMDA2NDQKLS0tIGEvZ2RiL2FscGhhLXRkZXAuYworKysgYi9nZGIvYWxwaGEtdGRlcC5jCkBAIC0xNDkzLDggKzE0OTMsNiBAQAogYWxwaGFfc29mdHdhcmVfc2luZ2xlX3N0ZXAgKGVudW0gdGFyZ2V0X3NpZ25hbCBzaWcsIGludCBpbnNlcnRfYnJlYWtwb2ludHNfcCkKIHsKICAgc3RhdGljIENPUkVfQUREUiBuZXh0X3BjOwotICB0eXBlZGVmIGNoYXIgYmluc25fcXVhbnR1bVtCUkVBS1BPSU5UX01BWF07Ci0gIHN0YXRpYyBiaW5zbl9xdWFudHVtIGJyZWFrX21lbTsKICAgQ09SRV9BRERSIHBjOwogCiAgIGlmIChpbnNlcnRfYnJlYWtwb2ludHNfcCkKQEAgLTE1MDIsMTEgKzE1MDAsMTEgQEAKICAgICAgIHBjID0gcmVhZF9wYyAoKTsKICAgICAgIG5leHRfcGMgPSBhbHBoYV9uZXh0X3BjIChwYyk7CiAKLSAgICAgIHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAobmV4dF9wYywgYnJlYWtfbWVtKTsKKyAgICAgIGluc2VydF9zaW5nbGVfc3RlcF9icmVha3BvaW50IChuZXh0X3BjKTsKICAgICB9CiAgIGVsc2UKICAgICB7Ci0gICAgICB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQgKG5leHRfcGMsIGJyZWFrX21lbSk7CisgICAgICByZW1vdmVfc2luZ2xlX3N0ZXBfYnJlYWtwb2ludHMgKCk7CiAgICAgICB3cml0ZV9wYyAobmV4dF9wYyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2RiL2FybS1saW51eC10ZGVwLmMgYi9nZGIvYXJtLWxpbnV4LXRkZXAuYwppbmRleCBiOGMwZDI1Li5jZWZkYTYyIDEwMDY0NAotLS0gYS9nZGIvYXJtLWxpbnV4LXRkZXAuYworKysgYi9nZGIvYXJtLWxpbnV4LXRkZXAuYwpAQCAtNzksOCArNzksOCBAQAogICAgaGlkZGVuIGJlaGluZCB0aGUgcmVnY2FjaGUgYWJzdHJhY3Rpb24uICAqLwogc3RhdGljIHZvaWQKIGFybV9saW51eF9leHRyYWN0X3JldHVybl92YWx1ZSAoc3RydWN0IHR5cGUgKnR5cGUsCi0JCQkJY2hhciByZWdidWZbXSwKLQkJCQljaGFyICp2YWxidWYpCisJCQkJZ2RiX2J5dGUgcmVnYnVmW10sCisJCQkJZ2RiX2J5dGUgKnZhbGJ1ZikKIHsKICAgLyogU2NvdHRCOiBUaGlzIG5lZWRzIHRvIGJlIGxvb2tlZCBhdCB0byBoYW5kbGUgdGhlIGRpZmZlcmVudAogICAgICBmbG9hdGluZyBwb2ludCBlbXVsYXRvcnMgb24gQVJNIEdOVS9MaW51eC4gIFJpZ2h0IG5vdyB0aGUgY29kZQpkaWZmIC0tZ2l0IGEvZ2RiL2FybS10ZGVwLmMgYi9nZGIvYXJtLXRkZXAuYwppbmRleCBjYjNjMjYxLi5hNWRhNTZjIDEwMDY0NAotLS0gYS9nZGIvYXJtLXRkZXAuYworKysgYi9nZGIvYXJtLXRkZXAuYwpAQCAtNDY2LDkgKzQ2Niw5IEBACiAJcHJvbG9ndWVfZW5kID0gc2FsLmVuZDsJCS8qIChwcm9iYWJseSBtZWFucyBubyBwcm9sb2d1ZSkgICovCiAgICAgfQogICBlbHNlCi0gICAgLyogV2UncmUgaW4gdGhlIGJvb25kb2NrczogYWxsb3cgZm9yIAotICAgICAgIDE2IHB1c2hlcywgYW4gYWRkLCBhbmQgIm12IGZwLHNwIi4gICovCi0gICAgcHJvbG9ndWVfZW5kID0gcHJvbG9ndWVfc3RhcnQgKyA0MDsKKyAgICAvKiBXZSdyZSBpbiB0aGUgYm9vbmRvY2tzOiB3ZSBoYXZlIG5vIGlkZWEgd2hlcmUgdGhlIHN0YXJ0IG9mIHRoZQorICAgICAgIGZ1bmN0aW9uIGlzLiAgKi8KKyAgICByZXR1cm47CiAKICAgcHJvbG9ndWVfZW5kID0gbWluIChwcm9sb2d1ZV9lbmQsIHByZXZfcGMpOwogCkBAIC0xODQ5LDE2ICsxODQ5LDE4IEBACiBzdGF0aWMgdm9pZAogYXJtX3NvZnR3YXJlX3NpbmdsZV9zdGVwIChlbnVtIHRhcmdldF9zaWduYWwgc2lnLCBpbnQgaW5zZXJ0X2JwdCkKIHsKLSAgc3RhdGljIGludCBuZXh0X3BjOwkJIC8qIFN0YXRlIGJldHdlZW4gc2V0dGluZyBhbmQgdW5zZXR0aW5nLiAgKi8KLSAgc3RhdGljIGNoYXIgYnJlYWtfbWVtW0JSRUFLUE9JTlRfTUFYXTsgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG1lbUBicHQgKi8KKyAgLyogTk9URTogVGhpcyBtYXkgaW5zZXJ0IHRoZSB3cm9uZyBicmVha3BvaW50IGluc3RydWN0aW9uIHdoZW4KKyAgICAgc2luZ2xlLXN0ZXBwaW5nIG92ZXIgYSBtb2RlLWNoYW5naW5nIGluc3RydWN0aW9uLCBpZiB0aGUKKyAgICAgQ1BTUiBoZXVyaXN0aWNzIGFyZSB1c2VkLiAgKi8KIAogICBpZiAoaW5zZXJ0X2JwdCkKICAgICB7Ci0gICAgICBuZXh0X3BjID0gYXJtX2dldF9uZXh0X3BjIChyZWFkX3JlZ2lzdGVyIChBUk1fUENfUkVHTlVNKSk7Ci0gICAgICB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKG5leHRfcGMsIGJyZWFrX21lbSk7CisgICAgICBDT1JFX0FERFIgbmV4dF9wYyA9IGFybV9nZXRfbmV4dF9wYyAocmVhZF9yZWdpc3RlciAoQVJNX1BDX1JFR05VTSkpOworCisgICAgICBpbnNlcnRfc2luZ2xlX3N0ZXBfYnJlYWtwb2ludCAobmV4dF9wYyk7CiAgICAgfQogICBlbHNlCi0gICAgdGFyZ2V0X3JlbW92ZV9icmVha3BvaW50IChuZXh0X3BjLCBicmVha19tZW0pOworICAgIHJlbW92ZV9zaW5nbGVfc3RlcF9icmVha3BvaW50cyAoKTsKIH0KIAogI2luY2x1ZGUgImJmZC1pbjIuaCIKZGlmZiAtLWdpdCBhL2dkYi9icmVha3BvaW50LmMgYi9nZGIvYnJlYWtwb2ludC5jCmluZGV4IDMxYjNiNGIuLjEzMGI2ODQgMTAwNjQ0Ci0tLSBhL2dkYi9icmVha3BvaW50LmMKKysrIGIvZ2RiL2JyZWFrcG9pbnQuYwpAQCAtNjYzLDE2ICs2NjMsMTAgQEAKICAgICAgIGNvbnRpbnVlOwogICAgIC8qIEFkZHJlc3NlcyBhbmQgbGVuZ3RoIG9mIHRoZSBwYXJ0IG9mIHRoZSBicmVha3BvaW50IHRoYXQKICAgICAgICB3ZSBuZWVkIHRvIGNvcHkuICAqLwotICAgIC8qIFhYWFggVGhlIG02OGssIHNoIGFuZCBoODMwMCBoYXZlIGRpZmZlcmVudCBsb2NhbCBhbmQgcmVtb3RlCi0gICAgICAgYnJlYWtwb2ludCB2YWx1ZXMuICBCUkVBS1BPSU5UX0ZST01fUEMgc3RpbGwgbWFuYWdlcyB0bwotICAgICAgIGNvcnJlY3RseSBkZXRlcm1pbmUgdGhlIGJyZWFrcG9pbnRzIG1lbW9yeSBhZGRyZXNzIGFuZCBzaXplCi0gICAgICAgZm9yIHRoZXNlIHRhcmdldHMuICovCi0gICAgYnBfYWRkciA9IGItPmFkZHJlc3M7Ci0gICAgYnBfc2l6ZSA9IDA7Ci0gICAgaWYgKEJSRUFLUE9JTlRfRlJPTV9QQyAoJmJwX2FkZHIsICZicF9zaXplKSA9PSBOVUxMKQotICAgICAgY29udGludWU7CisgICAgYnBfYWRkciA9IGItPnRhcmdldF9pbmZvLnBsYWNlZF9hZGRyZXNzOworICAgIGJwX3NpemUgPSBiLT50YXJnZXRfaW5mby5zaGFkb3dfbGVuOwogICAgIGlmIChicF9zaXplID09IDApCi0gICAgICAvKiBicCBpc24ndCB2YWxpZCAqLworICAgICAgLyogYnAgaXNuJ3QgdmFsaWQsIG9yIGRvZXNuJ3Qgc2hhZG93IG1lbW9yeS4gICovCiAgICAgICBjb250aW51ZTsKICAgICBpZiAoYnBfYWRkciArIGJwX3NpemUgPD0gbWVtYWRkcikKICAgICAgIC8qIFRoZSBicmVha3BvaW50IGlzIGVudGlyZWx5IGJlZm9yZSB0aGUgY2h1bmsgb2YgbWVtb3J5IHdlCkBAIC03MDMsNyArNjk3LDcgQEAKIAl9CiAKICAgICAgIG1lbWNweSAobXlhZGRyICsgYnBfYWRkciAtIG1lbWFkZHIsCi0JICAgICAgYi0+c2hhZG93X2NvbnRlbnRzICsgYnB0b2Zmc2V0LCBicF9zaXplKTsKKwkgICAgICBiLT50YXJnZXRfaW5mby5zaGFkb3dfY29udGVudHMgKyBicHRvZmZzZXQsIGJwX3NpemUpOwogCiAgICAgICBpZiAoYnBfYWRkciA+IG1lbWFkZHIpCiAJewpAQCAtNzkzLDYgKzc4NywxMCBAQAogICBpZiAoYnB0LT5pbnNlcnRlZCB8fCBicHQtPmR1cGxpY2F0ZSkKICAgICByZXR1cm4gMDsKIAorICAvKiBJbml0aWFsaXplIHRoZSB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLworICBtZW1zZXQgKCZicHQtPnRhcmdldF9pbmZvLCAwLCBzaXplb2YgKGJwdC0+dGFyZ2V0X2luZm8pKTsKKyAgYnB0LT50YXJnZXRfaW5mby5wbGFjZWRfYWRkcmVzcyA9IGJwdC0+YWRkcmVzczsKKwogICBpZiAoYnB0LT5sb2NfdHlwZSA9PSBicF9sb2Nfc29mdHdhcmVfYnJlYWtwb2ludAogICAgICAgfHwgYnB0LT5sb2NfdHlwZSA9PSBicF9sb2NfaGFyZHdhcmVfYnJlYWtwb2ludCkKICAgICB7CkBAIC04MDQsMTEgKzgwMiw5IEBACiAJICAvKiBObyBvdmVybGF5IGhhbmRsaW5nOiBqdXN0IHNldCB0aGUgYnJlYWtwb2ludC4gICovCiAKIAkgIGlmIChicHQtPmxvY190eXBlID09IGJwX2xvY19oYXJkd2FyZV9icmVha3BvaW50KQotCSAgICB2YWwgPSB0YXJnZXRfaW5zZXJ0X2h3X2JyZWFrcG9pbnQgKGJwdC0+YWRkcmVzcywgCi0JCQkJCSAgICAgICBicHQtPnNoYWRvd19jb250ZW50cyk7CisJICAgIHZhbCA9IHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludCAoJmJwdC0+dGFyZ2V0X2luZm8pOwogCSAgZWxzZQotCSAgICB2YWwgPSB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKGJwdC0+YWRkcmVzcywKLQkJCQkJICAgIGJwdC0+c2hhZG93X2NvbnRlbnRzKTsKKwkgICAgdmFsID0gdGFyZ2V0X2luc2VydF9icmVha3BvaW50ICgmYnB0LT50YXJnZXRfaW5mbyk7CiAJfQogICAgICAgZWxzZQogCXsKQEAgLTgyNyw3ICs4MjMsOSBAQAogCQkgIENPUkVfQUREUiBhZGRyID0gb3ZlcmxheV91bm1hcHBlZF9hZGRyZXNzIChicHQtPmFkZHJlc3MsCiAJCQkJCQkJICAgICBicHQtPnNlY3Rpb24pOwogCQkgIC8qIFNldCBhIHNvZnR3YXJlICh0cmFwKSBicmVha3BvaW50IGF0IHRoZSBMTUEuICAqLwotCQkgIHZhbCA9IHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgYnB0LT5zaGFkb3dfY29udGVudHMpOworCQkgIGJwdC0+b3ZlcmxheV90YXJnZXRfaW5mbyA9IGJwdC0+dGFyZ2V0X2luZm87CisJCSAgYnB0LT5vdmVybGF5X3RhcmdldF9pbmZvLnBsYWNlZF9hZGRyZXNzID0gYWRkcjsKKwkJICB2YWwgPSB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKCZicHQtPm92ZXJsYXlfdGFyZ2V0X2luZm8pOwogCQkgIGlmICh2YWwgIT0gMCkKIAkJICAgIGZwcmludGZfdW5maWx0ZXJlZCAodG1wX2Vycm9yX3N0cmVhbSwgCiAJCQkJCSJPdmVybGF5IGJyZWFrcG9pbnQgJWQgZmFpbGVkOiBpbiBST00/IiwgCkBAIC04MzksMTEgKzgzNyw5IEBACiAJICAgIHsKIAkgICAgICAvKiBZZXMuICBUaGlzIG92ZXJsYXkgc2VjdGlvbiBpcyBtYXBwZWQgaW50byBtZW1vcnkuICAqLwogCSAgICAgIGlmIChicHQtPmxvY190eXBlID09IGJwX2xvY19oYXJkd2FyZV9icmVha3BvaW50KQotCQl2YWwgPSB0YXJnZXRfaW5zZXJ0X2h3X2JyZWFrcG9pbnQgKGJwdC0+YWRkcmVzcywgCi0JCQkJCQkgICBicHQtPnNoYWRvd19jb250ZW50cyk7CisJCXZhbCA9IHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludCAoJmJwdC0+dGFyZ2V0X2luZm8pOwogCSAgICAgIGVsc2UKLQkJdmFsID0gdGFyZ2V0X2luc2VydF9icmVha3BvaW50IChicHQtPmFkZHJlc3MsCi0JCQkJCQlicHQtPnNoYWRvd19jb250ZW50cyk7CisJCXZhbCA9IHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoJmJwdC0+dGFyZ2V0X2luZm8pOwogCSAgICB9CiAJICBlbHNlCiAJICAgIHsKQEAgLTEwNDUsNyArMTA0MSw3IEBACiAgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgbXVzdCBoYXZlIGEgY2FsbGJhY2sgbWVjaGFuaXNtIGZvciBleGNlcHRpb24KIAkgZXZlbnRzIC0tIHdpdGggZysrIHN0eWxlIGVtYmVkZGVkIGxhYmVsIHN1cHBvcnQsIHdlIGluc2VydAogCSBvcmRpbmFyeSBicmVha3BvaW50cyBhbmQgbm90IGNhdGNocG9pbnRzLiAqLwotICAgICAgdmFsID0gdGFyZ2V0X2luc2VydF9icmVha3BvaW50IChicHQtPmFkZHJlc3MsIGJwdC0+c2hhZG93X2NvbnRlbnRzKTsKKyAgICAgIHZhbCA9IHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoJmJwdC0+dGFyZ2V0X2luZm8pOwogICAgICAgaWYgKHZhbCkKIAl7CiAJICAvKiBDb3VsZG4ndCBzZXQgYnJlYWtwb2ludCBmb3Igc29tZSByZWFzb24gKi8KQEAgLTEyNDAsOSArMTIzNiw5IEBACiAgICAgICB7CiAJcmVtb3ZlX2JyZWFrcG9pbnQgKGIsIG1hcmtfaW5zZXJ0ZWQpOwogCWlmIChiLT5sb2NfdHlwZSA9PSBicF9sb2NfaGFyZHdhcmVfYnJlYWtwb2ludCkKLQkgIHZhbCA9IHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludCAoYi0+YWRkcmVzcywgYi0+c2hhZG93X2NvbnRlbnRzKTsKKwkgIHZhbCA9IHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludCAoJmItPnRhcmdldF9pbmZvKTsKIAllbHNlCi0JICB2YWwgPSB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKGItPmFkZHJlc3MsIGItPnNoYWRvd19jb250ZW50cyk7CisJICB2YWwgPSB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKCZiLT50YXJnZXRfaW5mbyk7CiAJLyogRklYTUUgZHJvdy8yMDAzLTEwLTA3OiBUaGlzIGRvZXNuJ3QgaGFuZGxlIGFueSBvdGhlciBraW5kcyBvZgogCSAgIGJyZWFrcG9pbnRzLiAgSXQncyB3cm9uZyBmb3Igd2F0Y2hwb2ludHMsIGZvciBleGFtcGxlLiAgKi8KIAlpZiAodmFsICE9IDApCkBAIC0xNDQ2LDEwICsxNDQyLDkgQEAKIAkgIC8qIE5vIG92ZXJsYXkgaGFuZGxpbmc6IGp1c3QgcmVtb3ZlIHRoZSBicmVha3BvaW50LiAgKi8KIAogCSAgaWYgKGItPmxvY190eXBlID09IGJwX2xvY19oYXJkd2FyZV9icmVha3BvaW50KQotCSAgICB2YWwgPSB0YXJnZXRfcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKGItPmFkZHJlc3MsIAotCQkJCQkgICAgICAgYi0+c2hhZG93X2NvbnRlbnRzKTsKKwkgICAgdmFsID0gdGFyZ2V0X3JlbW92ZV9od19icmVha3BvaW50ICgmYi0+dGFyZ2V0X2luZm8pOwogCSAgZWxzZQotCSAgICB2YWwgPSB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQgKGItPmFkZHJlc3MsIGItPnNoYWRvd19jb250ZW50cyk7CisJICAgIHZhbCA9IHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAoJmItPnRhcmdldF9pbmZvKTsKIAl9CiAgICAgICBlbHNlCiAJewpAQCAtMTQ2MCwxNCArMTQ1NSwxMiBAQAogCQkvKiBZZXMgLS0gb3ZlcmxheSBldmVudCBzdXBwb3J0IGlzIG5vdCBhY3RpdmUsIHNvIHdlCiAJCSAgIHNob3VsZCBoYXZlIHNldCBhIGJyZWFrcG9pbnQgYXQgdGhlIExNQS4gIFJlbW92ZSBpdC4gIAogCQkqLwotCQlDT1JFX0FERFIgYWRkciA9IG92ZXJsYXlfdW5tYXBwZWRfYWRkcmVzcyAoYi0+YWRkcmVzcywgCi0JCQkJCQkJICAgYi0+c2VjdGlvbik7CiAJCS8qIElnbm9yZSBhbnkgZmFpbHVyZXM6IGlmIHRoZSBMTUEgaXMgaW4gUk9NLCB3ZSB3aWxsCiAJCSAgIGhhdmUgYWxyZWFkeSB3YXJuZWQgd2hlbiB3ZSBmYWlsZWQgdG8gaW5zZXJ0IGl0LiAgKi8KIAkJaWYgKGItPmxvY190eXBlID09IGJwX2xvY19oYXJkd2FyZV9icmVha3BvaW50KQotCQkgIHRhcmdldF9yZW1vdmVfaHdfYnJlYWtwb2ludCAoYWRkciwgYi0+c2hhZG93X2NvbnRlbnRzKTsKKwkJICB0YXJnZXRfcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKCZiLT5vdmVybGF5X3RhcmdldF9pbmZvKTsKIAkJZWxzZQotCQkgIHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgYi0+c2hhZG93X2NvbnRlbnRzKTsKKwkJICB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQgKCZiLT5vdmVybGF5X3RhcmdldF9pbmZvKTsKIAkgICAgICB9CiAJICAvKiBEaWQgd2Ugc2V0IGEgYnJlYWtwb2ludCBhdCB0aGUgVk1BPyAKIAkgICAgIElmIHNvLCB3ZSB3aWxsIGhhdmUgbWFya2VkIHRoZSBicmVha3BvaW50ICdpbnNlcnRlZCcuICAqLwpAQCAtMTQ3OCwxMSArMTQ3MSw5IEBACiAJCSB1bm1hcHBlZCwgYnV0IGxldCdzIG5vdCByZWx5IG9uIHRoYXQgYmVpbmcgc2FmZS4gIFdlCiAJCSBkb24ndCBrbm93IHdoYXQgdGhlIG92ZXJsYXkgbWFuYWdlciBtaWdodCBkby4gICovCiAJICAgICAgaWYgKGItPmxvY190eXBlID09IGJwX2xvY19oYXJkd2FyZV9icmVha3BvaW50KQotCQl2YWwgPSB0YXJnZXRfcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKGItPmFkZHJlc3MsIAotCQkJCQkJICAgYi0+c2hhZG93X2NvbnRlbnRzKTsKKwkJdmFsID0gdGFyZ2V0X3JlbW92ZV9od19icmVha3BvaW50ICgmYi0+dGFyZ2V0X2luZm8pOwogCSAgICAgIGVsc2UKLQkJdmFsID0gdGFyZ2V0X3JlbW92ZV9icmVha3BvaW50IChiLT5hZGRyZXNzLAotCQkJCQkJYi0+c2hhZG93X2NvbnRlbnRzKTsKKwkJdmFsID0gdGFyZ2V0X3JlbW92ZV9icmVha3BvaW50ICgmYi0+dGFyZ2V0X2luZm8pOwogCSAgICB9CiAJICBlbHNlCiAJICAgIHsKQEAgLTE1NzAsOCArMTU2MSw3IEBACiAJICAgJiYgYnJlYWtwb2ludF9lbmFibGVkIChiLT5vd25lcikKIAkgICAmJiAhYi0+ZHVwbGljYXRlKQogICAgIHsKLQotICAgICAgdmFsID0gdGFyZ2V0X3JlbW92ZV9icmVha3BvaW50IChiLT5hZGRyZXNzLCBiLT5zaGFkb3dfY29udGVudHMpOworICAgICAgdmFsID0gdGFyZ2V0X3JlbW92ZV9icmVha3BvaW50ICgmYi0+dGFyZ2V0X2luZm8pOwogICAgICAgaWYgKHZhbCkKIAlyZXR1cm4gdmFsOwogICAgICAgYi0+aW5zZXJ0ZWQgPSAoaXMgPT0gbWFya19pbnNlcnRlZCk7CkBAIC0xNTgxLDggKzE1NzEsNyBAQAogCSAgICYmIGJyZWFrcG9pbnRfZW5hYmxlZCAoYi0+b3duZXIpCiAJICAgJiYgIWItPmR1cGxpY2F0ZSkKICAgICB7Ci0KLSAgICAgIHZhbCA9IHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAoYi0+YWRkcmVzcywgYi0+c2hhZG93X2NvbnRlbnRzKTsKKyAgICAgIHZhbCA9IHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAoJmItPnRhcmdldF9pbmZvKTsKICAgICAgIGlmICh2YWwpCiAJcmV0dXJuIHZhbDsKIApAQCAtNjg1MiwxMCArNjg0MSwxMiBAQAogCQkJICAgIF8oImFub3RoZXIgYnJlYWtwb2ludCB3YXMgaW5zZXJ0ZWQgb24gdG9wIG9mICIKIAkJCSAgICAiYSBwZXJtYW5lbnQgYnJlYWtwb2ludCIpKTsKIAorCSAgbWVtc2V0ICgmYi0+bG9jLT50YXJnZXRfaW5mbywgMCwgc2l6ZW9mIChiLT5sb2MtPnRhcmdldF9pbmZvKSk7CisJICBiLT5sb2MtPnRhcmdldF9pbmZvLnBsYWNlZF9hZGRyZXNzID0gYi0+bG9jLT5hZGRyZXNzOwogCSAgaWYgKGItPnR5cGUgPT0gYnBfaGFyZHdhcmVfYnJlYWtwb2ludCkKLQkgICAgdmFsID0gdGFyZ2V0X2luc2VydF9od19icmVha3BvaW50IChiLT5sb2MtPmFkZHJlc3MsIGItPmxvYy0+c2hhZG93X2NvbnRlbnRzKTsKKwkgICAgdmFsID0gdGFyZ2V0X2luc2VydF9od19icmVha3BvaW50ICgmYi0+bG9jLT50YXJnZXRfaW5mbyk7CiAJICBlbHNlCi0JICAgIHZhbCA9IHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoYi0+bG9jLT5hZGRyZXNzLCBiLT5sb2MtPnNoYWRvd19jb250ZW50cyk7CisJICAgIHZhbCA9IHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoJmItPmxvYy0+dGFyZ2V0X2luZm8pOwogCiAJICAvKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlIGluc2VydCwgcHJpbnQgYSBtZXNzYWdlLCB0aGVuIHN0b3AgZXhlY3V0aW9uLiAgKi8KIAkgIGlmICh2YWwgIT0gMCkKQEAgLTc2NTgsNiArNzY0OSw5NyBAQAogICAgIGVycm9yIChfKCJKdW5rIGF0IGVuZCBvZiBsaW5lIHNwZWNpZmljYXRpb246ICVzIiksIHN0cmluZyk7CiAgIHJldHVybiBzYWxzOwogfQorCisvKiBDcmVhdGUgYW5kIGluc2VydCBhIHJhdyBzb2Z0d2FyZSBicmVha3BvaW50IGF0IFBDLiAgUmV0dXJuIGFuCisgICBpZGVudGlmaWVyLCB3aGljaCBzaG91bGQgYmUgdXNlZCB0byByZW1vdmUgdGhlIGJyZWFrcG9pbnQgbGF0ZXIuCisgICBJbiBnZW5lcmFsLCBwbGFjZXMgd2hpY2ggY2FsbCB0aGlzIHNob3VsZCBiZSB1c2luZyBzb21ldGhpbmcgb24gdGhlCisgICBicmVha3BvaW50IGNoYWluIGluc3RlYWQ7IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGVsaW1pbmF0ZWQKKyAgIHNvbWVkYXkuICAqLworCit2b2lkICoKK2RlcHJlY2F0ZWRfaW5zZXJ0X3Jhd19icmVha3BvaW50IChDT1JFX0FERFIgcGMpCit7CisgIHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0OworCisgIGJwX3RndCA9IHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJwX3RhcmdldF9pbmZvKSk7CisgIG1lbXNldCAoYnBfdGd0LCAwLCBzaXplb2YgKHN0cnVjdCBicF90YXJnZXRfaW5mbykpOworCisgIGJwX3RndC0+cGxhY2VkX2FkZHJlc3MgPSBwYzsKKyAgaWYgKHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoYnBfdGd0KSAhPSAwKQorICAgIHsKKyAgICAgIC8qIENvdWxkIG5vdCBpbnNlcnQgdGhlIGJyZWFrcG9pbnQuICAqLworICAgICAgeGZyZWUgKGJwX3RndCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGJwX3RndDsKK30KKworLyogUmVtb3ZlIGEgYnJlYWtwb2ludCBCUCBpbnNlcnRlZCBieSBkZXByZWNhdGVkX2luc2VydF9yYXdfYnJlYWtwb2ludC4gICovCisKK2ludAorZGVwcmVjYXRlZF9yZW1vdmVfcmF3X2JyZWFrcG9pbnQgKHZvaWQgKmJwKQoreworICBzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCA9IGJwOworICBpbnQgcmV0OworCisgIHJldCA9IHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAoYnBfdGd0KTsKKyAgeGZyZWUgKGJwX3RndCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogT25lIChvciBwZXJoYXBzIHR3bykgYnJlYWtwb2ludHMgdXNlZCBmb3Igc29mdHdhcmUgc2luZ2xlIHN0ZXBwaW5nLiAgKi8KKworc3RhdGljIHZvaWQgKnNpbmdsZV9zdGVwX2JyZWFrcG9pbnRzWzJdOworCisvKiBDcmVhdGUgYW5kIGluc2VydCBhIGJyZWFrcG9pbnQgZm9yIHNvZnR3YXJlIHNpbmdsZSBzdGVwLiAgKi8KKwordm9pZAoraW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQgKENPUkVfQUREUiBuZXh0X3BjKQoreworICB2b2lkICoqYnB0X3A7CisKKyAgaWYgKHNpbmdsZV9zdGVwX2JyZWFrcG9pbnRzWzBdID09IE5VTEwpCisgICAgYnB0X3AgPSAmc2luZ2xlX3N0ZXBfYnJlYWtwb2ludHNbMF07CisgIGVsc2UKKyAgICB7CisgICAgICBnZGJfYXNzZXJ0IChzaW5nbGVfc3RlcF9icmVha3BvaW50c1sxXSA9PSBOVUxMKTsKKyAgICAgIGJwdF9wID0gJnNpbmdsZV9zdGVwX2JyZWFrcG9pbnRzWzFdOworICAgIH0KKworICAvKiBOT1RFIGRyb3cvMjAwNi0wNC0xMTogQSBmdXR1cmUgaW1wcm92ZW1lbnQgdG8gdGhpcyBmdW5jdGlvbiB3b3VsZCBiZQorICAgICB0byBvbmx5IGNyZWF0ZSB0aGUgYnJlYWtwb2ludHMgb25jZSwgYW5kIGFjdHVhbGx5IHB1dCB0aGVtIG9uIHRoZQorICAgICBicmVha3BvaW50IGNoYWluLiAgVGhhdCB3b3VsZCBsZXQgdXMgdXNlIHNldF9yYXdfYnJlYWtwb2ludC4gIFdlIGNvdWxkCisgICAgIGFkanVzdCB0aGUgYWRkcmVzc2VzIGVhY2ggdGltZSB0aGV5IHdlcmUgbmVlZGVkLiAgRG9pbmcgdGhpcyByZXF1aXJlcworICAgICBjb3JyZXNwb25kaW5nIGNoYW5nZXMgZWxzZXdoZXJlIHdoZXJlIHNpbmdsZSBzdGVwIGJyZWFrcG9pbnRzIGFyZQorICAgICBoYW5kbGVkLCBob3dldmVyLiAgU28sIGZvciBub3csIHdlIHVzZSB0aGlzLiAgKi8KKworICAqYnB0X3AgPSBkZXByZWNhdGVkX2luc2VydF9yYXdfYnJlYWtwb2ludCAobmV4dF9wYyk7CisgIGlmICgqYnB0X3AgPT0gTlVMTCkKKyAgICB3YXJuaW5nIChfKCJDb3VsZCBub3QgaW5zZXJ0IHNpbmdsZS1zdGVwIGJyZWFrcG9pbnQgYXQgMHglcyIpLAorCSAgICAgcGFkZHJfbnogKG5leHRfcGMpKTsKK30KKworLyogUmVtb3ZlIGFuZCBkZWxldGUgYW55IGJyZWFrcG9pbnRzIHVzZWQgZm9yIHNvZnR3YXJlIHNpbmdsZSBzdGVwLiAgKi8KKwordm9pZAorcmVtb3ZlX3NpbmdsZV9zdGVwX2JyZWFrcG9pbnRzICh2b2lkKQoreworICBnZGJfYXNzZXJ0IChzaW5nbGVfc3RlcF9icmVha3BvaW50c1swXSAhPSBOVUxMKTsKKworICAvKiBTZWUgaW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQgZm9yIG1vcmUgYWJvdXQgdGhpcyBkZXByZWNhdGVkCisgICAgIGNhbGwuICAqLworICBkZXByZWNhdGVkX3JlbW92ZV9yYXdfYnJlYWtwb2ludCAoc2luZ2xlX3N0ZXBfYnJlYWtwb2ludHNbMF0pOworICBzaW5nbGVfc3RlcF9icmVha3BvaW50c1swXSA9IE5VTEw7CisKKyAgaWYgKHNpbmdsZV9zdGVwX2JyZWFrcG9pbnRzWzFdICE9IE5VTEwpCisgICAgeworICAgICAgZGVwcmVjYXRlZF9yZW1vdmVfcmF3X2JyZWFrcG9pbnQgKHNpbmdsZV9zdGVwX2JyZWFrcG9pbnRzWzFdKTsKKyAgICAgIHNpbmdsZV9zdGVwX2JyZWFrcG9pbnRzWzFdID0gTlVMTDsKKyAgICB9Cit9CisKIAwKIC8qIFRoaXMgaGVscCBzdHJpbmcgaXMgdXNlZCBmb3IgdGhlIGJyZWFrLCBoYnJlYWssIHRicmVhayBhbmQgdGhicmVhayBjb21tYW5kcy4KICAgIEl0IGlzIGRlZmluZWQgYXMgYSBtYWNybyB0byBwcmV2ZW50IGR1cGxpY2F0aW9uLgpAQCAtNzgxMyw2ICs3ODk1LDcgQEAKIFRoZSBcInVuc2V0XCIgY29tbWFuZCBpcyBhbHNvIGFuIGFsaWFzIGZvciBcImRlbGV0ZVwiLiIpLAogCQkgICZkZWxldGVsaXN0LCAiZGVsZXRlICIsIDEsICZjbWRsaXN0KTsKICAgYWRkX2NvbV9hbGlhcyAoImQiLCAiZGVsZXRlIiwgY2xhc3NfYnJlYWtwb2ludCwgMSk7CisgIGFkZF9jb21fYWxpYXMgKCJkZWwiLCAiZGVsZXRlIiwgY2xhc3NfYnJlYWtwb2ludCwgMSk7CiAgIGlmICh4ZGJfY29tbWFuZHMpCiAgICAgYWRkX2NvbSAoImRiIiwgY2xhc3NfYnJlYWtwb2ludCwgZGVsZXRlX2NvbW1hbmQsIF8oIlwKIERlbGV0ZSBzb21lIGJyZWFrcG9pbnRzLlxuXApkaWZmIC0tZ2l0IGEvZ2RiL2JyZWFrcG9pbnQuaCBiL2dkYi9icmVha3BvaW50LmgKaW5kZXggZDFlMmZkOC4uNjA3ZmQ3NyAxMDA2NDQKLS0tIGEvZ2RiL2JyZWFrcG9pbnQuaAorKysgYi9nZGIvYnJlYWtwb2ludC5oCkBAIC0xODUsNiArMTg1LDM2IEBACiAgICAgaHdfZXhlY3V0ZSA9IDMJCS8qIEV4ZWN1dGUgSFcgYnJlYWtwb2ludCAqLwogICB9OwogCisKKy8qIEluZm9ybWF0aW9uIHVzZWQgYnkgdGFyZ2V0cyB0byBpbnNlcnQgYW5kIHJlbW92ZSBicmVha3BvaW50cy4gICovCisKK3N0cnVjdCBicF90YXJnZXRfaW5mbworeworICAvKiBBZGRyZXNzIGF0IHdoaWNoIHRoZSBicmVha3BvaW50IHdhcyBwbGFjZWQuICBUaGlzIGlzIG5vcm1hbGx5IHRoZQorICAgICBzYW1lIGFzIEFERFJFU1MgZnJvbSB0aGUgYnBfbG9jYXRpb24sIGV4Y2VwdCB3aGVuIGFkanVzdG1lbnQKKyAgICAgaGFwcGVucyBpbiBCUkVBS1BPSU5UX0ZST01fUEMuICBUaGUgbW9zdCBjb21tb24gZm9ybSBvZgorICAgICBhZGp1c3RtZW50IGlzIHN0cmlwcGluZyBhbiBhbHRlcm5hdGUgSVNBIG1hcmtlciBmcm9tIHRoZSBQQyB3aGljaAorICAgICBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBicmVha3BvaW50IHRvIGluc2VydC4gICovCisgIENPUkVfQUREUiBwbGFjZWRfYWRkcmVzczsKKworICAvKiBJZiB0aGUgYnJlYWtwb2ludCBsaXZlcyBpbiBtZW1vcnkgYW5kIHJlYWRpbmcgdGhhdCBtZW1vcnkgd291bGQKKyAgICAgZ2l2ZSBiYWNrIHRoZSBicmVha3BvaW50LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBjb250ZW50cywgdGhlbgorICAgICB0aGUgb3JpZ2luYWwgY29udGVudHMgYXJlIGNhY2hlZCBoZXJlLiAgT25seSBTSEFET1dfTEVOIGJ5dGVzIG9mCisgICAgIHRoaXMgYnVmZmVyIGFyZSB2YWxpZCwgYW5kIG9ubHkgd2hlbiB0aGUgYnJlYWtwb2ludCBpcyBpbnNlcnRlZC4gICovCisgIGdkYl9ieXRlIHNoYWRvd19jb250ZW50c1tCUkVBS1BPSU5UX01BWF07CisKKyAgLyogVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBjYWNoZWQgaW4gU0hBRE9XX0NPTlRFTlRTLiAgKi8KKyAgaW50IHNoYWRvd19sZW47CisKKyAgLyogVGhlIHNpemUgb2YgdGhlIHBsYWNlZCBicmVha3BvaW50LCBhY2NvcmRpbmcgdG8KKyAgICAgQlJFQUtQT0lOVF9GUk9NX1BDLCB3aGVuIHRoZSBicmVha3BvaW50IHdhcyBpbnNlcnRlZC4gIFRoaXMgaXMKKyAgICAgZ2VuZXJhbGx5IHRoZSBzYW1lIGFzIFNIQURPV19MRU4sIHVubGVzcyB3ZSBkaWQgbm90IG5lZWQKKyAgICAgdG8gcmVhZCBmcm9tIHRoZSB0YXJnZXQgdG8gaW1wbGVtZW50IHRoZSBtZW1vcnkgYnJlYWtwb2ludAorICAgICAoZS5nLiBpZiBhIHJlbW90ZSBzdHViIGhhbmRsZWQgdGhlIGRldGFpbHMpLiAgV2UgbWF5IHN0aWxsCisgICAgIG5lZWQgdGhlIHNpemUgdG8gcmVtb3ZlIHRoZSBicmVha3BvaW50IHNhZmVseS4gICovCisgIGludCBwbGFjZWRfc2l6ZTsKK307CisKIC8qIEdEQiBtYWludGFpbnMgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggYnJlYWtwb2ludCAob3IKICAgIHdhdGNocG9pbnQsIG9yIG90aGVyIHJlbGF0ZWQgZXZlbnQpLiAgVGhlIGZpcnN0IHR5cGUgY29ycmVzcG9uZHMKICAgIHRvIHN0cnVjdCBicmVha3BvaW50OyB0aGlzIGlzIGEgcmVsYXRpdmVseSBoaWdoLWxldmVsIHN0cnVjdHVyZQpAQCAtMjQyLDEzICsyNzIsNiBAQAogICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MuICBVc2VkIHByaW1hcmlseSBmb3Igb3ZlcmxheSBkZWJ1Z2dpbmcuICAqLwogICBhc2VjdGlvbiAqc2VjdGlvbjsKIAotICAvKiAiUmVhbCIgY29udGVudHMgb2YgYnl0ZSB3aGVyZSBicmVha3BvaW50IGhhcyBiZWVuIGluc2VydGVkLgotICAgICBWYWxpZCBvbmx5IHdoZW4gYnJlYWtwb2ludHMgYXJlIGluIHRoZSBwcm9ncmFtLiAgVW5kZXIgdGhlIGNvbXBsZXRlCi0gICAgIGNvbnRyb2wgb2YgdGhlIHRhcmdldCBpbnNlcnRfYnJlYWtwb2ludCBhbmQgcmVtb3ZlX2JyZWFrcG9pbnQgcm91dGluZXMuCi0gICAgIE5vIG90aGVyIGNvZGUgc2hvdWxkIGFzc3VtZSBhbnl0aGluZyBhYm91dCB0aGUgdmFsdWUocykgaGVyZS4KLSAgICAgVmFsaWQgb25seSBmb3IgYnBfbG9jX3NvZnR3YXJlX2JyZWFrcG9pbnQuICAqLwotICBnZGJfYnl0ZSBzaGFkb3dfY29udGVudHNbQlJFQUtQT0lOVF9NQVhdOwotCiAgIC8qIEFkZHJlc3MgYXQgd2hpY2ggYnJlYWtwb2ludCB3YXMgcmVxdWVzdGVkLCBlaXRoZXIgYnkgdGhlIHVzZXIgb3IKICAgICAgYnkgR0RCIGZvciBpbnRlcm5hbCBicmVha3BvaW50cy4gIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHRoZSBzYW1lCiAgICAgIGFzIGBgYWRkcmVzcycnIChhYm92ZSkgZXhjZXB0IGZvciBjYXNlcyBpbiB3aGljaApAQCAtMjU2LDYgKzI3OSwxMiBAQAogICAgICB3aGljaCB0byBwbGFjZSB0aGUgYnJlYWtwb2ludCBpbiBvcmRlciB0byBjb21wbHkgd2l0aCBhCiAgICAgIHByb2Nlc3NvcidzIGFyY2hpdGVjdHVhbCBjb25zdHJhaW50cy4gICovCiAgIENPUkVfQUREUiByZXF1ZXN0ZWRfYWRkcmVzczsKKworICAvKiBEZXRhaWxzIG9mIHRoZSBwbGFjZWQgYnJlYWtwb2ludCwgd2hlbiBpbnNlcnRlZC4gICovCisgIHN0cnVjdCBicF90YXJnZXRfaW5mbyB0YXJnZXRfaW5mbzsKKworICAvKiBTaW1pbGFybHksIGZvciB0aGUgYnJlYWtwb2ludCBhdCBhbiBvdmVybGF5J3MgTE1BLCBpZiBuZWNlc3NhcnkuICAqLworICBzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gb3ZlcmxheV90YXJnZXRfaW5mbzsKIH07CiAKIC8qIFRoaXMgc3RydWN0dXJlIGlzIGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVycyB0aGF0LCBpZiBhdmFpbGFibGUsCkBAIC03OTYsNiArODI1LDE2IEBACiAgICByZW1vdmUgZmFpbHMuICovCiBleHRlcm4gaW50IHJlbW92ZV9od193YXRjaHBvaW50cyAodm9pZCk7CiAKKy8qIE1hbmFnZSBhIHNvZnR3YXJlIHNpbmdsZSBzdGVwIGJyZWFrcG9pbnQgKG9yIHR3bykuICBJbnNlcnQgbWF5IGJlIGNhbGxlZAorICAgdHdpY2UgYmVmb3JlIHJlbW92ZSBpcyBjYWxsZWQuICAqLworZXh0ZXJuIHZvaWQgaW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQgKENPUkVfQUREUik7CitleHRlcm4gdm9pZCByZW1vdmVfc2luZ2xlX3N0ZXBfYnJlYWtwb2ludHMgKHZvaWQpOworCisvKiBNYW5hZ2UgbWFudWFsIGJyZWFrcG9pbnRzLCBzZXBhcmF0ZSBmcm9tIHRoZSBub3JtYWwgY2hhaW4gb2YKKyAgIGJyZWFrcG9pbnRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGluIG11cmt5IHRhcmdldC1zcGVjaWZpYworICAgd2F5cy4gIFBsZWFzZSBkbyBub3QgYWRkIG1vcmUgdXNlcyEgICovCitleHRlcm4gdm9pZCAqZGVwcmVjYXRlZF9pbnNlcnRfcmF3X2JyZWFrcG9pbnQgKENPUkVfQUREUik7CitleHRlcm4gaW50IGRlcHJlY2F0ZWRfcmVtb3ZlX3Jhd19icmVha3BvaW50ICh2b2lkICopOwogCiAvKiBJbmRpY2F0b3Igb2Ygd2hldGhlciBleGNlcHRpb24gY2F0Y2hwb2ludHMgc2hvdWxkIGJlIG51a2VkIGJldHdlZW4KICAgIHJ1bnMgb2YgYSBwcm9ncmFtLiAgKi8KZGlmZiAtLWdpdCBhL2dkYi9jbGkvY2xpLXNjcmlwdC5jIGIvZ2RiL2NsaS9jbGktc2NyaXB0LmMKaW5kZXggYjhlOWQ0Zi4uNGY0NDQ3NyAxMDA2NDQKLS0tIGEvZ2RiL2NsaS9jbGktc2NyaXB0LmMKKysrIGIvZ2RiL2NsaS9jbGktc2NyaXB0LmMKQEAgLTU0LDYgKzU0LDkgQEAKIHN0cnVjdCB1c2VyX2FyZ3MKICAgewogICAgIHN0cnVjdCB1c2VyX2FyZ3MgKm5leHQ7CisgICAgLyogSXQgaXMgbmVjZXNzYXJ5IHRvIHN0b3JlIGEgbWFsbG9jZWQgY29weSBvZiB0aGUgY29tbWFuZCBsaW5lIHRvCisgICAgICAgZW5zdXJlIHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUgbm90IG92ZXJ3cml0dGVuIGJlZm9yZSB0aGV5IGFyZSB1c2VkLiAgKi8KKyAgICBjaGFyICpjb21tYW5kOwogICAgIHN0cnVjdAogICAgICAgewogCWNoYXIgKmFyZzsKQEAgLTQ4Myw2ICs0ODYsNyBAQAogCQkgICAgXygiYXJnX2NsZWFudXAgY2FsbGVkIHdpdGggbm8gdXNlciBhcmdzLlxuIikpOwogCiAgIHVzZXJfYXJncyA9IHVzZXJfYXJncy0+bmV4dDsKKyAgeGZyZWUgKG9hcmdzLT5jb21tYW5kKTsKICAgeGZyZWUgKG9hcmdzKTsKIH0KIApAQCAtNTA3LDYgKzUxMSw4IEBACiAgIGlmIChwID09IE5VTEwpCiAgICAgcmV0dXJuIG9sZF9jaGFpbjsKIAorICB1c2VyX2FyZ3MtPmNvbW1hbmQgPSBwID0geHN0cmR1cCAocCk7CisKICAgd2hpbGUgKCpwKQogICAgIHsKICAgICAgIGNoYXIgKnN0YXJ0X2FyZzsKQEAgLTU5Myw2ICs1OTksMTEgQEAKICAgY2hhciAqcCwgKnNhdmVfbGluZSwgKm5ld19saW5lOwogICB1bnNpZ25lZCBsZW4sIGk7CiAKKyAgLyogSWYgd2UgYXJlIG5vdCBpbiBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiwgdHJlYXQgJGFyZ2MsICRhcmcwLCBldAorICAgICBjZXRlcmEgYXMgbm9ybWFsIGNvbnZlbmllbmNlIHZhcmlhYmxlcy4gICovCisgIGlmICh1c2VyX2FyZ3MgPT0gTlVMTCkKKyAgICByZXR1cm4geHN0cmR1cCAobGluZSk7CisKICAgLyogRmlyc3Qgd2UgbmVlZCB0byBrbm93IGhvdyBtdWNoIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgdGhlIG5ldyBsaW5lLiAgKi8KICAgc2F2ZV9saW5lID0gbGluZTsKICAgbGVuID0gMDsKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2LmggYi9nZGIvY29uZmlnL2kzODYvbm0taTM4Ni5oCmluZGV4IDI2NWM4ZTAuLjI2MjE1ZWIgMTAwNjQ0Ci0tLSBhL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2LmgKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L25tLWkzODYuaApAQCAtNTIsMTMgKzUyLDE0IEBACiAgICB0cnVlLiAgT3RoZXJ3aXNlLCByZXR1cm4gZmFsc2UuICAqLwogZXh0ZXJuIGludCBpMzg2X3N0b3BwZWRfZGF0YV9hZGRyZXNzIChDT1JFX0FERFIgKik7CiAKLS8qIEluc2VydCBhIGhhcmR3YXJlLWFzc2lzdGVkIGJyZWFrcG9pbnQgYXQgYWRkcmVzcyBBRERSLiAgU0hBRE9XIGlzCi0gICB1bnVzZWQuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBFQlVTWSBvbiBmYWlsdXJlLiAgKi8KLWV4dGVybiBpbnQgaTM4Nl9pbnNlcnRfaHdfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIHZvaWQgKnNoYWRvdyk7CisvKiBJbnNlcnQgYSBoYXJkd2FyZS1hc3Npc3RlZCBicmVha3BvaW50IGF0IEJQX1RHVC0+cGxhY2VkX2FkZHJlc3MuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBFQlVTWSBvbiBmYWlsdXJlLiAgKi8KK3N0cnVjdCBicF90YXJnZXRfaW5mbzsKK2V4dGVybiBpbnQgaTM4Nl9pbnNlcnRfaHdfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpOwogCi0vKiBSZW1vdmUgYSBoYXJkd2FyZS1hc3Npc3RlZCBicmVha3BvaW50IGF0IGFkZHJlc3MgQUREUi4gIFNIQURPVyBpcwotICAgdW51c2VkLiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLiAgKi8KLWV4dGVybiBpbnQgIGkzODZfcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCB2b2lkICpzaGFkb3cpOworLyogUmVtb3ZlIGEgaGFyZHdhcmUtYXNzaXN0ZWQgYnJlYWtwb2ludCBhdCBCUF9UR1QtPnBsYWNlZF9hZGRyZXNzLgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4gICovCitleHRlcm4gaW50ICBpMzg2X3JlbW92ZV9od19icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCk7CiAKIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiBoYXJkd2FyZSB3YXRjaHBvaW50cyBvZiB0eXBlIFRZUEUgdGhhdCB3ZSBjYW4KICAgIHNldC4gIFZhbHVlIGlzIHBvc2l0aXZlIGlmIHdlIGNhbiBzZXQgQ05UIHdhdGNocG9pbnRzLCB6ZXJvIGlmCkBAIC0xMDUsMTEgKzEwNiwxMSBAQAogI2RlZmluZSB0YXJnZXRfcmVtb3ZlX3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSBcCiAgIGkzODZfcmVtb3ZlX3dhdGNocG9pbnQgKGFkZHIsIGxlbiwgdHlwZSkKIAotI2RlZmluZSB0YXJnZXRfaW5zZXJ0X2h3X2JyZWFrcG9pbnQoYWRkciwgc2hhZG93KSBcCi0gIGkzODZfaW5zZXJ0X2h3X2JyZWFrcG9pbnQgKGFkZHIsIHNoYWRvdykKKyNkZWZpbmUgdGFyZ2V0X2luc2VydF9od19icmVha3BvaW50KGJwX3RndCkgXAorICBpMzg2X2luc2VydF9od19icmVha3BvaW50IChicF90Z3QpCiAKLSNkZWZpbmUgdGFyZ2V0X3JlbW92ZV9od19icmVha3BvaW50KGFkZHIsIHNoYWRvdykgXAotICBpMzg2X3JlbW92ZV9od19icmVha3BvaW50IChhZGRyLCBzaGFkb3cpCisjZGVmaW5lIHRhcmdldF9yZW1vdmVfaHdfYnJlYWtwb2ludChicF90Z3QpIFwKKyAgaTM4Nl9yZW1vdmVfaHdfYnJlYWtwb2ludCAoYnBfdGd0KQogCiAvKiBjaGlsZF9wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgdXNlZCB0bwogICAgcmVzZXQgYWxsIGRlYnVnIHJlZ2lzdGVycyBieSBjYWxsaW5nIGkzODZfY2xlYW51cF9kcmVncyAoKS4gICovIApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wYS9saW51eC5taCBiL2dkYi9jb25maWcvcGEvbGludXgubWgKaW5kZXggYjAzNjJlNC4uODA2NmZmZiAxMDA2NDQKLS0tIGEvZ2RiL2NvbmZpZy9wYS9saW51eC5taAorKysgYi9nZGIvY29uZmlnL3BhL2xpbnV4Lm1oCkBAIC0yLDcgKzIsNyBAQAogWERFUEZJTEVTPQogTkFUX0ZJTEU9IG5tLWxpbnV4LmgKIE5BVERFUEZJTEVTPSBpbmYtcHRyYWNlLm8gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBnY29yZS5vIFwKLQljb3JlLXJlZ3NldC5vIGhwcGEtbGludXgtbmF0Lm8gXAotCXByb2Mtc2VydmljZS5vIGxpbnV4LXRocmVhZC1kYi5vIGxpbnV4LW5hdC5vIGxpbnV4LWZvcmsubworCWhwcGEtbGludXgtbmF0Lm8gcHJvYy1zZXJ2aWNlLm8gbGludXgtdGhyZWFkLWRiLm8gbGludXgtbmF0Lm8gXAorCWxpbnV4LWZvcmsubwogCiBMT0FETElCRVMgPSAtbGRsIC1yZHluYW1pYwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy9saW51eC5taCBiL2dkYi9jb25maWcvc3BhcmMvbGludXgubWgKaW5kZXggMDQ5NDM4MS4uYjY0MGE5MiAxMDA2NDQKLS0tIGEvZ2RiL2NvbmZpZy9zcGFyYy9saW51eC5taAorKysgYi9nZGIvY29uZmlnL3NwYXJjL2xpbnV4Lm1oCkBAIC0xLDYgKzEsNiBAQAogIyBIb3N0OiBHTlUvTGludXggU1BBUkMKIE5BVF9GSUxFPSBubS1saW51eC5oCi1OQVRERVBGSUxFUz0gc3BhcmMtbmF0Lm8gc3BhcmMtc29sMi1uYXQubyBzcGFyYy1saW51eC1uYXQubyBcCitOQVRERVBGSUxFUz0gc3BhcmMtbmF0Lm8gc3BhcmMtbGludXgtbmF0Lm8gXAogCWNvcmVsb3cubyBjb3JlLXJlZ3NldC5vIGZvcmstY2hpbGQubyBpbmYtcHRyYWNlLm8gXAogCXByb2Mtc2VydmljZS5vIGxpbnV4LXRocmVhZC1kYi5vIFwKIAlnY29yZS5vIGxpbnV4LW5hdC5vIGxpbnV4LWZvcmsubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy9saW51eDY0Lm1oIGIvZ2RiL2NvbmZpZy9zcGFyYy9saW51eDY0Lm1oCmluZGV4IDU5ZGZiZjAuLjE5NTk0MGMgMTAwNjQ0Ci0tLSBhL2dkYi9jb25maWcvc3BhcmMvbGludXg2NC5taAorKysgYi9nZGIvY29uZmlnL3NwYXJjL2xpbnV4NjQubWgKQEAgLTEsNiArMSw2IEBACiAjIEhvc3Q6IEdOVS9MaW51eCBVbHRyYVNQQVJDCiBOQVRfRklMRT0gbm0tbGludXguaAotTkFUREVQRklMRVM9IHNwYXJjLW5hdC5vIHNwYXJjNjQtbmF0Lm8gc3BhcmMtc29sMi1uYXQubyBzcGFyYzY0LWxpbnV4LW5hdC5vIFwKK05BVERFUEZJTEVTPSBzcGFyYy1uYXQubyBzcGFyYzY0LW5hdC5vIHNwYXJjNjQtbGludXgtbmF0Lm8gXAogCWNvcmVsb3cubyBjb3JlLXJlZ3NldC5vIFwKIAlmb3JrLWNoaWxkLm8gaW5mLXB0cmFjZS5vIFwKIAlwcm9jLXNlcnZpY2UubyBsaW51eC10aHJlYWQtZGIubyBcCmRpZmYgLS1naXQgYS9nZGIvY29yZWxvdy5jIGIvZ2RiL2NvcmVsb3cuYwppbmRleCAyMjZiNDhiLi5mYTYxYmYzIDEwMDY0NAotLS0gYS9nZGIvY29yZWxvdy5jCisrKyBiL2dkYi9jb3JlbG93LmMKQEAgLTg2LDggKzg2LDYgQEAKIAogc3RhdGljIHZvaWQgYWRkX3RvX3RocmVhZF9saXN0IChiZmQgKiwgYXNlY3Rpb24gKiwgdm9pZCAqKTsKIAotc3RhdGljIGludCBpZ25vcmUgKENPUkVfQUREUiwgYmZkX2J5dGUgKik7Ci0KIHN0YXRpYyBpbnQgY29yZV9maWxlX3RocmVhZF9hbGl2ZSAocHRpZF90IHRpZCk7CiAKIHN0YXRpYyB2b2lkIGluaXRfY29yZV9vcHMgKHZvaWQpOwpAQCAtNjAzLDcgKzYwMSw3IEBACiAgICBgZ2RiIGludGVybmFsIGVycm9yJyAoc2luY2UgZ2VuZXJpY19tb3VybiBjYWxscyBicmVha3BvaW50X2luaXRfaW5mZXJpb3IpLiAgKi8KIAogc3RhdGljIGludAotaWdub3JlIChDT1JFX0FERFIgYWRkciwgYmZkX2J5dGUgKmNvbnRlbnRzKQoraWdub3JlIChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCkKIHsKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9nZGIvY3Jpcy10ZGVwLmMgYi9nZGIvY3Jpcy10ZGVwLmMKaW5kZXggMDY2NDMxOC4uNGUxNTQwZSAxMDA2NDQKLS0tIGEvZ2RiL2NyaXMtdGRlcC5jCisrKyBiL2dkYi9jcmlzLXRkZXAuYwpAQCAtNTU4LDE1ICs1NTgsNiBAQAogICBpbnQgICBkaXNhYmxlX2ludGVycnVwdDsKIH0gaW5zdF9lbnZfdHlwZTsKIAotLyogU2F2ZSBvbGQgYnJlYWtwb2ludHMgaW4gb3JkZXIgdG8gcmVzdG9yZSB0aGUgc3RhdGUgYmVmb3JlIGEgc2luZ2xlX3N0ZXAuIAotICAgQXQgbW9zdCwgdHdvIGJyZWFrcG9pbnRzIHdpbGwgaGF2ZSB0byBiZSByZW1lbWJlcmVkLiAgKi8KLXR5cGVkZWYgCi1jaGFyIGJpbnNuX3F1YW50dW1bQlJFQUtQT0lOVF9NQVhdOwotc3RhdGljIGJpbnNuX3F1YW50dW0gYnJlYWtfbWVtWzJdOwotc3RhdGljIENPUkVfQUREUiBuZXh0X3BjID0gMDsKLXN0YXRpYyBDT1JFX0FERFIgYnJhbmNoX3RhcmdldF9hZGRyZXNzID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJyYW5jaF9icmVha19pbnNlcnRlZCA9IDA7Ci0KIC8qIE1hY2hpbmUtZGVwZW5kZW5jaWVzIGluIENSSVMgZm9yIG9wY29kZXMuICAqLwogCiAvKiBJbnN0cnVjdGlvbiBzaXplcy4gICovCkBAIC0xODUyLDcgKzE4NDMsOCBAQAogCiBzdGF0aWMgdm9pZAogY3Jpc19kd2FyZjJfZnJhbWVfaW5pdF9yZWcgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLCBpbnQgcmVnbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkd2FyZjJfZnJhbWVfc3RhdGVfcmVnICpyZWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGR3YXJmMl9mcmFtZV9zdGF0ZV9yZWcgKnJlZywKKwkJCSAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqbmV4dF9mcmFtZSkKIHsKICAgLyogVGhlIHJldHVybiBhZGRyZXNzIGNvbHVtbi4gICovCiAgIGlmIChyZWdudW0gPT0gUENfUkVHTlVNKQpAQCAtMjEyOSw3ICsyMTIxLDcgQEAKIGNyaXNfc29mdHdhcmVfc2luZ2xlX3N0ZXAgKGVudW0gdGFyZ2V0X3NpZ25hbCBpZ25vcmUsIGludCBpbnNlcnRfYnJlYWtwb2ludHMpCiB7CiAgIGluc3RfZW52X3R5cGUgaW5zdF9lbnY7Ci0gIAorCiAgIGlmIChpbnNlcnRfYnJlYWtwb2ludHMpCiAgICAgewogICAgICAgLyogQW5hbHlzZSB0aGUgcHJlc2VudCBpbnN0cnVjdGlvbiBlbnZpcm9ubWVudCBhbmQgaW5zZXJ0IApAQCAtMjE0NSwyOCArMjEzNywxOSBAQAogICAgICAgICB7CiAgICAgICAgICAgLyogSW5zZXJ0IGF0IG1vc3QgdHdvIGJyZWFrcG9pbnRzLiAgT25lIGZvciB0aGUgbmV4dCBQQyBjb250ZW50CiAgICAgICAgICAgICAgYW5kIHBvc3NpYmx5IGFub3RoZXIgb25lIGZvciBhIGJyYW5jaCwganVtcCwgZXRjLiAgKi8KLSAgICAgICAgICBuZXh0X3BjID0gKENPUkVfQUREUikgaW5zdF9lbnYucmVnW1BDX1JFR05VTV07Ci0gICAgICAgICAgdGFyZ2V0X2luc2VydF9icmVha3BvaW50IChuZXh0X3BjLCBicmVha19tZW1bMF0pOworICAgICAgICAgIENPUkVfQUREUiBuZXh0X3BjID0gKENPUkVfQUREUikgaW5zdF9lbnYucmVnW1BDX1JFR05VTV07CisgICAgICAgICAgaW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQgKG5leHRfcGMpOwogICAgICAgICAgIGlmIChpbnN0X2Vudi5icmFuY2hfZm91bmQgCiAgICAgICAgICAgICAgICYmIChDT1JFX0FERFIpIGluc3RfZW52LmJyYW5jaF9icmVha19hZGRyZXNzICE9IG5leHRfcGMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJyYW5jaF90YXJnZXRfYWRkcmVzcyA9IAotICAgICAgICAgICAgICAgIChDT1JFX0FERFIpIGluc3RfZW52LmJyYW5jaF9icmVha19hZGRyZXNzOwotICAgICAgICAgICAgICB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKGJyYW5jaF90YXJnZXRfYWRkcmVzcywgYnJlYWtfbWVtWzFdKTsKLSAgICAgICAgICAgICAgYnJhbmNoX2JyZWFrX2luc2VydGVkID0gMTsKKyAgICAgICAgICAgICAgQ09SRV9BRERSIGJyYW5jaF90YXJnZXRfYWRkcmVzcworICAgICAgICAgICAgICAgID0gKENPUkVfQUREUikgaW5zdF9lbnYuYnJhbmNoX2JyZWFrX2FkZHJlc3M7CisgICAgICAgICAgICAgIGluc2VydF9zaW5nbGVfc3RlcF9icmVha3BvaW50IChicmFuY2hfdGFyZ2V0X2FkZHJlc3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICBlbHNlCi0gICAgewotICAgICAgLyogUmVtb3ZlIGJyZWFrcG9pbnRzLiAgKi8KLSAgICAgIHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAobmV4dF9wYywgYnJlYWtfbWVtWzBdKTsKLSAgICAgIGlmIChicmFuY2hfYnJlYWtfaW5zZXJ0ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQgKGJyYW5jaF90YXJnZXRfYWRkcmVzcywgYnJlYWtfbWVtWzFdKTsKLSAgICAgICAgICBicmFuY2hfYnJlYWtfaW5zZXJ0ZWQgPSAwOwotICAgICAgICB9Ci0gICAgfQorICAgIHJlbW92ZV9zaW5nbGVfc3RlcF9icmVha3BvaW50cyAoKTsKIH0KIAogLyogQ2FsY3VsYXRlcyB0aGUgcHJlZml4IHZhbHVlIGZvciBxdWljayBvZmZzZXQgYWRkcmVzc2luZyBtb2RlLiAgKi8KZGlmZiAtLWdpdCBhL2dkYi9kb2MvQ2hhbmdlTG9nIGIvZ2RiL2RvYy9DaGFuZ2VMb2cKaW5kZXggNDBjODAyMC4uNjZmZjlkNyAxMDA2NDQKLS0tIGEvZ2RiL2RvYy9DaGFuZ2VMb2cKKysrIGIvZ2RiL2RvYy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMyBAQAorMjAwNi0wNC0xOCAgRGFuaWVsIEphY29ib3dpdHogIDxkYW5AY29kZXNvdXJjZXJ5LmNvbT4KKworCSogZ2RiaW50LnRleGluZm8gKHg4NiBXYXRjaHBvaW50cywgVGFyZ2V0IENvbmRpdGlvbmFscyk6IFVwZGF0ZSBpbnNlcnQKKwlhbmQgcmVtb3ZlIGJyZWFrcG9pbnQgcHJvdG90eXBlcy4KKwkoV2F0Y2hwb2ludHMpOiBNb3ZlIGRlc2NyaXB0aW9uIG9mIHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludCBhbmQKKwl0YXJnZXRfcmVtb3ZlX2h3X2JyZWFrcG9pbnQgLi4uCisJKEJyZWFrcG9pbnRzKTogLi4uIHRvIGhlcmUuICBEb2N1bWVudCB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgYW5kCisJdGFyZ2V0X3JlbW92ZV9icmVha3BvaW50LgorCisyMDA2LTA0LTE3ICBKaW0gQmxhbmR5ICA8amltYkBjb2Rlc291cmNlcnkuY29tPgorCisJKiBnZGIudGV4aW5mbyAoUGFja2V0cyk6IE5vdGUgdGhhdCAnYWRkcicgYXJndW1lbnRzIHRvIHMsIFMsIGMsCisJYW5kIEMgcGFja2V0cyBhcmUgb3B0aW9uYWwuCisKKzIwMDYtMDQtMTQgIEZyZWRlcmljIFJpc3MgIDxmcmVkZXJpYy5yaXNzQHN0LmNvbT4KKworCSogZ2RiLnRleGluZm8gKFNwZWNpZnlpbmcgc291cmNlIGRpcmVjdG9yaWVzKTogVXBkYXRlIHRoZSBkZXNjcmlwdGlvbgorCW9mIHRoZSBzb3VyY2UgZmlsZSBzZWFyY2ggdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHRoZSBzb3VyY2UgcGF0aAorCWFsd2F5cyBjb250YWlucyBhdCBsZWFzdCAkY2RpciBhbmQgJGN3ZC4KKwogMjAwNi0wMy0zMSAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQHJlZGhhdC5jb20+CiAKIAkqIGdkYi50ZXhpbmZvOiBVcGRhdGUgY29weXJpZ2h0IGRhdGVzLgpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9nZGIudGV4aW5mbyBiL2dkYi9kb2MvZ2RiLnRleGluZm8KaW5kZXggNTk0NDVkMC4uNzkwYzU4ZCAxMDA2NDQKLS0tIGEvZ2RiL2RvYy9nZGIudGV4aW5mbworKysgYi9nZGIvZG9jL2dkYi50ZXhpbmZvCkBAIC01MDA1LDggKzUwMDUsNyBAQAogdGhhdC0tLUBmaWxley9tbnQvY3Jvc3MvZm9vLmN9LgogCiBOb3RlIHRoYXQgdGhlIGV4ZWN1dGFibGUgc2VhcmNoIHBhdGggaXMgQGVtcGh7bm90fSB1c2VkIHRvIGxvY2F0ZSB0aGUKLXNvdXJjZSBmaWxlcy4gIE5laXRoZXIgaXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIHVubGVzcyBpdAotaGFwcGVucyB0byBiZSBpbiB0aGUgc291cmNlIHBhdGguCitzb3VyY2UgZmlsZXMuCiAKIFdoZW5ldmVyIHlvdSByZXNldCBvciByZWFycmFuZ2UgdGhlIHNvdXJjZSBwYXRoLCBAdmFsdWV7R0RCTn0gY2xlYXJzIG91dAogYW55IGluZm9ybWF0aW9uIGl0IGhhcyBjYWNoZWQgYWJvdXQgd2hlcmUgc291cmNlIGZpbGVzIGFyZSBmb3VuZCBhbmQgd2hlcmUKQEAgLTUwNDgsNyArNTA0Nyw3IEBACiBkaXJlY3RvcnkgYXQgdGhlIHRpbWUgeW91IGFkZCBhbiBlbnRyeSB0byB0aGUgc291cmNlIHBhdGguCiAKIEBpdGVtIGRpcmVjdG9yeQotUmVzZXQgdGhlIHNvdXJjZSBwYXRoIHRvIGVtcHR5IGFnYWluLiAgVGhpcyByZXF1aXJlcyBjb25maXJtYXRpb24uCitSZXNldCB0aGUgc291cmNlIHBhdGggdG8gaXRzIGRlZmF1bHQgdmFsdWUgKEBzYW1weyRjZGlyOiRjd2R9IG9uIFVuaXggc3lzdGVtcykuICBUaGlzIHJlcXVpcmVzIGNvbmZpcm1hdGlvbi4KIAogQGMgUkVULXJlcGVhdCBmb3IgQGNvZGV7ZGlyZWN0b3J5fSBpcyBleHBsaWNpdGx5IGRpc2FibGVkLCBidXQgc2luY2UKIEBjIHJlcGVhdGluZyBpdCB3b3VsZCBiZSBhIG5vLW9wIHdlIGRvIG5vdCBzYXkgdGhhdC4gICh0aGFua3MgdG8gUk1TKQpAQCAtNTA2NCw3ICs1MDYzLDcgQEAKIAogQGVudW1lcmF0ZQogQGl0ZW0KLVVzZSBAY29kZXtkaXJlY3Rvcnl9IHdpdGggbm8gYXJndW1lbnQgdG8gcmVzZXQgdGhlIHNvdXJjZSBwYXRoIHRvIGVtcHR5LgorVXNlIEBjb2Rle2RpcmVjdG9yeX0gd2l0aCBubyBhcmd1bWVudCB0byByZXNldCB0aGUgc291cmNlIHBhdGggdG8gaXRzIGRlZmF1bHQgdmFsdWUuCiAKIEBpdGVtCiBVc2UgQGNvZGV7ZGlyZWN0b3J5fSB3aXRoIHN1aXRhYmxlIGFyZ3VtZW50cyB0byByZWluc3RhbGwgdGhlCkBAIC0yMjU1NSw3ICsyMjU1NCw3IEBACiBEb24ndCB1c2UgdGhpcyBwYWNrZXQuICBVc2UgdGhlIEBzYW1we1p9IGFuZCBAc2FtcHt6fSBwYWNrZXRzIGluc3RlYWQKIChAcHhyZWZ7aW5zZXJ0IGJyZWFrcG9pbnQgb3Igd2F0Y2hwb2ludCBwYWNrZXR9KS4KIAotQGl0ZW0gYyBAdmFye2FkZHJ9CitAaXRlbSBjIEBye1t9QHZhcnthZGRyfUBye119CiBAY2luZGV4IEBzYW1we2N9IHBhY2tldAogQ29udGludWUuICBAdmFye2FkZHJ9IGlzIGFkZHJlc3MgdG8gcmVzdW1lLiAgSWYgQHZhcnthZGRyfSBpcyBvbWl0dGVkLAogcmVzdW1lIGF0IGN1cnJlbnQgYWRkcmVzcy4KQEAgLTIyNTYzLDcgKzIyNTYyLDcgQEAKIFJlcGx5OgogQHhyZWZ7U3RvcCBSZXBseSBQYWNrZXRzfSwgZm9yIHRoZSByZXBseSBzcGVjaWZpY2F0aW9ucy4KIAotQGl0ZW0gQyBAdmFye3NpZ307QHZhcnthZGRyfQorQGl0ZW0gQyBAdmFye3NpZ31AcntbfTtAdmFye2FkZHJ9QHJ7XX0KIEBjaW5kZXggQHNhbXB7Q30gcGFja2V0CiBDb250aW51ZSB3aXRoIHNpZ25hbCBAdmFye3NpZ30gKGhleCBzaWduYWwgbnVtYmVyKS4gIElmCiBAc2FtcHs7QHZhcnthZGRyfX0gaXMgb21pdHRlZCwgcmVzdW1lIGF0IHNhbWUgYWRkcmVzcy4KQEAgLTIyNzY5LDcgKzIyNzY4LDcgQEAKIAogVGhlIEBzYW1we1J9IHBhY2tldCBoYXMgbm8gcmVwbHkuCiAKLUBpdGVtIHMgQHZhcnthZGRyfQorQGl0ZW0gcyBAcntbfUB2YXJ7YWRkcn1AcntdfQogQGNpbmRleCBAc2FtcHtzfSBwYWNrZXQKIFNpbmdsZSBzdGVwLiAgQHZhcnthZGRyfSBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0byByZXN1bWUuICBJZgogQHZhcnthZGRyfSBpcyBvbWl0dGVkLCByZXN1bWUgYXQgc2FtZSBhZGRyZXNzLgpAQCAtMjI3NzcsNyArMjI3NzYsNyBAQAogUmVwbHk6CiBAeHJlZntTdG9wIFJlcGx5IFBhY2tldHN9LCBmb3IgdGhlIHJlcGx5IHNwZWNpZmljYXRpb25zLgogCi1AaXRlbSBTIEB2YXJ7c2lnfTtAdmFye2FkZHJ9CitAaXRlbSBTIEB2YXJ7c2lnfUBye1t9O0B2YXJ7YWRkcn1AcntdfQogQGFuY2hvcntzdGVwIHdpdGggc2lnbmFsIHBhY2tldH0KIEBjaW5kZXggQHNhbXB7U30gcGFja2V0CiBTdGVwIHdpdGggc2lnbmFsLiAgVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlIEBzYW1we0N9IHBhY2tldCwgYnV0CmRpZmYgLS1naXQgYS9nZGIvZG9jL2dkYmludC50ZXhpbmZvIGIvZ2RiL2RvYy9nZGJpbnQudGV4aW5mbwppbmRleCBlMTRhYTJjLi5lMWQxNTU3IDEwMDY0NAotLS0gYS9nZGIvZG9jL2dkYmludC50ZXhpbmZvCisrKyBiL2dkYi9kb2MvZ2RiaW50LnRleGluZm8KQEAgLTUyNyw2ICs1MjcsNDcgQEAKIEJhc2ljIGJyZWFrcG9pbnQgb2JqZWN0IGhhbmRsaW5nIGlzIGluIEBmaWxle2JyZWFrcG9pbnQuY30uICBIb3dldmVyLAogbXVjaCBvZiB0aGUgaW50ZXJlc3RpbmcgYnJlYWtwb2ludCBhY3Rpb24gaXMgaW4gQGZpbGV7aW5mcnVuLmN9LgogCitAdGFibGUgQGNvZGUKK0BjaW5kZXggaW5zZXJ0IG9yIHJlbW92ZSBzb2Z0d2FyZSBicmVha3BvaW50CitAZmluZGV4IHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludAorQGZpbmRleCB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQKK0BpdGVtIHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAoQHZhcnticF90Z3R9KQorQGl0ZW14IHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoQHZhcnticF90Z3R9KQorSW5zZXJ0IG9yIHJlbW92ZSBhIHNvZnR3YXJlIGJyZWFrcG9pbnQgYXQgYWRkcmVzcworQGNvZGV7QHZhcnticF90Z3R9LT5wbGFjZWRfYWRkcmVzc30uICBSZXR1cm5zIHplcm8gZm9yIHN1Y2Nlc3MsCitub24temVybyBmb3IgZmFpbHVyZS4gIE9uIGlucHV0LCBAdmFye2JwX3RndH0gY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlCiticmVha3BvaW50LCBhbmQgaXMgb3RoZXJ3aXNlIGluaXRpYWxpemVkIHRvIHplcm8uICBUaGUgZmllbGRzIG9mIHRoZQorQGNvZGV7c3RydWN0IGJwX3RhcmdldF9pbmZvfSBwb2ludGVkIHRvIGJ5IEB2YXJ7YnBfdGd0fSBhcmUgdXBkYXRlZAordG8gY29udGFpbiBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYnJlYWtwb2ludCBvbiBvdXRwdXQuICBUaGUgZmllbGQKK0Bjb2Rle3BsYWNlZF9hZGRyZXNzfSBtYXkgYmUgdXBkYXRlZCBpZiB0aGUgYnJlYWtwb2ludCB3YXMgcGxhY2VkIGF0IGEKK3JlbGF0ZWQgYWRkcmVzczsgdGhlIGZpZWxkIEBjb2Rle3NoYWRvd19jb250ZW50c30gY29udGFpbnMgdGhlIHJlYWwKK2NvbnRlbnRzIG9mIHRoZSBieXRlcyB3aGVyZSB0aGUgYnJlYWtwb2ludCBoYXMgYmVlbiBpbnNlcnRlZCwKK2lmIHJlYWRpbmcgbWVtb3J5IHdvdWxkIHJldHVybiB0aGUgYnJlYWtwb2ludCBpbnN0ZWFkIG9mIHRoZQordW5kZXJseWluZyBtZW1vcnk7IHRoZSBmaWVsZCBAY29kZXtzaGFkb3dfbGVufSBpcyB0aGUgbGVuZ3RoIG9mCittZW1vcnkgY2FjaGVkIGluIEBjb2Rle3NoYWRvd19jb250ZW50c30sIGlmIGFueTsgYW5kIHRoZSBmaWVsZAorQGNvZGV7cGxhY2VkX3NpemV9IGlzIG9wdGlvbmFsbHkgc2V0IGFuZCB1c2VkIGJ5IHRoZSB0YXJnZXQsIGlmCitpdCBjb3VsZCBkaWZmZXIgZnJvbSBAY29kZXtzaGFkb3dfbGVufS4KKworRm9yIGV4YW1wbGUsIHRoZSByZW1vdGUgdGFyZ2V0IEBzYW1we1owfSBwYWNrZXQgZG9lcyBub3QgcmVxdWlyZQorc2hhZG93aW5nIG1lbW9yeSwgc28gQGNvZGV7c2hhZG93X2xlbn0gaXMgbGVmdCBhdCB6ZXJvLiAgSG93ZXZlciwKK3RoZSBsZW5ndGggcmVwb3J0ZWQgYnkgQGNvZGV7QlJFQUtQT0lOVF9GUk9NX1BDfSBpcyBjYWNoZWQgaW4KK0Bjb2Rle3BsYWNlZF9zaXplfSwgc28gdGhhdCBhIG1hdGNoaW5nIEBzYW1we3owfSBwYWNrZXQgY2FuIGJlCit1c2VkIHRvIHJlbW92ZSB0aGUgYnJlYWtwb2ludC4KKworQGNpbmRleCBpbnNlcnQgb3IgcmVtb3ZlIGhhcmR3YXJlIGJyZWFrcG9pbnQKK0BmaW5kZXggdGFyZ2V0X3JlbW92ZV9od19icmVha3BvaW50CitAZmluZGV4IHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludAorQGl0ZW0gdGFyZ2V0X3JlbW92ZV9od19icmVha3BvaW50IChAdmFye2JwX3RndH0pCitAaXRlbXggdGFyZ2V0X2luc2VydF9od19icmVha3BvaW50IChAdmFye2JwX3RndH0pCitJbnNlcnQgb3IgcmVtb3ZlIGEgaGFyZHdhcmUtYXNzaXN0ZWQgYnJlYWtwb2ludCBhdCBhZGRyZXNzCitAY29kZXtAdmFye2JwX3RndH0tPnBsYWNlZF9hZGRyZXNzfS4gIFJldHVybnMgemVybyBmb3Igc3VjY2VzcywKK25vbi16ZXJvIGZvciBmYWlsdXJlLiAgU2VlIEBjb2Rle3RhcmdldF9pbnNlcnRfYnJlYWtwb2ludH0gZm9yCithIGRlc2NyaXB0aW9uIG9mIHRoZSBAY29kZXtzdHJ1Y3QgYnBfdGFyZ2V0X2luZm99IHBvaW50ZWQgdG8gYnkKK0B2YXJ7YnBfdGd0fTsgdGhlIEBjb2Rle3NoYWRvd19jb250ZW50c30gYW5kCitAY29kZXtzaGFkb3dfbGVufSBtZW1iZXJzIGFyZSBub3QgdXNlZCBmb3IgaGFyZHdhcmUgYnJlYWtwb2ludHMsCitidXQgQGNvZGV7cGxhY2VkX3NpemV9IG1heSBiZS4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gU2luZ2xlIFN0ZXBwaW5nCiAKIEBzZWN0aW9uIFNpZ25hbCBIYW5kbGluZwpAQCAtNjU3LDE4ICs2OTgsNiBAQAogQG5vaW5kZW50CiBUaGVzZSB0d28gbWFjcm9zIHNob3VsZCByZXR1cm4gMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCiAKLUBjaW5kZXggaW5zZXJ0IG9yIHJlbW92ZSBoYXJkd2FyZSBicmVha3BvaW50Ci1AZmluZGV4IHRhcmdldF9yZW1vdmVfaHdfYnJlYWtwb2ludAotQGZpbmRleCB0YXJnZXRfaW5zZXJ0X2h3X2JyZWFrcG9pbnQKLUBpdGVtIHRhcmdldF9yZW1vdmVfaHdfYnJlYWtwb2ludCAoQHZhcnthZGRyfSwgQHZhcntzaGFkb3d9KQotQGl0ZW14IHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludCAoQHZhcnthZGRyfSwgQHZhcntzaGFkb3d9KQotSW5zZXJ0IG9yIHJlbW92ZSBhIGhhcmR3YXJlLWFzc2lzdGVkIGJyZWFrcG9pbnQgYXQgYWRkcmVzcyBAdmFye2FkZHJ9LgotUmV0dXJucyB6ZXJvIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4gIEB2YXJ7c2hhZG93fSBpcyB0aGUKLXJlYWwgY29udGVudHMgb2YgdGhlIGJ5dGUgd2hlcmUgdGhlIGJyZWFrcG9pbnQgaGFzIGJlZW4gaW5zZXJ0ZWQ7IGl0Ci1pcyBnZW5lcmFsbHkgbm90IHZhbGlkIHdoZW4gaGFyZHdhcmUgYnJlYWtwb2ludHMgYXJlIHVzZWQsIGJ1dCBzaW5jZQotbm8gb3RoZXIgY29kZSB0b3VjaGVzIHRoZXNlIHZhbHVlcywgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYWJvdmUKLXR3byBtYWNyb3MgY2FuIHVzZSB0aGVtIGZvciB0aGVpciBpbnRlcm5hbCBwdXJwb3Nlcy4KLQogQGZpbmRleCB0YXJnZXRfc3RvcHBlZF9kYXRhX2FkZHJlc3MKIEBpdGVtIHRhcmdldF9zdG9wcGVkX2RhdGFfYWRkcmVzcyAoQHZhcnthZGRyX3B9KQogSWYgdGhlIGluZmVyaW9yIGhhcyBzb21lIHdhdGNocG9pbnQgdGhhdCB0cmlnZ2VyZWQsIHBsYWNlIHRoZSBhZGRyZXNzCkBAIC04NTgsMTEgKzg4NywxMyBAQAogCiBAZmluZGV4IGkzODZfaW5zZXJ0X2h3X2JyZWFrcG9pbnQKIEBmaW5kZXggaTM4Nl9yZW1vdmVfaHdfYnJlYWtwb2ludAotQGl0ZW0gaTM4Nl9pbnNlcnRfaHdfYnJlYWtwb2ludCAoQHZhcnthZGRyfSwgQHZhcntzaGFkb3d9Ci1AaXRlbXggaTM4Nl9yZW1vdmVfaHdfYnJlYWtwb2ludCAoQHZhcnthZGRyfSwgQHZhcntzaGFkb3d9KQorQGl0ZW0gaTM4Nl9pbnNlcnRfaHdfYnJlYWtwb2ludCAoQHZhcnticF90Z3R9KQorQGl0ZW14IGkzODZfcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKEB2YXJ7YnBfdGd0fSkKIFRoZXNlIGZ1bmN0aW9ucyBpbnNlcnQgYW5kIHJlbW92ZSBoYXJkd2FyZS1hc3Npc3RlZCBicmVha3BvaW50cy4gIFRoZQogbWFjcm9zIEBjb2Rle3RhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludH0gYW5kCiBAY29kZXt0YXJnZXRfcmVtb3ZlX2h3X2JyZWFrcG9pbnR9IGFyZSBzZXQgdG8gY2FsbCB0aGVzZSBmdW5jdGlvbnMuCitUaGUgYXJndW1lbnQgaXMgYSBAY29kZXtzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKn0sIGFzIGRlc2NyaWJlZCBpbgordGhlIGRvY3VtZW50YXRpb24gZm9yIEBjb2Rle3RhcmdldF9pbnNlcnRfYnJlYWtwb2ludH0uCiBUaGVzZSBmdW5jdGlvbnMgd29yayBsaWtlIEBjb2Rle2kzODZfaW5zZXJ0X3dhdGNocG9pbnR9IGFuZAogQGNvZGV7aTM4Nl9yZW1vdmVfd2F0Y2hwb2ludH0sIHJlc3BlY3RpdmVseSwgZXhjZXB0IHRoYXQgdGhleSBzZXQgdXAKIHRoZSBkZWJ1ZyByZWdpc3RlcnMgdG8gd2F0Y2ggaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uLCBhbmQgZWFjaApAQCAtMzIyOSw4ICszMjYwLDggQEAKIAogUmVwbGFjZXMgYWxsIHRoZSBvdGhlciBAdmFye0JSRUFLUE9JTlR9IG1hY3Jvcy4KIAotQGl0ZW0gTUVNT1JZX0lOU0VSVF9CUkVBS1BPSU5UIChAdmFye2FkZHJ9LCBAdmFye2NvbnRlbnRzX2NhY2hlfSkKLUBpdGVteCBNRU1PUllfUkVNT1ZFX0JSRUFLUE9JTlQgKEB2YXJ7YWRkcn0sIEB2YXJ7Y29udGVudHNfY2FjaGV9KQorQGl0ZW0gTUVNT1JZX0lOU0VSVF9CUkVBS1BPSU5UIChAdmFye2JwX3RndH0pCitAaXRlbXggTUVNT1JZX1JFTU9WRV9CUkVBS1BPSU5UIChAdmFye2JwX3RndH0pCiBAZmluZGV4IE1FTU9SWV9SRU1PVkVfQlJFQUtQT0lOVAogQGZpbmRleCBNRU1PUllfSU5TRVJUX0JSRUFLUE9JTlQKIEluc2VydCBvciByZW1vdmUgbWVtb3J5IGJhc2VkIGJyZWFrcG9pbnRzLiAgUmVhc29uYWJsZSBkZWZhdWx0cwpkaWZmIC0tZ2l0IGEvZ2RiL2R3YXJmMi1mcmFtZS5jIGIvZ2RiL2R3YXJmMi1mcmFtZS5jCmluZGV4IDY2ODUwMGQuLmQ0NzlkYTIgMTAwNjQ0Ci0tLSBhL2dkYi9kd2FyZjItZnJhbWUuYworKysgYi9nZGIvZHdhcmYyLWZyYW1lLmMKQEAgLTUwNiw3ICs1MDYsOCBAQAogc3RydWN0IGR3YXJmMl9mcmFtZV9vcHMKIHsKICAgLyogUHJlLWluaXRpYWxpemUgdGhlIHJlZ2lzdGVyIHN0YXRlIFJFRyBmb3IgcmVnaXN0ZXIgUkVHTlVNLiAgKi8KLSAgdm9pZCAoKmluaXRfcmVnKSAoc3RydWN0IGdkYmFyY2ggKiwgaW50LCBzdHJ1Y3QgZHdhcmYyX2ZyYW1lX3N0YXRlX3JlZyAqKTsKKyAgdm9pZCAoKmluaXRfcmVnKSAoc3RydWN0IGdkYmFyY2ggKiwgaW50LCBzdHJ1Y3QgZHdhcmYyX2ZyYW1lX3N0YXRlX3JlZyAqLAorCQkgICAgc3RydWN0IGZyYW1lX2luZm8gKik7CiAKICAgLyogQ2hlY2sgd2hldGhlciB0aGUgZnJhbWUgcHJlY2VkaW5nIE5FWFRfRlJBTUUgd2lsbCBiZSBhIHNpZ25hbAogICAgICB0cmFtcG9saW5lLiAgKi8KQEAgLTUxOCw3ICs1MTksOCBAQAogCiBzdGF0aWMgdm9pZAogZHdhcmYyX2ZyYW1lX2RlZmF1bHRfaW5pdF9yZWcgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLCBpbnQgcmVnbnVtLAotCQkJICAgICAgIHN0cnVjdCBkd2FyZjJfZnJhbWVfc3RhdGVfcmVnICpyZWcpCisJCQkgICAgICAgc3RydWN0IGR3YXJmMl9mcmFtZV9zdGF0ZV9yZWcgKnJlZywKKwkJCSAgICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqbmV4dF9mcmFtZSkKIHsKICAgLyogSWYgd2UgaGF2ZSBhIHJlZ2lzdGVyIHRoYXQgYWN0cyBhcyBhIHByb2dyYW0gY291bnRlciwgbWFyayBpdCBhcwogICAgICBhIGRlc3RpbmF0aW9uIGZvciB0aGUgcmV0dXJuIGFkZHJlc3MuICBJZiB3ZSBoYXZlIGEgcmVnaXN0ZXIgdGhhdApAQCAtNTcwLDcgKzU3Miw4IEBACiB2b2lkCiBkd2FyZjJfZnJhbWVfc2V0X2luaXRfcmVnIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwKIAkJCSAgIHZvaWQgKCppbml0X3JlZykgKHN0cnVjdCBnZGJhcmNoICosIGludCwKLQkJCQkJICAgICBzdHJ1Y3QgZHdhcmYyX2ZyYW1lX3N0YXRlX3JlZyAqKSkKKwkJCQkJICAgICBzdHJ1Y3QgZHdhcmYyX2ZyYW1lX3N0YXRlX3JlZyAqLAorCQkJCQkgICAgIHN0cnVjdCBmcmFtZV9pbmZvICopKQogewogICBzdHJ1Y3QgZHdhcmYyX2ZyYW1lX29wcyAqb3BzID0gZ2RiYXJjaF9kYXRhIChnZGJhcmNoLCBkd2FyZjJfZnJhbWVfZGF0YSk7CiAKQEAgLTU4MSwxMSArNTg0LDEyIEBACiAKIHN0YXRpYyB2b2lkCiBkd2FyZjJfZnJhbWVfaW5pdF9yZWcgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLCBpbnQgcmVnbnVtLAotCQkgICAgICAgc3RydWN0IGR3YXJmMl9mcmFtZV9zdGF0ZV9yZWcgKnJlZykKKwkJICAgICAgIHN0cnVjdCBkd2FyZjJfZnJhbWVfc3RhdGVfcmVnICpyZWcsCisJCSAgICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqbmV4dF9mcmFtZSkKIHsKICAgc3RydWN0IGR3YXJmMl9mcmFtZV9vcHMgKm9wcyA9IGdkYmFyY2hfZGF0YSAoZ2RiYXJjaCwgZHdhcmYyX2ZyYW1lX2RhdGEpOwogCi0gIG9wcy0+aW5pdF9yZWcgKGdkYmFyY2gsIHJlZ251bSwgcmVnKTsKKyAgb3BzLT5pbml0X3JlZyAoZ2RiYXJjaCwgcmVnbnVtLCByZWcsIG5leHRfZnJhbWUpOwogfQogCiAvKiBTZXQgdGhlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgdHJhbXBvbGluZSByZWNvZ25pdGlvbgpAQCAtNzEzLDcgKzcxNyw3IEBACiAgICAgaW50IHJlZ251bTsKIAogICAgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgbnVtX3JlZ3M7IHJlZ251bSsrKQotICAgICAgZHdhcmYyX2ZyYW1lX2luaXRfcmVnIChnZGJhcmNoLCByZWdudW0sICZjYWNoZS0+cmVnW3JlZ251bV0pOworICAgICAgZHdhcmYyX2ZyYW1lX2luaXRfcmVnIChnZGJhcmNoLCByZWdudW0sICZjYWNoZS0+cmVnW3JlZ251bV0sIG5leHRfZnJhbWUpOwogICB9CiAKICAgLyogR28gdGhyb3VnaCB0aGUgRFdBUkYyIENGSSBnZW5lcmF0ZWQgdGFibGUgYW5kIHNhdmUgaXRzIHJlZ2lzdGVyCmRpZmYgLS1naXQgYS9nZGIvZHdhcmYyLWZyYW1lLmggYi9nZGIvZHdhcmYyLWZyYW1lLmgKaW5kZXggMzE5NDYwNC4uYTRhZDU4NiAxMDA2NDQKLS0tIGEvZ2RiL2R3YXJmMi1mcmFtZS5oCisrKyBiL2dkYi9kd2FyZjItZnJhbWUuaApAQCAtNzksNyArNzksOCBAQAogCiBleHRlcm4gdm9pZCBkd2FyZjJfZnJhbWVfc2V0X2luaXRfcmVnIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwKIAkJCQkgICAgICAgdm9pZCAoKmluaXRfcmVnKSAoc3RydWN0IGdkYmFyY2ggKiwgaW50LAotCQkJCQkgICAgIHN0cnVjdCBkd2FyZjJfZnJhbWVfc3RhdGVfcmVnICopKTsKKwkJCQkJICAgICBzdHJ1Y3QgZHdhcmYyX2ZyYW1lX3N0YXRlX3JlZyAqLAorCQkJCQkgICAgIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKIAogLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIHRyYW1wb2xpbmUgcmVjb2duaXRpb24KICAgIGZ1bmN0aW9uIGZvciBHREJBUkNIIHRvIFNJR05BTF9GUkFNRV9QLiAgKi8KZGlmZiAtLWdpdCBhL2dkYi9leGVjLmMgYi9nZGIvZXhlYy5jCmluZGV4IDI0OGY3ZWUuLjdiZDJjY2QgMTAwNjQ0Ci0tLSBhL2dkYi9leGVjLmMKKysrIGIvZ2RiL2V4ZWMuYwpAQCAtNTksOCArNTksNiBAQAogCiBzdGF0aWMgdm9pZCBleGVjX2ZpbGVzX2luZm8gKHN0cnVjdCB0YXJnZXRfb3BzICopOwogCi1zdGF0aWMgaW50IGlnbm9yZSAoQ09SRV9BRERSLCBiZmRfYnl0ZSAqKTsKLQogc3RhdGljIHZvaWQgaW5pdF9leGVjX29wcyAodm9pZCk7CiAKIHZvaWQgX2luaXRpYWxpemVfZXhlYyAodm9pZCk7CkBAIC02OTEsNyArNjg5LDcgQEAKICAgIGJyZWFrcG9pbnRfaW5pdF9pbmZlcmlvcikuICAqLwogCiBzdGF0aWMgaW50Ci1pZ25vcmUgKENPUkVfQUREUiBhZGRyLCBiZmRfYnl0ZSAqY29udGVudHMpCitpZ25vcmUgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2dkYi9mcmFtZS5oIGIvZ2RiL2ZyYW1lLmgKaW5kZXggYTczYTRmMS4uODAwY2JmYiAxMDA2NDQKLS0tIGEvZ2RiL2ZyYW1lLmgKKysrIGIvZ2RiL2ZyYW1lLmgKQEAgLTMwMCw2ICszMDAsMTIgQEAKIGV4dGVybiB2b2lkIGZpbmRfZnJhbWVfc2FsIChzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUsCiAJCQkgICAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqc2FsKTsKIAorLyogU2V0IHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGluZSB0byB0aGUgbG9jYXRpb24gZ2l2ZW4gYnkgZnJhbWUKKyAgIEZSQU1FLCBpZiBwb3NzaWJsZS4gIFdoZW4gQ0VOVEVSIGlzIHRydWUsIGFkanVzdCBzbyB0aGUgcmVsZXZhbnQKKyAgIGxpbmUgaXMgaW4gdGhlIGNlbnRlciBvZiB0aGUgbmV4dCAnbGlzdCcuICAqLworCit2b2lkIHNldF9jdXJyZW50X3NhbF9mcm9tX2ZyYW1lIChzdHJ1Y3QgZnJhbWVfaW5mbyAqLCBpbnQpOworCiAvKiBSZXR1cm4gdGhlIGZyYW1lIGJhc2UgKHdoYXQgZXZlciB0aGF0IGlzKSAoREVQUkVDQVRFRCkuCiAKICAgIE9sZCBjb2RlIHdhcyB0cnlpbmcgdG8gdXNlIHRoaXMgc2luZ2xlIG1ldGhvZCBmb3IgdHdvIGNvbmZsaWN0aW5nCmRpZmYgLS1naXQgYS9nZGIvZ2RiYXJjaC5jIGIvZ2RiL2dkYmFyY2guYwppbmRleCA0ZmE1ZWE0Li43MDZiZDEzIDEwMDY0NAotLS0gYS9nZGIvZ2RiYXJjaC5jCisrKyBiL2dkYi9nZGJhcmNoLmMKQEAgLTEyNTAsOCArMTI1MCw4IEBACiAjaWZkZWYgTUVNT1JZX0lOU0VSVF9CUkVBS1BPSU5UCiAgIGZwcmludGZfdW5maWx0ZXJlZCAoZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAiZ2RiYXJjaF9kdW1wOiAlcyAjICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICJNRU1PUllfSU5TRVJUX0JSRUFLUE9JTlQoYWRkciwgY29udGVudHNfY2FjaGUpIiwKLSAgICAgICAgICAgICAgICAgICAgICBYU1RSSU5HIChNRU1PUllfSU5TRVJUX0JSRUFLUE9JTlQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKSkpOworICAgICAgICAgICAgICAgICAgICAgICJNRU1PUllfSU5TRVJUX0JSRUFLUE9JTlQoYnBfdGd0KSIsCisgICAgICAgICAgICAgICAgICAgICAgWFNUUklORyAoTUVNT1JZX0lOU0VSVF9CUkVBS1BPSU5UIChicF90Z3QpKSk7CiAjZW5kaWYKICAgZnByaW50Zl91bmZpbHRlcmVkIChmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICJnZGJhcmNoX2R1bXA6IG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCA9IDwweCVseD5cbiIsCkBAIC0xMjU5LDggKzEyNTksOCBAQAogI2lmZGVmIE1FTU9SWV9SRU1PVkVfQlJFQUtQT0lOVAogICBmcHJpbnRmX3VuZmlsdGVyZWQgKGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgImdkYmFyY2hfZHVtcDogJXMgIyAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAiTUVNT1JZX1JFTU9WRV9CUkVBS1BPSU5UKGFkZHIsIGNvbnRlbnRzX2NhY2hlKSIsCi0gICAgICAgICAgICAgICAgICAgICAgWFNUUklORyAoTUVNT1JZX1JFTU9WRV9CUkVBS1BPSU5UIChhZGRyLCBjb250ZW50c19jYWNoZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAiTUVNT1JZX1JFTU9WRV9CUkVBS1BPSU5UKGJwX3RndCkiLAorICAgICAgICAgICAgICAgICAgICAgIFhTVFJJTkcgKE1FTU9SWV9SRU1PVkVfQlJFQUtQT0lOVCAoYnBfdGd0KSkpOwogI2VuZGlmCiAgIGZwcmludGZfdW5maWx0ZXJlZCAoZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAiZ2RiYXJjaF9kdW1wOiBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgPSA8MHglbHg+XG4iLApAQCAtMjkzNCwxMyArMjkzNCwxMyBAQAogfQogCiBpbnQKLWdkYmFyY2hfbWVtb3J5X2luc2VydF9icmVha3BvaW50IChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgQ09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpjb250ZW50c19jYWNoZSkKK2dkYmFyY2hfbWVtb3J5X2luc2VydF9icmVha3BvaW50IChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CiAgIGdkYl9hc3NlcnQgKGdkYmFyY2ggIT0gTlVMTCk7CiAgIGdkYl9hc3NlcnQgKGdkYmFyY2gtPm1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAhPSBOVUxMKTsKICAgaWYgKGdkYmFyY2hfZGVidWcgPj0gMikKICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csICJnZGJhcmNoX21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCBjYWxsZWRcbiIpOwotICByZXR1cm4gZ2RiYXJjaC0+bWVtb3J5X2luc2VydF9icmVha3BvaW50IChhZGRyLCBjb250ZW50c19jYWNoZSk7CisgIHJldHVybiBnZGJhcmNoLT5tZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKGJwX3RndCk7CiB9CiAKIHZvaWQKQEAgLTI5NTEsMTMgKzI5NTEsMTMgQEAKIH0KIAogaW50Ci1nZGJhcmNoX21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIENPUkVfQUREUiBhZGRyLCBnZGJfYnl0ZSAqY29udGVudHNfY2FjaGUpCitnZGJhcmNoX21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewogICBnZGJfYXNzZXJ0IChnZGJhcmNoICE9IE5VTEwpOwogICBnZGJfYXNzZXJ0IChnZGJhcmNoLT5tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgIT0gTlVMTCk7CiAgIGlmIChnZGJhcmNoX2RlYnVnID49IDIpCiAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLCAiZ2RiYXJjaF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgY2FsbGVkXG4iKTsKLSAgcmV0dXJuIGdkYmFyY2gtPm1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpOworICByZXR1cm4gZ2RiYXJjaC0+bWVtb3J5X3JlbW92ZV9icmVha3BvaW50IChicF90Z3QpOwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9nZGIvZ2RiYXJjaC5oIGIvZ2RiL2dkYmFyY2guaAppbmRleCA3NWFjODFmLi40OGJjZDdhIDEwMDY0NAotLS0gYS9nZGIvZ2RiYXJjaC5oCisrKyBiL2dkYi9nZGJhcmNoLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvOwogc3RydWN0IHRhcmdldF9vcHM7CiBzdHJ1Y3Qgb2JzdGFjazsKK3N0cnVjdCBicF90YXJnZXRfaW5mbzsKIAogZXh0ZXJuIHN0cnVjdCBnZGJhcmNoICpjdXJyZW50X2dkYmFyY2g7CiAKQEAgLTg5OSwyNCArOTAwLDI0IEBACiBleHRlcm4gQ09SRV9BRERSIGdkYmFyY2hfYWRqdXN0X2JyZWFrcG9pbnRfYWRkcmVzcyAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIENPUkVfQUREUiBicGFkZHIpOwogZXh0ZXJuIHZvaWQgc2V0X2dkYmFyY2hfYWRqdXN0X2JyZWFrcG9pbnRfYWRkcmVzcyAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIGdkYmFyY2hfYWRqdXN0X2JyZWFrcG9pbnRfYWRkcmVzc19mdHlwZSAqYWRqdXN0X2JyZWFrcG9pbnRfYWRkcmVzcyk7CiAKLXR5cGVkZWYgaW50IChnZGJhcmNoX21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludF9mdHlwZSkgKENPUkVfQUREUiBhZGRyLCBnZGJfYnl0ZSAqY29udGVudHNfY2FjaGUpOwotZXh0ZXJuIGludCBnZGJhcmNoX21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIENPUkVfQUREUiBhZGRyLCBnZGJfYnl0ZSAqY29udGVudHNfY2FjaGUpOwordHlwZWRlZiBpbnQgKGdkYmFyY2hfbWVtb3J5X2luc2VydF9icmVha3BvaW50X2Z0eXBlKSAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpOworZXh0ZXJuIGludCBnZGJhcmNoX21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KTsKIGV4dGVybiB2b2lkIHNldF9nZGJhcmNoX21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIGdkYmFyY2hfbWVtb3J5X2luc2VydF9icmVha3BvaW50X2Z0eXBlICptZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQpOwogI2lmICFkZWZpbmVkIChHREJfVE1fRklMRSkgJiYgZGVmaW5lZCAoTUVNT1JZX0lOU0VSVF9CUkVBS1BPSU5UKQogI2Vycm9yICJOb24gbXVsdGktYXJjaCBkZWZpbml0aW9uIG9mIE1FTU9SWV9JTlNFUlRfQlJFQUtQT0lOVCIKICNlbmRpZgogI2lmICFkZWZpbmVkIChNRU1PUllfSU5TRVJUX0JSRUFLUE9JTlQpCi0jZGVmaW5lIE1FTU9SWV9JTlNFUlRfQlJFQUtQT0lOVChhZGRyLCBjb250ZW50c19jYWNoZSkgKGdkYmFyY2hfbWVtb3J5X2luc2VydF9icmVha3BvaW50IChjdXJyZW50X2dkYmFyY2gsIGFkZHIsIGNvbnRlbnRzX2NhY2hlKSkKKyNkZWZpbmUgTUVNT1JZX0lOU0VSVF9CUkVBS1BPSU5UKGJwX3RndCkgKGdkYmFyY2hfbWVtb3J5X2luc2VydF9icmVha3BvaW50IChjdXJyZW50X2dkYmFyY2gsIGJwX3RndCkpCiAjZW5kaWYKIAotdHlwZWRlZiBpbnQgKGdkYmFyY2hfbWVtb3J5X3JlbW92ZV9icmVha3BvaW50X2Z0eXBlKSAoQ09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpjb250ZW50c19jYWNoZSk7Ci1leHRlcm4gaW50IGdkYmFyY2hfbWVtb3J5X3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgQ09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpjb250ZW50c19jYWNoZSk7Cit0eXBlZGVmIGludCAoZ2RiYXJjaF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnRfZnR5cGUpIChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCk7CitleHRlcm4gaW50IGdkYmFyY2hfbWVtb3J5X3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpOwogZXh0ZXJuIHZvaWQgc2V0X2dkYmFyY2hfbWVtb3J5X3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgZ2RiYXJjaF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnRfZnR5cGUgKm1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCk7CiAjaWYgIWRlZmluZWQgKEdEQl9UTV9GSUxFKSAmJiBkZWZpbmVkIChNRU1PUllfUkVNT1ZFX0JSRUFLUE9JTlQpCiAjZXJyb3IgIk5vbiBtdWx0aS1hcmNoIGRlZmluaXRpb24gb2YgTUVNT1JZX1JFTU9WRV9CUkVBS1BPSU5UIgogI2VuZGlmCiAjaWYgIWRlZmluZWQgKE1FTU9SWV9SRU1PVkVfQlJFQUtQT0lOVCkKLSNkZWZpbmUgTUVNT1JZX1JFTU9WRV9CUkVBS1BPSU5UKGFkZHIsIGNvbnRlbnRzX2NhY2hlKSAoZ2RiYXJjaF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKGN1cnJlbnRfZ2RiYXJjaCwgYWRkciwgY29udGVudHNfY2FjaGUpKQorI2RlZmluZSBNRU1PUllfUkVNT1ZFX0JSRUFLUE9JTlQoYnBfdGd0KSAoZ2RiYXJjaF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKGN1cnJlbnRfZ2RiYXJjaCwgYnBfdGd0KSkKICNlbmRpZgogCiBleHRlcm4gQ09SRV9BRERSIGdkYmFyY2hfZGVjcl9wY19hZnRlcl9icmVhayAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gpOwpkaWZmIC0tZ2l0IGEvZ2RiL2dkYmFyY2guc2ggYi9nZGIvZ2RiYXJjaC5zaAppbmRleCBhZmNmZDgyLi45ZTM2ZmI2IDEwMDc1NQotLS0gYS9nZGIvZ2RiYXJjaC5zaAorKysgYi9nZGIvZ2RiYXJjaC5zaApAQCAtNTQ5LDggKzU0OSw4IEBACiBmOj06aW50OmlubmVyX3RoYW46Q09SRV9BRERSIGxocywgQ09SRV9BRERSIHJoczpsaHMsIHJoczowOjAKIGY6PTpjb25zdCBnZGJfYnl0ZSAqOmJyZWFrcG9pbnRfZnJvbV9wYzpDT1JFX0FERFIgKnBjcHRyLCBpbnQgKmxlbnB0cjpwY3B0ciwgbGVucHRyOjowOgogTTo6Q09SRV9BRERSOmFkanVzdF9icmVha3BvaW50X2FkZHJlc3M6Q09SRV9BRERSIGJwYWRkcjpicGFkZHIKLWY6PTppbnQ6bWVtb3J5X2luc2VydF9icmVha3BvaW50OkNPUkVfQUREUiBhZGRyLCBnZGJfYnl0ZSAqY29udGVudHNfY2FjaGU6YWRkciwgY29udGVudHNfY2FjaGU6MDpkZWZhdWx0X21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludDo6MAotZjo9OmludDptZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ6Q09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpjb250ZW50c19jYWNoZTphZGRyLCBjb250ZW50c19jYWNoZTowOmRlZmF1bHRfbWVtb3J5X3JlbW92ZV9icmVha3BvaW50OjowCitmOj06aW50Om1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludDpzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndDpicF90Z3Q6MDpkZWZhdWx0X21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludDo6MAorZjo9OmludDptZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ6c3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3Q6YnBfdGd0OjA6ZGVmYXVsdF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ6OjAKIHY6PTpDT1JFX0FERFI6ZGVjcl9wY19hZnRlcl9icmVhazo6OjA6OjowCiAKICMgQSBmdW5jdGlvbiBjYW4gYmUgYWRkcmVzc2VkIGJ5IGVpdGhlciBpdCdzICJwb2ludGVyIiAocG9zc2libHkgYQpAQCAtNzcxLDYgKzc3MSw3IEBACiBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbzsKIHN0cnVjdCB0YXJnZXRfb3BzOwogc3RydWN0IG9ic3RhY2s7CitzdHJ1Y3QgYnBfdGFyZ2V0X2luZm87CiAKIGV4dGVybiBzdHJ1Y3QgZ2RiYXJjaCAqY3VycmVudF9nZGJhcmNoOwogRU9GCmRpZmYgLS1naXQgYS9nZGIvaHBwYS1saW51eC10ZGVwLmMgYi9nZGIvaHBwYS1saW51eC10ZGVwLmMKaW5kZXggNDM5YTZlMC4uYzVkMjNmOSAxMDA2NDQKLS0tIGEvZ2RiL2hwcGEtbGludXgtdGRlcC5jCisrKyBiL2dkYi9ocHBhLWxpbnV4LXRkZXAuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgInRyYWQtZnJhbWUuaCIKICNpbmNsdWRlICJkd2FyZjItZnJhbWUuaCIKICNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgInJlZ3NldC5oIgogI2luY2x1ZGUgImhwcGEtdGRlcC5oIgogCiAjaW5jbHVkZSAiZWxmL2NvbW1vbi5oIgpAQCAtNDAwLDYgKzQwMSwxMTIgQEAKICAgICB9CiAgIHJldHVybiAwOwogfQorDAorLyoKKyAqIFJlZ2lzdGVycyBzYXZlZCBpbiBhIGNvcmVkdW1wOgorICogZ3IwLi5ncjMxCisgKiBzcjAuLnNyNworICogaWFvcTAuLmlhb3ExCisgKiBpYXNxMC4uaWFzcTEKKyAqIHNhciwgaWlyLCBpc3IsIGlvciwgaXBzdworICogY3IwLCBjcjI0Li5jcjMxCisgKiBjcjgsOSwxMiwxMworICogY3IxMCwgY3IxNQorICovCisKKyNkZWZpbmUgR1JfUkVHTlVNKF9uKQkoSFBQQV9SMF9SRUdOVU0rX24pCisjZGVmaW5lIFRSX1JFR05VTShfbikJKEhQUEFfVFIwX1JFR05VTStfbikKK3N0YXRpYyBjb25zdCBpbnQgZ3JlZ19tYXBbXSA9CisgIHsKKyAgICBHUl9SRUdOVU0oMCksIEdSX1JFR05VTSgxKSwgR1JfUkVHTlVNKDIpLCBHUl9SRUdOVU0oMyksCisgICAgR1JfUkVHTlVNKDQpLCBHUl9SRUdOVU0oNSksIEdSX1JFR05VTSg2KSwgR1JfUkVHTlVNKDcpLAorICAgIEdSX1JFR05VTSg4KSwgR1JfUkVHTlVNKDkpLCBHUl9SRUdOVU0oMTApLCBHUl9SRUdOVU0oMTEpLAorICAgIEdSX1JFR05VTSgxMiksIEdSX1JFR05VTSgxMyksIEdSX1JFR05VTSgxNCksIEdSX1JFR05VTSgxNSksCisgICAgR1JfUkVHTlVNKDE2KSwgR1JfUkVHTlVNKDE3KSwgR1JfUkVHTlVNKDE4KSwgR1JfUkVHTlVNKDE5KSwKKyAgICBHUl9SRUdOVU0oMjApLCBHUl9SRUdOVU0oMjEpLCBHUl9SRUdOVU0oMjIpLCBHUl9SRUdOVU0oMjMpLAorICAgIEdSX1JFR05VTSgyNCksIEdSX1JFR05VTSgyNSksIEdSX1JFR05VTSgyNiksIEdSX1JFR05VTSgyNyksCisgICAgR1JfUkVHTlVNKDI4KSwgR1JfUkVHTlVNKDI5KSwgR1JfUkVHTlVNKDMwKSwgR1JfUkVHTlVNKDMxKSwKKworICAgIEhQUEFfU1I0X1JFR05VTSsxLCBIUFBBX1NSNF9SRUdOVU0rMiwgSFBQQV9TUjRfUkVHTlVNKzMsIEhQUEFfU1I0X1JFR05VTSs0LAorICAgIEhQUEFfU1I0X1JFR05VTSwgSFBQQV9TUjRfUkVHTlVNKzUsIEhQUEFfU1I0X1JFR05VTSs2LCBIUFBBX1NSNF9SRUdOVU0rNywKKworICAgIEhQUEFfUENPUV9IRUFEX1JFR05VTSwgSFBQQV9QQ09RX1RBSUxfUkVHTlVNLAorICAgIEhQUEFfUENTUV9IRUFEX1JFR05VTSwgSFBQQV9QQ1NRX1RBSUxfUkVHTlVNLAorCisgICAgSFBQQV9TQVJfUkVHTlVNLCBIUFBBX0lJUl9SRUdOVU0sIEhQUEFfSVNSX1JFR05VTSwgSFBQQV9JT1JfUkVHTlVNLAorICAgIEhQUEFfSVBTV19SRUdOVU0sIEhQUEFfUkNSX1JFR05VTSwKKworICAgIFRSX1JFR05VTSgwKSwgVFJfUkVHTlVNKDEpLCBUUl9SRUdOVU0oMiksIFRSX1JFR05VTSgzKSwKKyAgICBUUl9SRUdOVU0oNCksIFRSX1JFR05VTSg1KSwgVFJfUkVHTlVNKDYpLCBUUl9SRUdOVU0oNyksCisKKyAgICBIUFBBX1BJRDBfUkVHTlVNLCBIUFBBX1BJRDFfUkVHTlVNLCBIUFBBX1BJRDJfUkVHTlVNLCBIUFBBX1BJRDNfUkVHTlVNLAorICAgIEhQUEFfQ0NSX1JFR05VTSwgSFBQQV9FSUVNX1JFR05VTSwKKyAgfTsKKworc3RhdGljIHZvaWQKK2hwcGFfbGludXhfc3VwcGx5X3JlZ3NldCAoY29uc3Qgc3RydWN0IHJlZ3NldCAqcmVnc2V0LAorCQkJICBzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlLAorCQkJICBpbnQgcmVnbnVtLCBjb25zdCB2b2lkICpyZWdzLCBzaXplX3QgbGVuKQoreworICBzdHJ1Y3QgZ2RiYXJjaCAqYXJjaCA9IGdldF9yZWdjYWNoZV9hcmNoIChyZWdjYWNoZSk7CisgIHN0cnVjdCBnZGJhcmNoX3RkZXAgKnRkZXAgPSBnZGJhcmNoX3RkZXAgKGFyY2gpOworICBjb25zdCBjaGFyICpidWYgPSByZWdzOworICBpbnQgaSwgb2Zmc2V0OworCisgIG9mZnNldCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChncmVnX21hcCk7IGkrKykKKyAgICB7CisgICAgICBpZiAocmVnbnVtID09IGdyZWdfbWFwW2ldIHx8IHJlZ251bSA9PSAtMSkKKyAgICAgICAgcmVnY2FjaGVfcmF3X3N1cHBseSAocmVnY2FjaGUsIGdyZWdfbWFwW2ldLCBidWYgKyBvZmZzZXQpOworCisgICAgICBvZmZzZXQgKz0gdGRlcC0+Ynl0ZXNfcGVyX2FkZHJlc3M7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraHBwYV9saW51eF9zdXBwbHlfZnByZWdzZXQgKGNvbnN0IHN0cnVjdCByZWdzZXQgKnJlZ3NldCwKKwkJCSAgICBzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlLAorCQkJICAgIGludCByZWdudW0sIGNvbnN0IHZvaWQgKnJlZ3MsIHNpemVfdCBsZW4pCit7CisgIGNvbnN0IGNoYXIgKmJ1ZiA9IHJlZ3M7CisgIGludCBpLCBvZmZzZXQ7CisKKyAgb2Zmc2V0ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDMxOyBpKyspCisgICAgeworICAgICAgaWYgKHJlZ251bSA9PSBIUFBBX0ZQMF9SRUdOVU0gKyBpIHx8IHJlZ251bSA9PSAtMSkKKyAgICAgICAgcmVnY2FjaGVfcmF3X3N1cHBseSAocmVnY2FjaGUsIEhQUEFfRlAwX1JFR05VTSArIGksIAorCQkJICAgICBidWYgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0ICs9IDg7CisgICAgfQorfQorCisvKiBMaW51eCByZWdpc3RlciBzZXQuICAqLworc3RhdGljIHN0cnVjdCByZWdzZXQgaHBwYV9saW51eF9yZWdzZXQgPQoreworICBOVUxMLAorICBocHBhX2xpbnV4X3N1cHBseV9yZWdzZXQKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVnc2V0IGhwcGFfbGludXhfZnByZWdzZXQgPQoreworICBOVUxMLAorICBocHBhX2xpbnV4X3N1cHBseV9mcHJlZ3NldAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdzZXQgKgoraHBwYV9saW51eF9yZWdzZXRfZnJvbV9jb3JlX3NlY3Rpb24gKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLAorCQkJCSAgICAgY29uc3QgY2hhciAqc2VjdF9uYW1lLAorCQkJCSAgICAgc2l6ZV90IHNlY3Rfc2l6ZSkKK3sKKyAgaWYgKHN0cmNtcCAoc2VjdF9uYW1lLCAiLnJlZyIpID09IDApCisgICAgcmV0dXJuICZocHBhX2xpbnV4X3JlZ3NldDsKKyAgZWxzZSBpZiAoc3RyY21wIChzZWN0X25hbWUsICIucmVnMiIpID09IDApCisgICAgcmV0dXJuICZocHBhX2xpbnV4X2ZwcmVnc2V0OworCisgIHJldHVybiBOVUxMOworfQorDAogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gICovCiBleHRlcm4gaW5pdGlhbGl6ZV9maWxlX2Z0eXBlIF9pbml0aWFsaXplX2hwcGFfbGludXhfdGRlcDsKQEAgLTQzMyw2ICs1NDAsOSBAQAogICAgICBtb3JlIHdvcmsgaW4gZ2NjIGFuZCBnbGliYyBmaXJzdC4gICovCiAgIHNldF9nZGJhcmNoX2xvbmdfZG91YmxlX2JpdCAoZ2RiYXJjaCwgNjQpOwogCisgIHNldF9nZGJhcmNoX3JlZ3NldF9mcm9tX2NvcmVfc2VjdGlvbgorICAgIChnZGJhcmNoLCBocHBhX2xpbnV4X3JlZ3NldF9mcm9tX2NvcmVfc2VjdGlvbik7CisKICNpZiAwCiAgIC8qIER3YXJmLTIgdW53aW5kaW5nIHN1cHBvcnQuICBOb3QgeWV0IHdvcmtpbmcuICAqLwogICBzZXRfZ2RiYXJjaF9kd2FyZl9yZWdfdG9fcmVnbnVtIChnZGJhcmNoLCBocHBhX2R3YXJmX3JlZ190b19yZWdudW0pOwpAQCAtNDUwLDQgKzU2MCw1IEBACiBfaW5pdGlhbGl6ZV9ocHBhX2xpbnV4X3RkZXAgKHZvaWQpCiB7CiAgIGdkYmFyY2hfcmVnaXN0ZXJfb3NhYmkgKGJmZF9hcmNoX2hwcGEsIDAsIEdEQl9PU0FCSV9MSU5VWCwgaHBwYV9saW51eF9pbml0X2FiaSk7CisgIGdkYmFyY2hfcmVnaXN0ZXJfb3NhYmkgKGJmZF9hcmNoX2hwcGEsIGJmZF9tYWNoX2hwcGEyMHcsIEdEQl9PU0FCSV9MSU5VWCwgaHBwYV9saW51eF9pbml0X2FiaSk7CiB9CmRpZmYgLS1naXQgYS9nZGIvaHBwYS10ZGVwLmMgYi9nZGIvaHBwYS10ZGVwLmMKaW5kZXggZjFhZTg4Yy4uNTBkYWMxYiAxMDA2NDQKLS0tIGEvZ2RiL2hwcGEtdGRlcC5jCisrKyBiL2dkYi9ocHBhLXRkZXAuYwpAQCAtMTc4Miw2ICsxNzgyLDE3IEBACiAgICAgcmV0dXJuIChza2lwX3Byb2xvZ3VlX2hhcmRfd2F5IChwYywgMSkpOwogfQogCisvKiBSZXR1cm4gYW4gdW53aW5kIGVudHJ5IHRoYXQgZmFsbHMgd2l0aGluIHRoZSBmcmFtZSdzIGNvZGUgYmxvY2suICAqLworc3RhdGljIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKgoraHBwYV9maW5kX3Vud2luZF9lbnRyeV9pbl9ibG9jayAoc3RydWN0IGZyYW1lX2luZm8gKmYpCit7CisgIENPUkVfQUREUiBwYzsKKworICBwYyA9IGZyYW1lX3Vud2luZF9hZGRyZXNzX2luX2Jsb2NrIChmKTsKKyAgcGMgPSBnZGJhcmNoX2FkZHJfYml0c19yZW1vdmUgKGdldF9mcmFtZV9hcmNoIChmKSwgcGMpOworICByZXR1cm4gZmluZF91bndpbmRfZW50cnkgKHBjKTsKK30KKwogc3RydWN0IGhwcGFfZnJhbWVfY2FjaGUKIHsKICAgQ09SRV9BRERSIGJhc2U7CkBAIC0xODE3LDcgKzE4MjgsNyBAQAogICBjYWNoZS0+c2F2ZWRfcmVncyA9IHRyYWRfZnJhbWVfYWxsb2Nfc2F2ZWRfcmVncyAobmV4dF9mcmFtZSk7CiAKICAgLyogWW93ISAqLwotICB1ID0gZmluZF91bndpbmRfZW50cnkgKGZyYW1lX3BjX3Vud2luZCAobmV4dF9mcmFtZSkpOworICB1ID0gaHBwYV9maW5kX3Vud2luZF9lbnRyeV9pbl9ibG9jayAobmV4dF9mcmFtZSk7CiAgIGlmICghdSkKICAgICB7CiAgICAgICBpZiAoaHBwYV9kZWJ1ZykKQEAgLTIxOTcsNyArMjIwOCw3IEBACiAgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnU7CiAKICAgaW5mbyA9IGhwcGFfZnJhbWVfY2FjaGUgKG5leHRfZnJhbWUsIHRoaXNfY2FjaGUpOwotICB1ID0gZmluZF91bndpbmRfZW50cnkgKHBjKTsKKyAgdSA9IGhwcGFfZmluZF91bndpbmRfZW50cnlfaW5fYmxvY2sgKG5leHRfZnJhbWUpOwogCiAgICgqdGhpc19pZCkgPSBmcmFtZV9pZF9idWlsZCAoaW5mby0+YmFzZSwgdS0+cmVnaW9uX3N0YXJ0KTsKIH0KQEAgLTIyMjQsOSArMjIzNSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZyYW1lX3Vud2luZCAqCiBocHBhX2ZyYW1lX3Vud2luZF9zbmlmZmVyIChzdHJ1Y3QgZnJhbWVfaW5mbyAqbmV4dF9mcmFtZSkKIHsKLSAgQ09SRV9BRERSIHBjID0gZnJhbWVfcGNfdW53aW5kIChuZXh0X2ZyYW1lKTsKLQotICBpZiAoZmluZF91bndpbmRfZW50cnkgKHBjKSkKKyAgaWYgKGhwcGFfZmluZF91bndpbmRfZW50cnlfaW5fYmxvY2sgKG5leHRfZnJhbWUpKQogICAgIHJldHVybiAmaHBwYV9mcmFtZV91bndpbmQ7CiAKICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9nZGIvaTM4Ni1uYXQuYyBiL2dkYi9pMzg2LW5hdC5jCmluZGV4IDc3MGI2NmQuLmRlYTEyMDYgMTAwNjQ0Ci0tLSBhL2dkYi9pMzg2LW5hdC5jCisrKyBiL2dkYi9pMzg2LW5hdC5jCkBAIC02MjUsMTIgKzYyNSwxMyBAQAogICByZXR1cm4gMDsKIH0KIAotLyogSW5zZXJ0IGEgaGFyZHdhcmUtYXNzaXN0ZWQgYnJlYWtwb2ludCBhdCBhZGRyZXNzIEFERFIuICBTSEFET1cgaXMKLSAgIHVudXNlZC4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIEVCVVNZIG9uIGZhaWx1cmUuICAqLworLyogSW5zZXJ0IGEgaGFyZHdhcmUtYXNzaXN0ZWQgYnJlYWtwb2ludCBhdCBCUF9UR1QtPnBsYWNlZF9hZGRyZXNzLgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgRUJVU1kgb24gZmFpbHVyZS4gICovCiBpbnQKLWkzODZfaW5zZXJ0X2h3X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCB2b2lkICpzaGFkb3cpCitpMzg2X2luc2VydF9od19icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCkKIHsKICAgdW5zaWduZWQgbGVuX3J3ID0gaTM4Nl9sZW5ndGhfYW5kX3J3X2JpdHMgKDEsIGh3X2V4ZWN1dGUpOworICBDT1JFX0FERFIgYWRkciA9IGJwX3RndC0+cGxhY2VkX2FkZHJlc3M7CiAgIGludCByZXR2YWwgPSBpMzg2X2luc2VydF9hbGlnbmVkX3dhdGNocG9pbnQgKGFkZHIsIGxlbl9ydykgPyBFQlVTWSA6IDA7CiAKICAgaWYgKG1haW50X3Nob3dfZHIpCkBAIC02MzksMTMgKzY0MCwxNCBAQAogICByZXR1cm4gcmV0dmFsOwogfQogCi0vKiBSZW1vdmUgYSBoYXJkd2FyZS1hc3Npc3RlZCBicmVha3BvaW50IGF0IGFkZHJlc3MgQUREUi4gIFNIQURPVyBpcwotICAgdW51c2VkLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4gICovCisvKiBSZW1vdmUgYSBoYXJkd2FyZS1hc3Npc3RlZCBicmVha3BvaW50IGF0IEJQX1RHVC0+cGxhY2VkX2FkZHJlc3MuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLiAgKi8KIAogaW50Ci1pMzg2X3JlbW92ZV9od19icmVha3BvaW50IChDT1JFX0FERFIgYWRkciwgdm9pZCAqc2hhZG93KQoraTM4Nl9yZW1vdmVfaHdfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CiAgIHVuc2lnbmVkIGxlbl9ydyA9IGkzODZfbGVuZ3RoX2FuZF9yd19iaXRzICgxLCBod19leGVjdXRlKTsKKyAgQ09SRV9BRERSIGFkZHIgPSBicF90Z3QtPnBsYWNlZF9hZGRyZXNzOwogICBpbnQgcmV0dmFsID0gaTM4Nl9yZW1vdmVfYWxpZ25lZF93YXRjaHBvaW50IChhZGRyLCBsZW5fcncpOwogCiAgIGlmIChtYWludF9zaG93X2RyKQpkaWZmIC0tZ2l0IGEvZ2RiL2kzODYtc3R1Yi5jIGIvZ2RiL2kzODYtc3R1Yi5jCmluZGV4IDEyNTE1NjcuLjZiOTEyOTYgMTAwNjQ0Ci0tLSBhL2dkYi9pMzg2LXN0dWIuYworKysgYi9nZGIvaTM4Ni1zdHViLmMKQEAgLTQ3NCw3ICs0NzQsNyBAQAogICAgICAgY291bnQgPSAwOwogCiAgICAgICAvKiBub3csIHJlYWQgdW50aWwgYSAjIG9yIGVuZCBvZiBidWZmZXIgaXMgZm91bmQgKi8KLSAgICAgIHdoaWxlIChjb3VudCA8IEJVRk1BWCkKKyAgICAgIHdoaWxlIChjb3VudCA8IEJVRk1BWCAtIDEpCiAJewogCSAgY2ggPSBnZXREZWJ1Z0NoYXIgKCk7CiAJICBpZiAoY2ggPT0gJyQnKQpkaWZmIC0tZ2l0IGEvZ2RiL2lhNjQtdGRlcC5jIGIvZ2RiL2lhNjQtdGRlcC5jCmluZGV4IGY3OGYxZmMuLjg5N2QyNzIgMTAwNjQ0Ci0tLSBhL2dkYi9pYTY0LXRkZXAuYworKysgYi9nZGIvaWE2NC10ZGVwLmMKQEAgLTU1MCw4ICs1NTAsOSBAQAogI2RlZmluZSBJQTY0X0JSRUFLUE9JTlQgMHgwMDAwMzMzMzMwMExMCiAKIHN0YXRpYyBpbnQKLWlhNjRfbWVtb3J5X2luc2VydF9icmVha3BvaW50IChDT1JFX0FERFIgYWRkciwgYmZkX2J5dGUgKmNvbnRlbnRzX2NhY2hlKQoraWE2NF9tZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogeworICBDT1JFX0FERFIgYWRkciA9IGJwX3RndC0+cGxhY2VkX2FkZHJlc3M7CiAgIGNoYXIgYnVuZGxlW0JVTkRMRV9MRU5dOwogICBpbnQgc2xvdG51bSA9IChpbnQpIChhZGRyICYgMHgwZikgLyBTTE9UX01VTFRJUExJRVI7CiAgIGxvbmcgbG9uZyBpbnN0cjsKQEAgLTU3NCw3ICs1NzUsOCBAQAogICAgIH0KIAogICBpbnN0ciA9IHNsb3ROX2NvbnRlbnRzIChidW5kbGUsIHNsb3RudW0pOwotICBtZW1jcHkoY29udGVudHNfY2FjaGUsICZpbnN0ciwgc2l6ZW9mKGluc3RyKSk7CisgIG1lbWNweSAoYnBfdGd0LT5zaGFkb3dfY29udGVudHMsICZpbnN0ciwgc2l6ZW9mIChpbnN0cikpOworICBicF90Z3QtPnBsYWNlZF9zaXplID0gYnBfdGd0LT5zaGFkb3dfbGVuID0gc2l6ZW9mIChpbnN0cik7CiAgIHJlcGxhY2Vfc2xvdE5fY29udGVudHMgKGJ1bmRsZSwgSUE2NF9CUkVBS1BPSU5ULCBzbG90bnVtKTsKICAgaWYgKHZhbCA9PSAwKQogICAgIHRhcmdldF93cml0ZV9tZW1vcnkgKGFkZHIsIGJ1bmRsZSwgQlVORExFX0xFTik7CkBAIC01ODMsOCArNTg1LDkgQEAKIH0KIAogc3RhdGljIGludAotaWE2NF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBiZmRfYnl0ZSAqY29udGVudHNfY2FjaGUpCitpYTY0X21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CisgIENPUkVfQUREUiBhZGRyID0gYnBfdGd0LT5wbGFjZWRfYWRkcmVzczsKICAgY2hhciBidW5kbGVbQlVORExFX0xFTl07CiAgIGludCBzbG90bnVtID0gKGFkZHIgJiAweDBmKSAvIFNMT1RfTVVMVElQTElFUjsKICAgbG9uZyBsb25nIGluc3RyOwpAQCAtNjAzLDcgKzYwNiw3IEBACiAgICAgICBzbG90bnVtID0gMjsKICAgICB9CiAKLSAgbWVtY3B5ICgmaW5zdHIsIGNvbnRlbnRzX2NhY2hlLCBzaXplb2YgaW5zdHIpOworICBtZW1jcHkgKCZpbnN0ciwgYnBfdGd0LT5zaGFkb3dfY29udGVudHMsIHNpemVvZiBpbnN0cik7CiAgIHJlcGxhY2Vfc2xvdE5fY29udGVudHMgKGJ1bmRsZSwgaW5zdHIsIHNsb3RudW0pOwogICBpZiAodmFsID09IDApCiAgICAgdGFyZ2V0X3dyaXRlX21lbW9yeSAoYWRkciwgYnVuZGxlLCBCVU5ETEVfTEVOKTsKZGlmZiAtLWdpdCBhL2dkYi9pbmZydW4uYyBiL2dkYi9pbmZydW4uYwppbmRleCA0N2ZiZTA5Li5iY2NjYTBkIDEwMDY0NAotLS0gYS9nZGIvaW5mcnVuLmMKKysrIGIvZ2RiL2luZnJ1bi5jCkBAIC0zMDQ0LDYgKzMwNDQsMTIgQEAKIAogICB0YXJnZXRfdGVybWluYWxfb3VycyAoKTsKIAorICAvKiBTZXQgdGhlIGN1cnJlbnQgc291cmNlIGxvY2F0aW9uLiAgVGhpcyB3aWxsIGFsc28gaGFwcGVuIGlmIHdlCisgICAgIGRpc3BsYXkgdGhlIGZyYW1lIGJlbG93LCBidXQgdGhlIGN1cnJlbnQgU0FMIHdpbGwgYmUgaW5jb3JyZWN0CisgICAgIGR1cmluZyBhIHVzZXIgaG9vay1zdG9wIGZ1bmN0aW9uLiAgKi8KKyAgaWYgKHRhcmdldF9oYXNfc3RhY2sgJiYgIXN0b3Bfc3RhY2tfZHVtbXkpCisgICAgc2V0X2N1cnJlbnRfc2FsX2Zyb21fZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpLCAxKTsKKwogICAvKiBMb29rIHVwIHRoZSBob29rX3N0b3AgYW5kIHJ1biBpdCAoQ0xJIGludGVybmFsbHkgaGFuZGxlcyBwcm9ibGVtCiAgICAgIG9mIHN0b3BfY29tbWFuZCdzIHByZS1ob29rIG5vdCBleGlzdGluZykuICAqLwogICBpZiAoc3RvcF9jb21tYW5kKQpkaWZmIC0tZ2l0IGEvZ2RiL2xpbnV4LW5hdC5jIGIvZ2RiL2xpbnV4LW5hdC5jCmluZGV4IDg4ZTBkN2QuLmYwNTBlN2UgMTAwNjQ0Ci0tLSBhL2dkYi9saW51eC1uYXQuYworKysgYi9nZGIvbGludXgtbmF0LmMKQEAgLTMzNCwxMiArMzM0LDE0IEBACiBjaGlsZF9wb3N0X2F0dGFjaCAoaW50IHBpZCkKIHsKICAgbGludXhfZW5hYmxlX2V2ZW50X3JlcG9ydGluZyAocGlkX3RvX3B0aWQgKHBpZCkpOworICBjaGVja19mb3JfdGhyZWFkX2RiICgpOwogfQogCiBzdGF0aWMgdm9pZAogbGludXhfY2hpbGRfcG9zdF9zdGFydHVwX2luZmVyaW9yIChwdGlkX3QgcHRpZCkKIHsKICAgbGludXhfZW5hYmxlX2V2ZW50X3JlcG9ydGluZyAocHRpZCk7CisgIGNoZWNrX2Zvcl90aHJlYWRfZGIgKCk7CiB9CiAKIGludApAQCAtOTYzLDcgKzk2NSw3IEBACiAgICAgICBnZGJfYXNzZXJ0IChwaWQgPT0gR0VUX0xXUCAocHRpZCkKIAkJICAmJiBXSUZTVE9QUEVEIChzdGF0dXMpICYmIFdTVE9QU0lHIChzdGF0dXMpKTsKIAotICAgICAgY2hpbGRfcG9zdF9hdHRhY2ggKHBpZCk7CisgICAgICB0YXJnZXRfcG9zdF9hdHRhY2ggKHBpZCk7CiAKICAgICAgIGxwLT5zdG9wcGVkID0gMTsKIApAQCAtMjM4MCw3ICsyMzgyLDEzIEBACiAJCQkiTExUQTogUFRSQUNFX1BFRUtVU0VSICVzLCAwLCAwICglcylcbiIsCiAJCQl0YXJnZXRfcGlkX3RvX3N0ciAocHRpZCksCiAJCQllcnJubyA/IHNhZmVfc3RyZXJyb3IgKGVycm5vKSA6ICJPSyIpOwotICBpZiAoZXJybm8pCisKKyAgLyogTm90IGV2ZXJ5IExpbnV4IHRhcmdldCBpbXBsZW1lbnRzIFBUUkFDRV9QRUVLVVNFUi4KKyAgICAgQnV0IHdlIGNhbiBoYW5kbGUgdGhhdCBjYXNlIGdyYWNlZnVsbHkgc2luY2UgcHRyYWNlCisgICAgIHdpbGwgZmlyc3QgZG8gYSBsb29rdXAgZm9yIHRoZSBwcm9jZXNzIGJhc2VkIHVwb24gdGhlCisgICAgIHBhc3NlZC1pbiBwaWQuICBJZiB0aGF0IGZhaWxzIHdlIHdpbGwgZ2V0IGVpdGhlciAtRVNSQ0gKKyAgICAgb3IgLUVQRVJNLCBvdGhlcndpc2UgdGhlIGNoaWxkIGV4aXN0cyBhbmQgaXMgYWxpdmUuICAqLworICBpZiAoZXJybm8gPT0gRVNSQ0ggfHwgZXJybm8gPT0gRVBFUk0pCiAgICAgcmV0dXJuIDA7CiAKICAgcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9nZGIvbGludXgtbmF0LmggYi9nZGIvbGludXgtbmF0LmgKaW5kZXggZWNmYWFiNy4uYjdjYzkyYSAxMDA2NDQKLS0tIGEvZ2RiL2xpbnV4LW5hdC5oCisrKyBiL2dkYi9saW51eC1uYXQuaApAQCAtNjUsNiArNjUsOCBAQAogICBzdHJ1Y3QgbHdwX2luZm8gKm5leHQ7CiB9OwogCisvKiBBdHRlbXB0IHRvIGluaXRpYWxpemUgbGlidGhyZWFkX2RiLiAgKi8KK3ZvaWQgY2hlY2tfZm9yX3RocmVhZF9kYiAodm9pZCk7CiAKIC8qIEZpbmQgcHJvY2VzcyBQSUQncyBwZW5kaW5nIHNpZ25hbCBzZXQgZnJvbSAvcHJvYy9waWQvc3RhdHVzLiAgKi8KIHZvaWQgbGludXhfcHJvY19wZW5kaW5nX3NpZ25hbHMgKGludCBwaWQsIHNpZ3NldF90ICpwZW5kaW5nLCBzaWdzZXRfdCAqYmxvY2tlZCwgc2lnc2V0X3QgKmlnbm9yZWQpOwpkaWZmIC0tZ2l0IGEvZ2RiL2xpbnV4LXRocmVhZC1kYi5jIGIvZ2RiL2xpbnV4LXRocmVhZC1kYi5jCmluZGV4IDEyOTE0ODAuLjk4MWJjMDYgMTAwNjQ0Ci0tLSBhL2dkYi9saW51eC10aHJlYWQtZGIuYworKysgYi9nZGIvbGludXgtdGhyZWFkLWRiLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJyZWdjYWNoZS5oIgogI2luY2x1ZGUgInNvbGliLXN2cjQuaCIKICNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAibGludXgtbmF0LmgiCiAKICNpZmRlZiBIQVZFX0dOVV9MSUJDX1ZFUlNJT05fSAogI2luY2x1ZGUgPGdudS9saWJjLXZlcnNpb24uaD4KQEAgLTYyNiw1OSArNjI3LDQ5IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQKLXRocmVhZF9kYl9uZXdfb2JqZmlsZSAoc3RydWN0IG9iamZpbGUgKm9iamZpbGUpCisvKiBDaGVjayB3aGV0aGVyIHRocmVhZF9kYiBpcyB1c2FibGUuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuCisgICBhbiBpbmZlcmlvciBpcyBjcmVhdGVkIChvciBvdGhlcndpc2UgYWNxdWlyZWQsIGUuZy4gYXR0YWNoZWQgdG8pCisgICBhbmQgd2hlbiBuZXcgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGludG8gYSBydW5uaW5nIHByb2Nlc3MuICAqLworCit2b2lkCitjaGVja19mb3JfdGhyZWFkX2RiICh2b2lkKQogewogICB0ZF9lcnJfZSBlcnI7CisgIHN0YXRpYyBpbnQgYWxyZWFkeV9sb2FkZWQ7CiAKICAgLyogRmlyc3QgdGltZSB0aHJvdWdoLCByZXBvcnQgdGhhdCBsaWJ0aHJlYWRfZGIgd2FzIHN1Y2Nlc3NmdWx5CiAgICAgIGxvYWRlZC4gIENhbid0IHByaW50IHRoaXMgaW4gaW4gdGhyZWFkX2RiX2xvYWQgYXMsIGF0IHRoYXQgc3RhZ2UsCi0gICAgIHRoZSBpbnRlcnByZXRlciBhbmQgaXQncyBjb25zb2xlIGhhdmVuJ3Qgc3RhcnRlZC4gIFRoZSByZWFsCi0gICAgIHByb2JsZW0gaGVyZSBpcyB0aGF0IGxpYnRocmVhZF9kYiBpcyBsb2FkZWQgdG9vIGVhcmx5IC0gaXQgc2hvdWxkCi0gICAgIG9ubHkgYmUgbG9hZGVkIHdoZW4gdGhlcmUgaXMgYSBwcm9ncmFtIHRvIGRlYnVnLiAgKi8KLSAgewotICAgIHN0YXRpYyBpbnQgZGVqYXZ1OwotICAgIGlmICghZGVqYXZ1KQotICAgICAgewotCURsX2luZm8gaW5mbzsKLQljb25zdCBjaGFyICpsaWJyYXJ5ID0gTlVMTDsKLQkvKiBUcnkgZGxhZGRyLiAgKi8KLQlpZiAoZGxhZGRyICgoKnRkX3RhX25ld19wKSwgJmluZm8pICE9IDApCi0JICBsaWJyYXJ5ID0gaW5mby5kbGlfZm5hbWU7Ci0JLyogVHJ5IGRsaW5mbz8gICovCi0JaWYgKGxpYnJhcnkgPT0gTlVMTCkKLQkgIC8qIFBhcmFub2lkIC0gZG9uJ3QgbGV0IGEgTlVMTCBwYXRoIHNsaXAgdGhyb3VnaC4gICovCi0JICBsaWJyYXJ5ID0gTElCVEhSRUFEX0RCX1NPOwotCXByaW50Zl91bmZpbHRlcmVkIChfKCJVc2luZyBob3N0IGxpYnRocmVhZF9kYiBsaWJyYXJ5IFwiJXNcIi5cbiIpLAotCQkJICAgbGlicmFyeSk7Ci0JZGVqYXZ1ID0gMTsKLSAgICAgIH0KLSAgfQorICAgICB0aGUgaW50ZXJwcmV0ZXIgYW5kIGl0J3MgY29uc29sZSBoYXZlbid0IHN0YXJ0ZWQuICAqLwogCi0gIC8qIERvbid0IGF0dGVtcHQgdG8gdXNlIHRocmVhZF9kYiBvbiB0YXJnZXRzIHdoaWNoIGNhbiBub3QgcnVuCi0gICAgIChjb3JlIGZpbGVzKS4gICovCi0gIGlmIChvYmpmaWxlID09IE5VTEwgfHwgIXRhcmdldF9oYXNfZXhlY3V0aW9uKQorICBpZiAoIWFscmVhZHlfbG9hZGVkKQogICAgIHsKLSAgICAgIC8qIEFsbCBzeW1ib2xzIGhhdmUgYmVlbiBkaXNjYXJkZWQuICBJZiB0aGUgdGhyZWFkX2RiIHRhcmdldCBpcwotICAgICAgICAgYWN0aXZlLCBkZWFjdGl2YXRlIGl0IG5vdy4gICovCi0gICAgICBpZiAodXNpbmdfdGhyZWFkX2RiKQotCXsKLQkgIGdkYl9hc3NlcnQgKHByb2NfaGFuZGxlLnBpZCA9PSAwKTsKLQkgIHVucHVzaF90YXJnZXQgKCZ0aHJlYWRfZGJfb3BzKTsKLQkgIHVzaW5nX3RocmVhZF9kYiA9IDA7Ci0JfQorICAgICAgRGxfaW5mbyBpbmZvOworICAgICAgY29uc3QgY2hhciAqbGlicmFyeSA9IE5VTEw7CisgICAgICBpZiAoZGxhZGRyICgoKnRkX3RhX25ld19wKSwgJmluZm8pICE9IDApCisJbGlicmFyeSA9IGluZm8uZGxpX2ZuYW1lOwogCi0gICAgICBnb3RvIHF1aXQ7CisgICAgICAvKiBUcnkgZGxpbmZvPyAgKi8KKworICAgICAgaWYgKGxpYnJhcnkgPT0gTlVMTCkKKwkvKiBQYXJhbm9pZCAtIGRvbid0IGxldCBhIE5VTEwgcGF0aCBzbGlwIHRocm91Z2guICAqLworCWxpYnJhcnkgPSBMSUJUSFJFQURfREJfU087CisKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkIChfKCJVc2luZyBob3N0IGxpYnRocmVhZF9kYiBsaWJyYXJ5IFwiJXNcIi5cbiIpLAorCQkJIGxpYnJhcnkpOworICAgICAgYWxyZWFkeV9sb2FkZWQgPSAxOwogICAgIH0KIAogICBpZiAodXNpbmdfdGhyZWFkX2RiKQogICAgIC8qIE5vdGhpbmcgdG8gZG8uICBUaGUgdGhyZWFkIGxpYnJhcnkgd2FzIGFscmVhZHkgZGV0ZWN0ZWQgYW5kIHRoZQogICAgICAgIHRhcmdldCB2ZWN0b3Igd2FzIGFscmVhZHkgYWN0aXZhdGVkLiAgKi8KLSAgICBnb3RvIHF1aXQ7CisgICAgcmV0dXJuOwogCi0gIC8qIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSB0aGF0IGlkZW50aWZpZXMgdGhlIGNoaWxkIHByb2Nlc3MuICBOb3RlCi0gICAgIHRoYXQgYXQgdGhpcyBwb2ludCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEKLSAgICAgY2hpbGQgcHJvY2Vzcy4gICovCisgIC8qIERvbid0IGF0dGVtcHQgdG8gdXNlIHRocmVhZF9kYiBvbiB0YXJnZXRzIHdoaWNoIGNhbiBub3QgcnVuCisgICAgIChleGVjdXRhYmxlcyBub3QgcnVubmluZyB5ZXQsIGNvcmUgZmlsZXMpIGZvciBub3cuICAqLworICBpZiAoIXRhcmdldF9oYXNfZXhlY3V0aW9uKQorICAgIHJldHVybjsKKworICAvKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgdGhhdCBpZGVudGlmaWVzIHRoZSBjaGlsZCBwcm9jZXNzLiAgKi8KICAgcHJvY19oYW5kbGUucGlkID0gR0VUX1BJRCAoaW5mZXJpb3JfcHRpZCk7CiAKICAgLyogTm93IGF0dGVtcHQgdG8gb3BlbiBhIGNvbm5lY3Rpb24gdG8gdGhlIHRocmVhZCBsaWJyYXJ5LiAgKi8KQEAgLTcwNSw4ICs2OTYsMTQgQEAKIAkgICAgICAgdGhyZWFkX2RiX2Vycl9zdHIgKGVycikpOwogICAgICAgYnJlYWs7CiAgICAgfQorfQogCi1xdWl0Ogorc3RhdGljIHZvaWQKK3RocmVhZF9kYl9uZXdfb2JqZmlsZSAoc3RydWN0IG9iamZpbGUgKm9iamZpbGUpCit7CisgIGlmIChvYmpmaWxlICE9IE5VTEwpCisgICAgY2hlY2tfZm9yX3RocmVhZF9kYiAoKTsKKwogICBpZiAodGFyZ2V0X25ld19vYmpmaWxlX2NoYWluKQogICAgIHRhcmdldF9uZXdfb2JqZmlsZV9jaGFpbiAob2JqZmlsZSk7CiB9CmRpZmYgLS1naXQgYS9nZGIvbTMyci1yb20uYyBiL2dkYi9tMzJyLXJvbS5jCmluZGV4IGNhOGIyOWUuLmEzMWUwZDIgMTAwNjQ0Ci0tLSBhL2dkYi9tMzJyLXJvbS5jCisrKyBiL2dkYi9tMzJyLXJvbS5jCkBAIC00NiwxMiArNDYsMTYgQEAKIC8qCiAgKiBBbGwgdGhpcyBzdHVmZiBqdXN0IHRvIGdldCBteSBob3N0IGNvbXB1dGVyJ3MgSVAgYWRkcmVzcyEKICAqLworI2lmZGVmIF9fTUlOR1czMl9fCisjaW5jbHVkZSA8d2luc29jay5oPgorI2Vsc2UKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgkJLyogZm9yIGhvc3RlbnQgKi8KICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CQkvKiBmb3Igc3RydWN0IGluX2FkZHIgKi8KICNpZiAxCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CQkvKiBmb3IgaW5ldF9udG9hICovCiAjZW5kaWYKKyNlbmRpZgogCiBzdGF0aWMgY2hhciAqYm9hcmRfYWRkcjsJLyogdXNlci1zZXR0YWJsZSBJUCBhZGRyZXNzIGZvciBNMzJSLUVWQSAqLwogc3RhdGljIGNoYXIgKnNlcnZlcl9hZGRyOwkvKiB1c2VyLXNldHRhYmxlIElQIGFkZHJlc3MgZm9yIGdkYiBob3N0ICovCkBAIC00MzUsNiArNDM5LDEzIEBACiAgICAgfQogICBpZiAoc2VydmVyX2FkZHIgPT0gMCkKICAgICB7CisjaWZkZWYgX19NSU5HVzMyX18KKyAgICAgIFdTQURBVEEgd2Q7CisgICAgICAvKiBXaW5zb2NrIGluaXRpYWxpemF0aW9uLiAqLworICAgICAgaWYgKFdTQVN0YXJ0dXAgKE1BS0VXT1JEICgxLCAxKSwgJndkKSkKKwllcnJvciAoXygiQ291bGRuJ3QgaW5pdGlhbGl6ZSBXSU5TT0NLLiIpKTsKKyNlbmRpZgorCiAgICAgICBidWZbMF0gPSAwOwogICAgICAgZ2V0aG9zdG5hbWUgKGJ1Ziwgc2l6ZW9mIChidWYpKTsKICAgICAgIGlmIChidWZbMF0gIT0gMCkKZGlmZiAtLWdpdCBhL2dkYi9tMzJyLXN0dWIuYyBiL2dkYi9tMzJyLXN0dWIuYwppbmRleCBjNzAzM2VhLi40ZDU0ZjcyIDEwMDY0NAotLS0gYS9nZGIvbTMyci1zdHViLmMKKysrIGIvZ2RiL20zMnItc3R1Yi5jCkBAIC02MDUsNyArNjA1LDcgQEAKICAgICAgIGNvdW50ID0gMDsKIAogICAgICAgLyogbm93LCByZWFkIHVudGlsIGEgIyBvciBlbmQgb2YgYnVmZmVyIGlzIGZvdW5kICovCi0gICAgICB3aGlsZSAoY291bnQgPCBCVUZNQVgpCisgICAgICB3aGlsZSAoY291bnQgPCBCVUZNQVggLSAxKQogCXsKIAkgIGNoID0gZ2V0RGVidWdDaGFyICgpOwogCSAgaWYgKGNoID09ICckJykKZGlmZiAtLWdpdCBhL2dkYi9tMzJyLXRkZXAuYyBiL2dkYi9tMzJyLXRkZXAuYwppbmRleCBjOTVkYmQxLi5lNzkyYzRjIDEwMDY0NAotLS0gYS9nZGIvbTMyci10ZGVwLmMKKysrIGIvZ2RiL20zMnItdGRlcC5jCkBAIC04MSwxMCArODEsMTIgQEAKICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRha2UgY2FyZSBvZiB0aGlzIGJlaGF2aW9yLiAqLwogCiBzdGF0aWMgaW50Ci1tMzJyX21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGJmZF9ieXRlICpjb250ZW50c19jYWNoZSkKK20zMnJfbWVtb3J5X2luc2VydF9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCkKIHsKKyAgQ09SRV9BRERSIGFkZHIgPSBicF90Z3QtPnBsYWNlZF9hZGRyZXNzOwogICBpbnQgdmFsOwogICBnZGJfYnl0ZSBidWZbNF07CisgIGdkYl9ieXRlICpjb250ZW50c19jYWNoZSA9IGJwX3RndC0+c2hhZG93X2NvbnRlbnRzOwogICBnZGJfYnl0ZSBicF9lbnRyeVtdID0geyAweDEwLCAweGYxIH07CS8qIGRwdCAqLwogCiAgIC8qIFNhdmUgdGhlIG1lbW9yeSBjb250ZW50cy4gICovCkBAIC05Miw2ICs5NCw4IEBACiAgIGlmICh2YWwgIT0gMCkKICAgICByZXR1cm4gdmFsOwkJCS8qIHJldHVybiBlcnJvciAqLwogCisgIGJwX3RndC0+cGxhY2VkX3NpemUgPSBicF90Z3QtPnNoYWRvd19sZW4gPSA0OworCiAgIC8qIERldGVybWluZSBhcHByb3ByaWF0ZSBicmVha3BvaW50IGNvbnRlbnRzIGFuZCBzaXplIGZvciB0aGlzIGFkZHJlc3MuICAqLwogICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQkZEX0VORElBTl9CSUcpCiAgICAgewpAQCAtMTM0LDEwICsxMzgsMTIgQEAKIH0KIAogc3RhdGljIGludAotbTMycl9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBiZmRfYnl0ZSAqY29udGVudHNfY2FjaGUpCittMzJyX21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CisgIENPUkVfQUREUiBhZGRyID0gYnBfdGd0LT5wbGFjZWRfYWRkcmVzczsKICAgaW50IHZhbDsKICAgZ2RiX2J5dGUgYnVmWzRdOworICBnZGJfYnl0ZSAqY29udGVudHNfY2FjaGUgPSBicF90Z3QtPnNoYWRvd19jb250ZW50czsKIAogICBidWZbMF0gPSBjb250ZW50c19jYWNoZVswXTsKICAgYnVmWzFdID0gY29udGVudHNfY2FjaGVbMV07CmRpZmYgLS1naXQgYS9nZGIvbTY4ay1zdHViLmMgYi9nZGIvbTY4ay1zdHViLmMKaW5kZXggNTRlMDZiMS4uNGVmNDA2OSAxMDA2NDQKLS0tIGEvZ2RiL202OGstc3R1Yi5jCisrKyBiL2dkYi9tNjhrLXN0dWIuYwpAQCAtNTUzLDcgKzU1Myw3IEBACiAgICAgICBjb3VudCA9IDA7CiAKICAgICAgIC8qIG5vdywgcmVhZCB1bnRpbCBhICMgb3IgZW5kIG9mIGJ1ZmZlciBpcyBmb3VuZCAqLwotICAgICAgd2hpbGUgKGNvdW50IDwgQlVGTUFYKQorICAgICAgd2hpbGUgKGNvdW50IDwgQlVGTUFYIC0gMSkKIAl7CiAJICBjaCA9IGdldERlYnVnQ2hhciAoKTsKIAkgIGlmIChjaCA9PSAnJCcpCmRpZmYgLS1naXQgYS9nZGIvbTY4a2xpbnV4LXRkZXAuYyBiL2dkYi9tNjhrbGludXgtdGRlcC5jCmluZGV4IDZkYTRkMTUuLjNmM2E0ZDkgMTAwNjQ0Ci0tLSBhL2dkYi9tNjhrbGludXgtdGRlcC5jCisrKyBiL2dkYi9tNjhrbGludXgtdGRlcC5jCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkJCQkJIGludCByZWdudW0sIGludCAqb3B0aW1pemVkcCwKIAkJCQkJIGVudW0gbHZhbF90eXBlICpsdmFscCwKIAkJCQkJIENPUkVfQUREUiAqYWRkcnAsCi0JCQkJCSBpbnQgKnJlYWxudW1wLCB2b2lkICp2YWx1ZXApCisJCQkJCSBpbnQgKnJlYWxudW1wLCBnZGJfYnl0ZSAqdmFsdWVwKQogewogICAvKiBNYWtlIHN1cmUgd2UndmUgaW5pdGlhbGl6ZWQgdGhlIGNhY2hlLiAgKi8KICAgc3RydWN0IHRyYWRfZnJhbWVfY2FjaGUgKmNhY2hlID0KZGlmZiAtLWdpdCBhL2dkYi9tZW0tYnJlYWsuYyBiL2dkYi9tZW0tYnJlYWsuYwppbmRleCA4MTBmOGFlLi4yZDk4NTFiIDEwMDY0NAotLS0gYS9nZGIvbWVtLWJyZWFrLmMKKysrIGIvZ2RiL21lbS1icmVhay5jCkBAIC0zMyw2MCArMzMsNTcgQEAKICNpbmNsdWRlICJ0YXJnZXQuaCIKIAogCi0vKiBJbnNlcnQgYSBicmVha3BvaW50IG9uIHRhcmdldHMgdGhhdCBkb24ndCBoYXZlIGFueSBiZXR0ZXIgYnJlYWtwb2ludAotICAgc3VwcG9ydC4gIFdlIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YXJnZXQgbG9jYXRpb24gYW5kIHN0YXNoIGl0LAotICAgdGhlbiBvdmVyd3JpdGUgaXQgd2l0aCBhIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICBBRERSIGlzIHRoZSB0YXJnZXQKLSAgIGxvY2F0aW9uIGluIHRoZSB0YXJnZXQgbWFjaGluZS4gIENPTlRFTlRTX0NBQ0hFIGlzIGEgcG9pbnRlciB0byAKLSAgIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHNhdmluZyB0aGUgdGFyZ2V0IGNvbnRlbnRzLiAgSXQgaXMgZ3VhcmFudGVlZAotICAgYnkgdGhlIGNhbGxlciB0byBiZSBsb25nIGVub3VnaCB0byBzYXZlIEJSRUFLUE9JTlRfTEVOIGJ5dGVzICh0aGlzCi0gICBpcyBhY2NvbXBsaXNoZWQgdmlhIEJSRUFLUE9JTlRfTUFYKS4gICovCisvKiBJbnNlcnQgYSBicmVha3BvaW50IG9uIHRhcmdldHMgdGhhdCBkb24ndCBoYXZlIGFueSBiZXR0ZXIKKyAgIGJyZWFrcG9pbnQgc3VwcG9ydC4gIFdlIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YXJnZXQgbG9jYXRpb24KKyAgIGFuZCBzdGFzaCBpdCwgdGhlbiBvdmVyd3JpdGUgaXQgd2l0aCBhIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uCisgICBCUF9UR1QtPnBsYWNlZF9hZGRyZXNzIGlzIHRoZSB0YXJnZXQgbG9jYXRpb24gaW4gdGhlIHRhcmdldAorICAgbWFjaGluZS4gIEJQX1RHVC0+c2hhZG93X2NvbnRlbnRzIGlzIHNvbWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IKKyAgIHNhdmluZyB0aGUgdGFyZ2V0IGNvbnRlbnRzLiAgSXQgaXMgZ3VhcmFudGVlZCBieSB0aGUgY2FsbGVyIHRvIGJlCisgICBsb25nIGVub3VnaCB0byBzYXZlIEJSRUFLUE9JTlRfTEVOIGJ5dGVzICh0aGlzIGlzIGFjY29tcGxpc2hlZCB2aWEKKyAgIEJSRUFLUE9JTlRfTUFYKS4gICovCiAKIGludAotZGVmYXVsdF9tZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBiZmRfYnl0ZSAqY29udGVudHNfY2FjaGUpCitkZWZhdWx0X21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CiAgIGludCB2YWw7CiAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOwogICBpbnQgYnBsZW47CiAKICAgLyogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGJyZWFrcG9pbnQgY29udGVudHMgYW5kIHNpemUgZm9yIHRoaXMgYWRkcmVzcy4gICovCi0gIGJwID0gQlJFQUtQT0lOVF9GUk9NX1BDICgmYWRkciwgJmJwbGVuKTsKKyAgYnAgPSBCUkVBS1BPSU5UX0ZST01fUEMgKCZicF90Z3QtPnBsYWNlZF9hZGRyZXNzLCAmYnBfdGd0LT5wbGFjZWRfc2l6ZSk7CiAgIGlmIChicCA9PSBOVUxMKQogICAgIGVycm9yIChfKCJTb2Z0d2FyZSBicmVha3BvaW50cyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0LiIpKTsKIAogICAvKiBTYXZlIHRoZSBtZW1vcnkgY29udGVudHMuICAqLwotICB2YWwgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIsIGNvbnRlbnRzX2NhY2hlLCBicGxlbik7CisgIGJwX3RndC0+c2hhZG93X2xlbiA9IGJwX3RndC0+cGxhY2VkX3NpemU7CisgIHZhbCA9IHRhcmdldF9yZWFkX21lbW9yeSAoYnBfdGd0LT5wbGFjZWRfYWRkcmVzcywgYnBfdGd0LT5zaGFkb3dfY29udGVudHMsCisJCQkgICAgYnBfdGd0LT5wbGFjZWRfc2l6ZSk7CiAKICAgLyogV3JpdGUgdGhlIGJyZWFrcG9pbnQuICAqLwogICBpZiAodmFsID09IDApCi0gICAgdmFsID0gdGFyZ2V0X3dyaXRlX21lbW9yeSAoYWRkciwgYnAsIGJwbGVuKTsKKyAgICB2YWwgPSB0YXJnZXRfd3JpdGVfbWVtb3J5IChicF90Z3QtPnBsYWNlZF9hZGRyZXNzLCBicCwKKwkJCSAgICAgICBicF90Z3QtPnBsYWNlZF9zaXplKTsKIAogICByZXR1cm4gdmFsOwogfQogCiAKIGludAotZGVmYXVsdF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBiZmRfYnl0ZSAqY29udGVudHNfY2FjaGUpCitkZWZhdWx0X21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7Ci0gIGNvbnN0IGJmZF9ieXRlICpicDsKLSAgaW50IGJwbGVuOwotCi0gIC8qIERldGVybWluZSBhcHByb3ByaWF0ZSBicmVha3BvaW50IGNvbnRlbnRzIGFuZCBzaXplIGZvciB0aGlzIGFkZHJlc3MuICAqLwotICBicCA9IEJSRUFLUE9JTlRfRlJPTV9QQyAoJmFkZHIsICZicGxlbik7Ci0gIGlmIChicCA9PSBOVUxMKQotICAgIGVycm9yIChfKCJTb2Z0d2FyZSBicmVha3BvaW50cyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0LiIpKTsKLQotICByZXR1cm4gdGFyZ2V0X3dyaXRlX21lbW9yeSAoYWRkciwgY29udGVudHNfY2FjaGUsIGJwbGVuKTsKKyAgcmV0dXJuIHRhcmdldF93cml0ZV9tZW1vcnkgKGJwX3RndC0+cGxhY2VkX2FkZHJlc3MsIGJwX3RndC0+c2hhZG93X2NvbnRlbnRzLAorCQkJICAgICAgYnBfdGd0LT5wbGFjZWRfc2l6ZSk7CiB9CiAKIAogaW50Ci1tZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBiZmRfYnl0ZSAqY29udGVudHNfY2FjaGUpCittZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewotICByZXR1cm4gTUVNT1JZX0lOU0VSVF9CUkVBS1BPSU5UKGFkZHIsIGNvbnRlbnRzX2NhY2hlKTsKKyAgcmV0dXJuIE1FTU9SWV9JTlNFUlRfQlJFQUtQT0lOVCAoYnBfdGd0KTsKIH0KIAogaW50Ci1tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBiZmRfYnl0ZSAqY29udGVudHNfY2FjaGUpCittZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewotICByZXR1cm4gTUVNT1JZX1JFTU9WRV9CUkVBS1BPSU5UKGFkZHIsIGNvbnRlbnRzX2NhY2hlKTsKKyAgcmV0dXJuIE1FTU9SWV9SRU1PVkVfQlJFQUtQT0lOVCAoYnBfdGd0KTsKIH0KZGlmZiAtLWdpdCBhL2dkYi9taXBzLXRkZXAuYyBiL2dkYi9taXBzLXRkZXAuYwppbmRleCA4ODBkZmNjLi5kY2I0NDA2IDEwMDY0NAotLS0gYS9nZGIvbWlwcy10ZGVwLmMKKysrIGIvZ2RiL21pcHMtdGRlcC5jCkBAIC0yMTg4LDIwICsyMTg4LDE3IEBACiB2b2lkCiBtaXBzX3NvZnR3YXJlX3NpbmdsZV9zdGVwIChlbnVtIHRhcmdldF9zaWduYWwgc2lnLCBpbnQgaW5zZXJ0X2JyZWFrcG9pbnRzX3ApCiB7Ci0gIHN0YXRpYyBDT1JFX0FERFIgbmV4dF9wYzsKLSAgdHlwZWRlZiBjaGFyIGJpbnNuX3F1YW50dW1bQlJFQUtQT0lOVF9NQVhdOwotICBzdGF0aWMgYmluc25fcXVhbnR1bSBicmVha19tZW07Ci0gIENPUkVfQUREUiBwYzsKKyAgQ09SRV9BRERSIHBjLCBuZXh0X3BjOwogCiAgIGlmIChpbnNlcnRfYnJlYWtwb2ludHNfcCkKICAgICB7CiAgICAgICBwYyA9IHJlYWRfcmVnaXN0ZXIgKG1pcHNfcmVnbnVtIChjdXJyZW50X2dkYmFyY2gpLT5wYyk7CiAgICAgICBuZXh0X3BjID0gbWlwc19uZXh0X3BjIChwYyk7CiAKLSAgICAgIHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAobmV4dF9wYywgYnJlYWtfbWVtKTsKKyAgICAgIGluc2VydF9zaW5nbGVfc3RlcF9icmVha3BvaW50IChuZXh0X3BjKTsKICAgICB9CiAgIGVsc2UKLSAgICB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQgKG5leHRfcGMsIGJyZWFrX21lbSk7CisgICAgcmVtb3ZlX3NpbmdsZV9zdGVwX2JyZWFrcG9pbnRzICgpOwogfQogCiAvKiBUZXN0IHdoZXRoZXIgdGhlIFBDIHBvaW50cyB0byB0aGUgcmV0dXJuIGluc3RydWN0aW9uIGF0IHRoZQpkaWZmIC0tZ2l0IGEvZ2RiL21vbml0b3IuYyBiL2dkYi9tb25pdG9yLmMKaW5kZXggM2I3NjE5ZS4uYTZjMDgyMyAxMDA2NDQKLS0tIGEvZ2RiL21vbml0b3IuYworKysgYi9nZGIvbW9uaXRvci5jCkBAIC04NSw4ICs4NSw2IEBACiAJCQkJc3RydWN0IG1lbV9hdHRyaWIgKmF0dHJpYiwKIAkJCQlzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0KTsKIHN0YXRpYyB2b2lkIG1vbml0b3JfZmlsZXNfaW5mbyAoc3RydWN0IHRhcmdldF9vcHMgKm9wcyk7Ci1zdGF0aWMgaW50IG1vbml0b3JfaW5zZXJ0X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBnZGJfYnl0ZSAqc2hhZG93KTsKLXN0YXRpYyBpbnQgbW9uaXRvcl9yZW1vdmVfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpzaGFkb3cpOwogc3RhdGljIHZvaWQgbW9uaXRvcl9raWxsICh2b2lkKTsKIHN0YXRpYyB2b2lkIG1vbml0b3JfbG9hZCAoY2hhciAqZmlsZSwgaW50IGZyb21fdHR5KTsKIHN0YXRpYyB2b2lkIG1vbml0b3JfbW91cm5faW5mZXJpb3IgKHZvaWQpOwpAQCAtMjAzNyw4ICsyMDM1LDkgQEAKIC8qIFRlbGwgdGhlIG1vbml0b3IgdG8gYWRkIGEgYnJlYWtwb2ludC4gICovCiAKIHN0YXRpYyBpbnQKLW1vbml0b3JfaW5zZXJ0X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBnZGJfYnl0ZSAqc2hhZG93KQorbW9uaXRvcl9pbnNlcnRfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CisgIENPUkVfQUREUiBhZGRyID0gYnBfdGd0LT5wbGFjZWRfYWRkcmVzczsKICAgaW50IGk7CiAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOwogICBpbnQgYnBsZW47CkBAIC0yMDUyLDEzICsyMDUxLDE0IEBACiAKICAgLyogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGJyZWFrcG9pbnQgc2l6ZSBmb3IgdGhpcyBhZGRyZXNzLiAgKi8KICAgYnAgPSBnZGJhcmNoX2JyZWFrcG9pbnRfZnJvbV9wYyAoY3VycmVudF9nZGJhcmNoLCAmYWRkciwgJmJwbGVuKTsKKyAgYnBfdGd0LT5wbGFjZWRfYWRkcmVzcyA9IGFkZHI7CisgIGJwX3RndC0+cGxhY2VkX3NpemUgPSBicGxlbjsKIAogICBmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9tb25pdG9yLT5udW1fYnJlYWtwb2ludHM7IGkrKykKICAgICB7CiAgICAgICBpZiAoYnJlYWthZGRyW2ldID09IDApCiAJewogCSAgYnJlYWthZGRyW2ldID0gYWRkcjsKLQkgIG1vbml0b3JfcmVhZF9tZW1vcnkgKGFkZHIsIHNoYWRvdywgYnBsZW4pOwogCSAgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+c2V0X2JyZWFrLCBhZGRyKTsKIAkgIG1vbml0b3JfZXhwZWN0X3Byb21wdCAoTlVMTCwgMCk7CiAJICByZXR1cm4gMDsKQEAgLTIwNzEsMTcgKzIwNzEsMTUgQEAKIC8qIFRlbGwgdGhlIG1vbml0b3IgdG8gcmVtb3ZlIGEgYnJlYWtwb2ludC4gICovCiAKIHN0YXRpYyBpbnQKLW1vbml0b3JfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBnZGJfYnl0ZSAqc2hhZG93KQorbW9uaXRvcl9yZW1vdmVfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CisgIENPUkVfQUREUiBhZGRyID0gYnBfdGd0LT5wbGFjZWRfYWRkcmVzczsKICAgaW50IGk7CiAKICAgbW9uaXRvcl9kZWJ1ZyAoIk1PTiBybWJrcHQgJXNcbiIsIHBhZGRyIChhZGRyKSk7CiAgIGlmIChjdXJyZW50X21vbml0b3ItPmNscl9icmVhayA9PSBOVUxMKQogICAgIGVycm9yIChfKCJObyBjbHJfYnJlYWsgZGVmaW5lZCBmb3IgdGhpcyBtb25pdG9yIikpOwogCi0gIGlmIChjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fQUREUl9CSVRTX1JFTU9WRSkKLSAgICBhZGRyID0gQUREUl9CSVRTX1JFTU9WRSAoYWRkcik7Ci0KICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfbW9uaXRvci0+bnVtX2JyZWFrcG9pbnRzOyBpKyspCiAgICAgewogICAgICAgaWYgKGJyZWFrYWRkcltpXSA9PSBhZGRyKQpkaWZmIC0tZ2l0IGEvZ2RiL250by1wcm9jZnMuYyBiL2dkYi9udG8tcHJvY2ZzLmMKaW5kZXggNzg1NGQyYS4uNmRjMDU2YSAxMDA2NDQKLS0tIGEvZ2RiL250by1wcm9jZnMuYworKysgYi9nZGIvbnRvLXByb2Nmcy5jCkBAIC03NiwxMCArNzYsNiBAQAogCiBzdGF0aWMgaW50IHByb2Nmc19jYW5fdXNlX2h3X2JyZWFrcG9pbnQgKGludCwgaW50LCBpbnQpOwogCi1zdGF0aWMgaW50IHByb2Nmc19pbnNlcnRfaHdfYnJlYWtwb2ludCAoQ09SRV9BRERSLCBjaGFyICopOwotCi1zdGF0aWMgaW50IHByb2Nmc19yZW1vdmVfaHdfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGNoYXIgKik7Ci0KIHN0YXRpYyBpbnQgcHJvY2ZzX2luc2VydF9od193YXRjaHBvaW50IChDT1JFX0FERFIgYWRkciwgaW50IGxlbiwgaW50IHR5cGUpOwogCiBzdGF0aWMgaW50IHByb2Nmc19yZW1vdmVfaHdfd2F0Y2hwb2ludCAoQ09SRV9BRERSIGFkZHIsIGludCBsZW4sIGludCB0eXBlKTsKQEAgLTgxMiwyNyArODA4LDI5IEBACiB9CiAKIHN0YXRpYyBpbnQKLXByb2Nmc19pbnNlcnRfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGNoYXIgKmNvbnRlbnRzX2NhY2hlKQorcHJvY2ZzX2luc2VydF9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCkKIHsKLSAgcmV0dXJuIHByb2Nmc19icmVha3BvaW50IChhZGRyLCBfREVCVUdfQlJFQUtfRVhFQywgMCk7CisgIHJldHVybiBwcm9jZnNfYnJlYWtwb2ludCAoYnBfdGd0LT5wbGFjZWRfYWRkcmVzcywgX0RFQlVHX0JSRUFLX0VYRUMsIDApOwogfQogCiBzdGF0aWMgaW50Ci1wcm9jZnNfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBjaGFyICpjb250ZW50c19jYWNoZSkKK3Byb2Nmc19yZW1vdmVfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7Ci0gIHJldHVybiBwcm9jZnNfYnJlYWtwb2ludCAoYWRkciwgX0RFQlVHX0JSRUFLX0VYRUMsIC0xKTsKKyAgcmV0dXJuIHByb2Nmc19icmVha3BvaW50IChicF90Z3QtPnBsYWNlZF9hZGRyZXNzLCBfREVCVUdfQlJFQUtfRVhFQywgLTEpOwogfQogCiBzdGF0aWMgaW50Ci1wcm9jZnNfaW5zZXJ0X2h3X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBjaGFyICpjb250ZW50c19jYWNoZSkKK3Byb2Nmc19pbnNlcnRfaHdfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7Ci0gIHJldHVybiBwcm9jZnNfYnJlYWtwb2ludCAoYWRkciwgX0RFQlVHX0JSRUFLX0VYRUMgfCBfREVCVUdfQlJFQUtfSFcsIDApOworICByZXR1cm4gcHJvY2ZzX2JyZWFrcG9pbnQgKGJwX3RndC0+cGxhY2VkX2FkZHJlc3MsCisJCQkgICAgX0RFQlVHX0JSRUFLX0VYRUMgfCBfREVCVUdfQlJFQUtfSFcsIDApOwogfQogCiBzdGF0aWMgaW50Ci1wcm9jZnNfcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBjaGFyICpjb250ZW50c19jYWNoZSkKK3Byb2Nmc19yZW1vdmVfaHdfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7Ci0gIHJldHVybiBwcm9jZnNfYnJlYWtwb2ludCAoYWRkciwgX0RFQlVHX0JSRUFLX0VYRUMgfCBfREVCVUdfQlJFQUtfSFcsIC0xKTsKKyAgcmV0dXJuIHByb2Nmc19icmVha3BvaW50IChicF90Z3QtPnBsYWNlZF9hZGRyZXNzLAorCQkJICAgIF9ERUJVR19CUkVBS19FWEVDIHwgX0RFQlVHX0JSRUFLX0hXLCAtMSk7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9nZGIvb2NkLmMgYi9nZGIvb2NkLmMKaW5kZXggNzk3MjZkMi4uMTBiMDcwOSAxMDA2NDQKLS0tIGEvZ2RiL29jZC5jCisrKyBiL2dkYi9vY2QuYwpAQCAtMTA0OCwyOCArMTA0OCwyNyBAQAogLyogQkRNIChhdCBsZWFzdCBvbiBDUFUzMikgdXNlcyBhIGRpZmZlcmVudCBicmVha3BvaW50ICovCiAKIGludAotb2NkX2luc2VydF9icmVha3BvaW50IChDT1JFX0FERFIgYWRkciwgY2hhciAqY29udGVudHNfY2FjaGUpCitvY2RfaW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewogICBzdGF0aWMgY2hhciBicmVha19pbnNuW10gPSBCRE1fQlJFQUtQT0lOVDsKICAgaW50IHZhbDsKIAotICB2YWwgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIsIGNvbnRlbnRzX2NhY2hlLCBzaXplb2YgKGJyZWFrX2luc24pKTsKKyAgYnBfdGd0LT5wbGFjZWRfc2l6ZSA9IGJwX3RndC0+c2hhZG93X2xlbiA9IHNpemVvZiAoYnJlYWtfaW5zbik7CisgIHZhbCA9IHRhcmdldF9yZWFkX21lbW9yeSAoYnBfdGd0LT5wbGFjZWRfYWRkcmVzcywgYnBfdGd0LT5zaGFkb3dfY29udGVudHMsCisJCQkgICAgYnBfdGd0LT5wbGFjZWRfc2l6ZSk7CiAKICAgaWYgKHZhbCA9PSAwKQotICAgIHZhbCA9IHRhcmdldF93cml0ZV9tZW1vcnkgKGFkZHIsIGJyZWFrX2luc24sIHNpemVvZiAoYnJlYWtfaW5zbikpOworICAgIHZhbCA9IHRhcmdldF93cml0ZV9tZW1vcnkgKGJwX3RndC0+cGxhY2VkX2FkZHJlc3MsIGJyZWFrX2luc24sCisJCQkgICAgICAgYnBfdGd0LT5wbGFjZWRfc2l6ZSk7CiAKICAgcmV0dXJuIHZhbDsKIH0KIAogaW50Ci1vY2RfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBjaGFyICpjb250ZW50c19jYWNoZSkKK29jZF9yZW1vdmVfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7Ci0gIHN0YXRpYyBjaGFyIGJyZWFrX2luc25bXSA9IEJETV9CUkVBS1BPSU5UOwotICBpbnQgdmFsOwotCi0gIHZhbCA9IHRhcmdldF93cml0ZV9tZW1vcnkgKGFkZHIsIGNvbnRlbnRzX2NhY2hlLCBzaXplb2YgKGJyZWFrX2luc24pKTsKLQotICByZXR1cm4gdmFsOworICByZXR1cm4gdGFyZ2V0X3dyaXRlX21lbW9yeSAoYnBfdGd0LT5wbGFjZWRfYWRkcmVzcywgYnBfdGd0LT5zaGFkb3dfY29udGVudHMsCisJCQkgICAgICBicF90Z3QtPnBsYWNlZF9zaXplKTsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2dkYi9vY2QuaCBiL2dkYi9vY2QuaAppbmRleCAzNWI1NTViLi4wMDc5ODRiIDEwMDY0NAotLS0gYS9nZGIvb2NkLmgKKysrIGIvZ2RiL29jZC5oCkBAIC0xMzUsOCArMTM1LDggQEAKIAogaW50IG9jZF93YWl0ICh2b2lkKTsKIAotaW50IG9jZF9pbnNlcnRfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGNoYXIgKmNvbnRlbnRzX2NhY2hlKTsKLWludCBvY2RfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBjaGFyICpjb250ZW50c19jYWNoZSk7CitpbnQgb2NkX2luc2VydF9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCk7CitpbnQgb2NkX3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCk7CiAKIGludCBvY2Rfd3JpdGVfYnl0ZXMgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4pOwogCmRpZmYgLS1naXQgYS9nZGIvcHBjLWxpbnV4LXRkZXAuYyBiL2dkYi9wcGMtbGludXgtdGRlcC5jCmluZGV4IDA0NTIwODQuLjVlMWJjMDAgMTAwNjQ0Ci0tLSBhL2dkYi9wcGMtbGludXgtdGRlcC5jCisrKyBiL2dkYi9wcGMtbGludXgtdGRlcC5jCkBAIC00NTcsOSArNDU3LDkgQEAKICAgIHJlZ2FyZCB0byByZW1vdmluZyBicmVha3BvaW50cyBpbiBzb21lIHBvdGVudGlhbGx5IHNlbGYgbW9kaWZ5aW5nCiAgICBjb2RlLiAgKi8KIGludAotcHBjX2xpbnV4X21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsCi0JCQkJICAgIGdkYl9ieXRlICpjb250ZW50c19jYWNoZSkKK3BwY19saW51eF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogeworICBDT1JFX0FERFIgYWRkciA9IGJwX3RndC0+cGxhY2VkX2FkZHJlc3M7CiAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOwogICBpbnQgdmFsOwogICBpbnQgYnBsZW47CkBAIC00NzYsNyArNDc2LDcgQEAKICAgICAgcHJvZ3JhbSBtb2RpZmllZCB0aGUgY29kZSBvbiB1cywgc28gaXQgaXMgd3JvbmcgdG8gcHV0IGJhY2sgdGhlCiAgICAgIG9sZCB2YWx1ZSAqLwogICBpZiAodmFsID09IDAgJiYgbWVtY21wIChicCwgb2xkX2NvbnRlbnRzLCBicGxlbikgPT0gMCkKLSAgICB2YWwgPSB0YXJnZXRfd3JpdGVfbWVtb3J5IChhZGRyLCBjb250ZW50c19jYWNoZSwgYnBsZW4pOworICAgIHZhbCA9IHRhcmdldF93cml0ZV9tZW1vcnkgKGFkZHIsIGJwX3RndC0+c2hhZG93X2NvbnRlbnRzLCBicGxlbik7CiAKICAgcmV0dXJuIHZhbDsKIH0KZGlmZiAtLWdpdCBhL2dkYi9wcGMtdGRlcC5oIGIvZ2RiL3BwYy10ZGVwLmgKaW5kZXggMWEyNTY0OC4uZjc4MWYxYiAxMDA2NDQKLS0tIGEvZ2RiL3BwYy10ZGVwLmgKKysrIGIvZ2RiL3BwYy10ZGVwLmgKQEAgLTU2LDggKzU2LDcgQEAKIAkJCQkJICBDT1JFX0FERFIgc3RydWN0X2FkZHIpOwogQ09SRV9BRERSIHBwYzY0X3N5c3ZfYWJpX2FkanVzdF9icmVha3BvaW50X2FkZHJlc3MgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLAogCQkJCQkJICAgIENPUkVfQUREUiBicGFkZHIpOwotaW50IHBwY19saW51eF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLAotCQkJCQlnZGJfYnl0ZSAqY29udGVudHNfY2FjaGUpOworaW50IHBwY19saW51eF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KTsKIHN0cnVjdCBsaW5rX21hcF9vZmZzZXRzICpwcGNfbGludXhfc3ZyNF9mZXRjaF9saW5rX21hcF9vZmZzZXRzICh2b2lkKTsKIHZvaWQgcHBjX2xpbnV4X3N1cHBseV9ncmVnc2V0IChzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlLAogCQkJICAgICAgIGludCByZWdudW0sIGNvbnN0IHZvaWQgKmdyZWdzLCBzaXplX3Qgc2l6ZSwKZGlmZiAtLWdpdCBhL2dkYi9wcm9jZnMuYyBiL2dkYi9wcm9jZnMuYwppbmRleCAxZmQ0NWEzLi4wM2ZjYWRkIDEwMDY0NAotLS0gYS9nZGIvcHJvY2ZzLmMKKysrIGIvZ2RiL3Byb2Nmcy5jCkBAIC0zMzc1LDcgKzMzNzUsNyBAQAogICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGJyZWFrcG9pbnQsIGFuZCB0aGUgY29kZSB0aGF0IHdhcyByZXBsYWNlZCBieQogICAgYSBicmVha3BvaW50LiAgKi8KIHN0YXRpYyBpbnQgZGJ4X2xpbmtfYnB0X2FkZHIgPSAwOwotc3RhdGljIGNoYXIgZGJ4X2xpbmtfc2hhZG93X2NvbnRlbnRzW0JSRUFLUE9JTlRfTUFYXTsKK3N0YXRpYyB2b2lkICpkYnhfbGlua19icHQ7CiAKIC8qCiAgKiBGdW5jdGlvbjogcHJvY2ZzX2RlYnVnX2luZmVyaW9yCkBAIC00Nzc3LDYgKzQ3NzcsMTQgQEAKIAlkZXN0cm95X3Byb2NpbmZvIChwaSk7CiAgICAgfQogICB1bnB1c2hfdGFyZ2V0ICgmcHJvY2ZzX29wcyk7CisKKyAgaWYgKGRieF9saW5rX2JwdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRlcHJlY2F0ZWRfcmVtb3ZlX3Jhd19icmVha3BvaW50IChkYnhfbGlua19icHQpOworICAgICAgZGJ4X2xpbmtfYnB0X2FkZHIgPSAwOworICAgICAgZGJ4X2xpbmtfYnB0ID0gTlVMTDsKKyAgICB9CisKICAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsKIH0KIApAQCAtNDg4Niw3ICs0ODk0LDYgQEAKICAgICAgaGFzIGJlZW4gaW5zZXJ0ZWQsIHRoZSBzeXNzZ2koKSBub3RpZmljYXRpb25zIGFyZSBubyBsb25nZXIgbmVjZXNzYXJ5LAogICAgICBzbyB0aGV5IHNob3VsZCBiZSBjYW5jZWxlZC4gICovCiAgIHByb2NfdHJhY2Vfc3lzY2FsbHNfMSAocGksIFNZU19zeXNzZ2ksIFBSX1NZU0VYSVQsIEZMQUdfU0VULCAwKTsKLSAgZGJ4X2xpbmtfYnB0X2FkZHIgPSAwOwogI2VuZGlmCiB9CiAKQEAgLTU1NzEsMTEgKzU1NzgsMTEgQEAKICAgaWYgKGRieF9saW5rX2JwdF9hZGRyID09IDApCiAgICAgcmV0dXJuOwogCi0gIGlmIChtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKGRieF9saW5rX2JwdF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnhfbGlua19zaGFkb3dfY29udGVudHMpICE9IDApCisgIGlmIChkZXByZWNhdGVkX3JlbW92ZV9yYXdfYnJlYWtwb2ludCAoZGJ4X2xpbmtfYnB0KSAhPSAwKQogICAgIHdhcm5pbmcgKF8oIlVuYWJsZSB0byByZW1vdmUgX19kYnhfbGluayBicmVha3BvaW50LiIpKTsKIAogICBkYnhfbGlua19icHRfYWRkciA9IDA7CisgIGRieF9saW5rX2JwdCA9IE5VTEw7CiB9CiAKIC8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgX19kYnhfbGluaygpIGZ1bmN0aW9uIGluIHRoZSBmaWxlCkBAIC01NjQzLDcgKzU2NTAsOCBAQAogICAgIHsKICAgICAgIC8qIEluc2VydCB0aGUgYnJlYWtwb2ludC4gICovCiAgICAgICBkYnhfbGlua19icHRfYWRkciA9IHN5bV9hZGRyOwotICAgICAgaWYgKHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoc3ltX2FkZHIsIGRieF9saW5rX3NoYWRvd19jb250ZW50cykgIT0gMCkKKyAgICAgIGRieF9saW5rX2JwdCA9IGRlcHJlY2F0ZWRfaW5zZXJ0X3Jhd19icmVha3BvaW50IChzeW1fYWRkcik7CisgICAgICBpZiAoZGJ4X2xpbmtfYnB0ID09IE5VTEwpCiAgICAgICAgIHsKICAgICAgICAgICB3YXJuaW5nIChfKCJGYWlsZWQgdG8gaW5zZXJ0IGRieF9saW5rIGJyZWFrcG9pbnQuIikpOwogICAgICAgICAgIGJmZF9jbG9zZSAoYWJmZCk7CmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLWU3MDAwLmMgYi9nZGIvcmVtb3RlLWU3MDAwLmMKaW5kZXggMDlhOTQ2MC4uYzE1NzVjYSAxMDA2NDQKLS0tIGEvZ2RiL3JlbW90ZS1lNzAwMC5jCisrKyBiL2dkYi9yZW1vdGUtZTcwMDAuYwpAQCAtMTcwMiw4ICsxNzAyLDkgQEAKIHswfTsKIAogc3RhdGljIGludAotZTcwMDBfaW5zZXJ0X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBiZmRfYnl0ZSAqc2hhZG93KQorZTcwMDBfaW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogeworICBDT1JFX0FERFIgYWRkciA9IGJwX3RndC0+cGxhY2VkX2FkZHJlc3M7CiAgIGludCBpOwogICBjaGFyIGJ1ZlsyMDBdOwogI2lmIDAKQEAgLTE3MjgsNyArMTcyOSw4IEBACiAJICB9CiAjZWxzZQogI2lmIDAKLQllNzAwMF9yZWFkX2luZmVyaW9yX21lbW9yeSAoYWRkciwgc2hhZG93LCAyKTsKKwlicF90Z3QtPnNoYWRvd19sZW4gPSAyOworCWU3MDAwX3JlYWRfaW5mZXJpb3JfbWVtb3J5IChhZGRyLCBicF90Z3QtPnNoYWRvd19jb250ZW50cywgMik7CiAJZTcwMDBfd3JpdGVfaW5mZXJpb3JfbWVtb3J5IChhZGRyLCBub3AsIDIpOwogI2VuZGlmCiAKQEAgLTE3NDUsOCArMTc0Nyw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLWU3MDAwX3JlbW92ZV9icmVha3BvaW50IChDT1JFX0FERFIgYWRkciwgYmZkX2J5dGUgKnNoYWRvdykKK2U3MDAwX3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCkKIHsKKyAgQ09SRV9BRERSIGFkZHIgPSBicF90Z3QtPnBsYWNlZF9hZGRyZXNzOwogICBpbnQgaTsKICAgY2hhciBidWZbMjAwXTsKIApAQCAtMTc3Myw3ICsxNzc2LDggQEAKIAogI2lmIDAKIAkvKiBSZXBsYWNlIHRoZSBpbnNuIHVuZGVyIHRoZSBicmVhayAqLwotCWU3MDAwX3dyaXRlX2luZmVyaW9yX21lbW9yeSAoYWRkciwgc2hhZG93LCAyKTsKKwllNzAwMF93cml0ZV9pbmZlcmlvcl9tZW1vcnkgKGFkZHIsIGJwX3RndC0+c2hhZG93X2NvbnRlbnRzLAorCQkJCSAgICAgYnBfdGd0LT5zaGFkb3dfbGVuKTsKICNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2dkYi9yZW1vdGUtbTMyci1zZGkuYyBiL2dkYi9yZW1vdGUtbTMyci1zZGkuYwppbmRleCA5ZWY1MjZmLi5iMjAzMzE2IDEwMDY0NAotLS0gYS9nZGIvcmVtb3RlLW0zMnItc2RpLmMKKysrIGIvZ2RiL3JlbW90ZS1tMzJyLXNkaS5jCkBAIC0zMSw3ICszMSwxMSBAQAogI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIF9fTUlOR1czMl9fCisjaW5jbHVkZSA8d2luc29jay5oPgorI2Vsc2UKICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgpAQCAtMTE0MSwxNSArMTE0NSwxNiBAQAogfQogCiBzdGF0aWMgaW50Ci1tMzJyX2luc2VydF9icmVha3BvaW50IChDT1JFX0FERFIgYWRkciwgYmZkX2J5dGUgKnNoYWRvdykKK20zMnJfaW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogeworICBDT1JFX0FERFIgYWRkciA9IGJwX3RndC0+cGxhY2VkX2FkZHJlc3M7CiAgIGludCBpYl9icmVha3BvaW50czsKICAgdW5zaWduZWQgY2hhciBidWZbMTNdOwogICBpbnQgaSwgYzsKIAogICBpZiAocmVtb3RlX2RlYnVnKQotICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywgIm0zMnJfaW5zZXJ0X2JyZWFrcG9pbnQoJTA4bHgsXCIlc1wiKVxuIiwKLQkJCWFkZHIsIHNoYWRvdyk7CisgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLCAibTMycl9pbnNlcnRfYnJlYWtwb2ludCglMDhseCwuLi4pXG4iLAorCQkJYWRkcik7CiAKICAgaWYgKHVzZV9pYl9icmVha3BvaW50cykKICAgICBpYl9icmVha3BvaW50cyA9IG1heF9pYl9icmVha3BvaW50czsKQEAgLTExODMsMTMgKzExODgsMTQgQEAKIH0KIAogc3RhdGljIGludAotbTMycl9yZW1vdmVfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGJmZF9ieXRlICpzaGFkb3cpCittMzJyX3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCkKIHsKKyAgQ09SRV9BRERSIGFkZHIgPSBicF90Z3QtPnBsYWNlZF9hZGRyZXNzOwogICBpbnQgaTsKIAogICBpZiAocmVtb3RlX2RlYnVnKQotICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywgIm0zMnJfcmVtb3ZlX2JyZWFrcG9pbnQoJTA4bHgsXCIlc1wiKVxuIiwKLQkJCWFkZHIsIHNoYWRvdyk7CisgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLCAibTMycl9yZW1vdmVfYnJlYWtwb2ludCglMDhseClcbiIsCisJCQlhZGRyKTsKIAogICBmb3IgKGkgPSAwOyBpIDwgTUFYX0JSRUFLUE9JTlRTOyBpKyspCiAgICAgewpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1taXBzLmMgYi9nZGIvcmVtb3RlLW1pcHMuYwppbmRleCBlNDdhYTZlLi4xMTQ0ZThkIDEwMDY0NAotLS0gYS9nZGIvcmVtb3RlLW1pcHMuYworKysgYi9nZGIvcmVtb3RlLW1pcHMuYwpAQCAtMjIxNiwyNyArMjIxNiwyOCBAQAogLyogSW5zZXJ0IGEgYnJlYWtwb2ludC4gIE9uIHRhcmdldHMgdGhhdCBkb24ndCBoYXZlIGJ1aWx0LWluCiAgICBicmVha3BvaW50IHN1cHBvcnQsIHdlIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YXJnZXQgbG9jYXRpb24gYW5kCiAgICBzdGFzaCBpdCwgdGhlbiBvdmVyd3JpdGUgaXQgd2l0aCBhIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICBBRERSIGlzCi0gICB0aGUgdGFyZ2V0IGxvY2F0aW9uIGluIHRoZSB0YXJnZXQgbWFjaGluZS4gIENPTlRFTlRTX0NBQ0hFIGlzIGEKLSAgIHBvaW50ZXIgdG8gbWVtb3J5IGFsbG9jYXRlZCBmb3Igc2F2aW5nIHRoZSB0YXJnZXQgY29udGVudHMuICBJdCBpcwotICAgZ3VhcmFudGVlZCBieSB0aGUgY2FsbGVyIHRvIGJlIGxvbmcgZW5vdWdoIHRvIHNhdmUgdGhlIGJyZWFrcG9pbnQKLSAgIGxlbmd0aCByZXR1cm5lZCBieSBCUkVBS1BPSU5UX0ZST01fUEMuICAqLworICAgdGhlIHRhcmdldCBsb2NhdGlvbiBpbiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBCUFQgaXMgdGhlIGJyZWFrcG9pbnQKKyAgIGJlaW5nIGluc2VydGVkIG9yIHJlbW92ZWQsIHdoaWNoIGNvbnRhaW5zIG1lbW9yeSBmb3Igc2F2aW5nIHRoZQorICAgdGFyZ2V0IGNvbnRlbnRzLiAgKi8KIAogc3RhdGljIGludAotbWlwc19pbnNlcnRfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGNoYXIgKmNvbnRlbnRzX2NhY2hlKQorbWlwc19pbnNlcnRfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CiAgIGlmIChtb25pdG9yX3N1cHBvcnRzX2JyZWFrcG9pbnRzKQotICAgIHJldHVybiBzZXRfYnJlYWtwb2ludCAoYWRkciwgTUlQU19JTlNOMzJfU0laRSwgQlJFQUtfRkVUQ0gpOworICAgIHJldHVybiBzZXRfYnJlYWtwb2ludCAoYnBfdGd0LT5wbGFjZWRfYWRkcmVzcywgTUlQU19JTlNOMzJfU0laRSwKKwkJCSAgIEJSRUFLX0ZFVENIKTsKICAgZWxzZQotICAgIHJldHVybiBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKTsKKyAgICByZXR1cm4gbWVtb3J5X2luc2VydF9icmVha3BvaW50IChicF90Z3QpOwogfQogCiBzdGF0aWMgaW50Ci1taXBzX3JlbW92ZV9icmVha3BvaW50IChDT1JFX0FERFIgYWRkciwgY2hhciAqY29udGVudHNfY2FjaGUpCittaXBzX3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCkKIHsKICAgaWYgKG1vbml0b3Jfc3VwcG9ydHNfYnJlYWtwb2ludHMpCi0gICAgcmV0dXJuIGNsZWFyX2JyZWFrcG9pbnQgKGFkZHIsIE1JUFNfSU5TTjMyX1NJWkUsIEJSRUFLX0ZFVENIKTsKKyAgICByZXR1cm4gY2xlYXJfYnJlYWtwb2ludCAoYnBfdGd0LT5wbGFjZWRfYWRkcmVzcywgTUlQU19JTlNOMzJfU0laRSwKKwkJCSAgICAgQlJFQUtfRkVUQ0gpOwogICBlbHNlCi0gICAgcmV0dXJuIG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpOworICAgIHJldHVybiBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKGJwX3RndCk7CiB9CiAKIC8qIFRlbGwgd2hldGhlciB0aGlzIHRhcmdldCBjYW4gc3VwcG9ydCBhIGhhcmR3YXJlIGJyZWFrcG9pbnQuICBDTlQKZGlmZiAtLWdpdCBhL2dkYi9yZW1vdGUtcmRwLmMgYi9nZGIvcmVtb3RlLXJkcC5jCmluZGV4IDY5NTE1NmQuLmU5NDgyMWYgMTAwNjQ0Ci0tLSBhL2dkYi9yZW1vdGUtcmRwLmMKKysrIGIvZ2RiL3JlbW90ZS1yZHAuYwpAQCAtMTA1MCw4ICsxMDUwLDEwIEBACiB9CiAKIHN0YXRpYyBpbnQKLXJlbW90ZV9yZHBfaW5zZXJ0X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBiZmRfYnl0ZSAqc2F2ZSkKK3JlbW90ZV9yZHBfaW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogeworICBDT1JFX0FERFIgYWRkciA9IGJwX3RndC0+cGxhY2VkX2FkZHJlc3M7CisKICAgaW50IHJlczsKICAgaWYgKGRzLnJkaV9sZXZlbCA+IDApCiAgICAgewpAQCAtMTA1OSw3ICsxMDYxLDcgQEAKIAkJUkRQX1NFVF9CUkVBSywKIAkJYWRkciwKIAkJUkRQX1NFVF9CUkVBS19UWVBFX1BDX0VRVUFMIHwgUkRQX1NFVF9CUkVBS19UWVBFX0dFVF9IQU5ETEUsCi0JCXNhdmUsCisJCWJwX3RndC0+c2hhZG93X2NvbnRlbnRzLAogCQkmcmVzKTsKICAgICB9CiAgIGVsc2UKQEAgLTEwNzQsMTQgKzEwNzYsMTUgQEAKIH0KIAogc3RhdGljIGludAotcmVtb3RlX3JkcF9yZW1vdmVfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGJmZF9ieXRlICpzYXZlKQorcmVtb3RlX3JkcF9yZW1vdmVfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CisgIENPUkVfQUREUiBhZGRyID0gYnBfdGd0LT5wbGFjZWRfYWRkcmVzczsKICAgaW50IHJlczsKICAgaWYgKGRzLnJkaV9sZXZlbCA+IDApCiAgICAgewogICAgICAgc2VuZF9yZHAgKCJiLXAtUy1CIiwKIAkJUkRQX0NMRUFSX0JSRUFLLAotCQlzYXZlLCA0LAorCQlicF90Z3QtPnNoYWRvd19jb250ZW50cywgNCwKIAkJJnJlcyk7CiAgICAgfQogICBlbHNlCkBAIC0xMTA4LDEyICsxMTExLDEyIEBACiAgICAgfQogICBlbHNlCiAgICAgewotICAgICAgY2hhciBoYW5kbGVbNF07CisgICAgICB2b2lkICpiOwogICAgICAgQ09SRV9BRERSIHBjID0gcmVhZF9yZWdpc3RlciAoQVJNX1BDX1JFR05VTSk7CiAgICAgICBwYyA9IGFybV9nZXRfbmV4dF9wYyAocGMpOwotICAgICAgcmVtb3RlX3JkcF9pbnNlcnRfYnJlYWtwb2ludCAocGMsIGhhbmRsZSk7CisgICAgICBiID0gZGVwcmVjYXRlZF9pbnNlcnRfcmF3X2JyZWFrcG9pbnQgKHBjKTsKICAgICAgIHJkcF9leGVjdXRlICgpOwotICAgICAgcmVtb3RlX3JkcF9yZW1vdmVfYnJlYWtwb2ludCAocGMsIGhhbmRsZSk7CisgICAgICBkZXByZWNhdGVkX3JlbW92ZV9yYXdfYnJlYWtwb2ludCAoYik7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLXNkcy5jIGIvZ2RiL3JlbW90ZS1zZHMuYwppbmRleCA3NTMzMTA3Li44Mzk0YWU1IDEwMDY0NAotLS0gYS9nZGIvcmVtb3RlLXNkcy5jCisrKyBiL2dkYi9yZW1vdGUtc2RzLmMKQEAgLTk5LDEwICs5OSw2IEBACiAKIHN0YXRpYyBpbnQgcmVhZF9mcmFtZSAoY2hhciAqKTsKIAotc3RhdGljIGludCBzZHNfaW5zZXJ0X2JyZWFrcG9pbnQgKENPUkVfQUREUiwgY2hhciAqKTsKLQotc3RhdGljIGludCBzZHNfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiwgY2hhciAqKTsKLQogc3RhdGljIHZvaWQgaW5pdF9zZHNfb3BzICh2b2lkKTsKIAogc3RhdGljIHZvaWQgc2RzX2NvbW1hbmQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSk7CkBAIC0xMDA0LDggKzEwMDAsOSBAQAogICAgcmVwbGFjZWQgaW5zdHJ1Y3Rpb24gYmFjayB0byB0aGUgZGVidWdnZXIuICAqLwogCiBzdGF0aWMgaW50Ci1zZHNfaW5zZXJ0X2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBjaGFyICpjb250ZW50c19jYWNoZSkKK3Nkc19pbnNlcnRfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CisgIENPUkVfQUREUiBhZGRyID0gYnBfdGd0LT5wbGFjZWRfYWRkcmVzczsKICAgaW50IGksIHJldGxlbjsKICAgdW5zaWduZWQgY2hhciAqcCwgYnVmW1BCVUZTSVpdOwogCkBAIC0xMDIwLDE0ICsxMDE3LDE1IEBACiAgIHJldGxlbiA9IHNkc19zZW5kIChidWYsIHAgLSBidWYpOwogCiAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCi0gICAgY29udGVudHNfY2FjaGVbaV0gPSBidWZbaSArIDJdOworICAgIGJwX3RndC0+c2hhZG93X2NvbnRlbnRzW2ldID0gYnVmW2kgKyAyXTsKIAogICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotc2RzX3JlbW92ZV9icmVha3BvaW50IChDT1JFX0FERFIgYWRkciwgY2hhciAqY29udGVudHNfY2FjaGUpCitzZHNfcmVtb3ZlX2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogeworICBDT1JFX0FERFIgYWRkciA9IGJwX3RndC0+cGxhY2VkX2FkZHJlc3M7CiAgIGludCBpLCByZXRsZW47CiAgIHVuc2lnbmVkIGNoYXIgKnAsIGJ1ZltQQlVGU0laXTsKIApAQCAtMTAzOSw3ICsxMDM3LDcgQEAKICAgKnArKyA9IChpbnQpIChhZGRyID4+IDgpICYgMHhmZjsKICAgKnArKyA9IChpbnQpIChhZGRyKSAmIDB4ZmY7CiAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCi0gICAgKnArKyA9IGNvbnRlbnRzX2NhY2hlW2ldOworICAgICpwKysgPSBicF90Z3QtPnNoYWRvd19jb250ZW50c1tpXTsKIAogICByZXRsZW4gPSBzZHNfc2VuZCAoYnVmLCBwIC0gYnVmKTsKIApkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1zaW0uYyBiL2dkYi9yZW1vdGUtc2ltLmMKaW5kZXggZTk2MDE4ZC4uNGUzNmY1NCAxMDA2NDQKLS0tIGEvZ2RiL3JlbW90ZS1zaW0uYworKysgYi9nZGIvcmVtb3RlLXNpbS5jCkBAIC04MDUsMTggKzgwNSw2IEBACiAgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7CiB9CiAKLXN0YXRpYyBpbnQKLWdkYnNpbV9pbnNlcnRfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGJmZF9ieXRlICpjb250ZW50c19jYWNoZSkKLXsKLSAgcmV0dXJuIG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpOwotfQotCi1zdGF0aWMgaW50Ci1nZGJzaW1fcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBiZmRfYnl0ZSAqY29udGVudHNfY2FjaGUpCi17Ci0gIHJldHVybiBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKTsKLX0KLQogLyogUGFzcyB0aGUgY29tbWFuZCBhcmd1bWVudCB0aHJvdWdoIHRvIHRoZSBzaW11bGF0b3IgdmVyYmF0aW0uICBUaGUKICAgIHNpbXVsYXRvciBtdXN0IGRvIGFueSBjb21tYW5kIGludGVycHJldGF0aW9uIHdvcmsuICAqLwogCkBAIC04NjYsOCArODU0LDggQEAKICAgZ2Ric2ltX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gZ2Ric2ltX3ByZXBhcmVfdG9fc3RvcmU7CiAgIGdkYnNpbV9vcHMuZGVwcmVjYXRlZF94ZmVyX21lbW9yeSA9IGdkYnNpbV94ZmVyX2luZmVyaW9yX21lbW9yeTsKICAgZ2Ric2ltX29wcy50b19maWxlc19pbmZvID0gZ2Ric2ltX2ZpbGVzX2luZm87Ci0gIGdkYnNpbV9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSBnZGJzaW1faW5zZXJ0X2JyZWFrcG9pbnQ7Ci0gIGdkYnNpbV9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSBnZGJzaW1fcmVtb3ZlX2JyZWFrcG9pbnQ7CisgIGdkYnNpbV9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQ7CisgIGdkYnNpbV9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ7CiAgIGdkYnNpbV9vcHMudG9fa2lsbCA9IGdkYnNpbV9raWxsOwogICBnZGJzaW1fb3BzLnRvX2xvYWQgPSBnZGJzaW1fbG9hZDsKICAgZ2Ric2ltX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSBnZGJzaW1fY3JlYXRlX2luZmVyaW9yOwpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1zdC5jIGIvZ2RiL3JlbW90ZS1zdC5jCmluZGV4IGM3YzM5YTEuLmMyYmNmM2QgMTAwNjQ0Ci0tLSBhL2dkYi9yZW1vdGUtc3QuYworKysgYi9nZGIvcmVtb3RlLXN0LmMKQEAgLTU5OSwyMCArNTk5LDE2IEBACiB7MH07CiAKIHN0YXRpYyBpbnQKLXN0MjAwMF9pbnNlcnRfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGNoYXIgKnNoYWRvdykKK3N0MjAwMF9pbnNlcnRfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CisgIENPUkVfQUREUiBhZGRyID0gYnBfdGd0LT5wbGFjZWRfYWRkcmVzczsKICAgaW50IGk7Ci0gIENPUkVfQUREUiBicF9hZGRyID0gYWRkcjsKLSAgaW50IGJwX3NpemUgPSAwOwotCi0gIEJSRUFLUE9JTlRfRlJPTV9QQyAoJmJwX2FkZHIsICZicF9zaXplKTsKIAogICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9TVERFQlVHX0JSRUFLUE9JTlRTOyBpKyspCiAgICAgaWYgKGJyZWFrYWRkcltpXSA9PSAwKQogICAgICAgewogCWJyZWFrYWRkcltpXSA9IGFkZHI7CiAKLQlzdDIwMDBfcmVhZF9pbmZlcmlvcl9tZW1vcnkgKGJwX2FkZHIsIHNoYWRvdywgYnBfc2l6ZSk7CiAJcHJpbnRmX3N0ZGVidWcgKCJCUiAleCBIXHIiLCBhZGRyKTsKIAlleHBlY3RfcHJvbXB0ICgxKTsKIAlyZXR1cm4gMDsKQEAgLTYyMyw4ICs2MTksOSBAQAogfQogCiBzdGF0aWMgaW50Ci1zdDIwMDBfcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiBhZGRyLCBjaGFyICpzaGFkb3cpCitzdDIwMDBfcmVtb3ZlX2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogeworICBDT1JFX0FERFIgYWRkciA9IGJwX3RndC0+cGxhY2VkX2FkZHJlc3M7CiAgIGludCBpOwogCiAgIGZvciAoaSA9IDA7IGkgPCBNQVhfU1RERUJVR19CUkVBS1BPSU5UUzsgaSsrKQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS5jIGIvZ2RiL3JlbW90ZS5jCmluZGV4IDU4MmE2YmYuLjIyNTgxYTUgMTAwNjQ0Ci0tLSBhL2dkYi9yZW1vdGUuYworKysgYi9nZGIvcmVtb3RlLmMKQEAgLTYzLDcgKzYzLDcgQEAKIC8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCiBzdGF0aWMgdm9pZCBjbGVhbnVwX3NpZ2ludF9zaWduYWxfaGFuZGxlciAodm9pZCAqZHVtbXkpOwogc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9zaWdpbnRfc2lnbmFsX2hhbmRsZXIgKHZvaWQpOwotc3RhdGljIGludCBnZXRwa3Rfc2FuZSAoY2hhciAqYnVmLCBsb25nIHNpemVvZl9idWYsIGludCBmb3JldmVyKTsKK3N0YXRpYyBpbnQgZ2V0cGt0X3NhbmUgKGNoYXIgKipidWYsIGxvbmcgKnNpemVvZl9idWYsIGludCBmb3JldmVyKTsKIAogc3RhdGljIHZvaWQgaGFuZGxlX3JlbW90ZV9zaWdpbnQgKGludCk7CiBzdGF0aWMgdm9pZCBoYW5kbGVfcmVtb3RlX3NpZ2ludF90d2ljZSAoaW50KTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiBzdGF0aWMgdm9pZCByZW1vdGVfbW91cm5fMSAoc3RydWN0IHRhcmdldF9vcHMgKik7CiAKLXN0YXRpYyB2b2lkIHJlbW90ZV9zZW5kIChjaGFyICpidWYsIGxvbmcgc2l6ZW9mX2J1Zik7CitzdGF0aWMgdm9pZCByZW1vdGVfc2VuZCAoY2hhciAqKmJ1ZiwgbG9uZyAqc2l6ZW9mX2J1Zl9wKTsKIAogc3RhdGljIGludCByZWFkY2hhciAoaW50IHRpbWVvdXQpOwogCkBAIC0xMzIsMTEgKzEzMiw5IEBACiAKIHN0YXRpYyB2b2lkIGdldF9vZmZzZXRzICh2b2lkKTsKIAotc3RhdGljIGxvbmcgcmVhZF9mcmFtZSAoY2hhciAqYnVmLCBsb25nIHNpemVvZl9idWYpOworc3RhdGljIHZvaWQgc2tpcF9mcmFtZSAodm9pZCk7CiAKLXN0YXRpYyBpbnQgcmVtb3RlX2luc2VydF9icmVha3BvaW50IChDT1JFX0FERFIsIGJmZF9ieXRlICopOwotCi1zdGF0aWMgaW50IHJlbW90ZV9yZW1vdmVfYnJlYWtwb2ludCAoQ09SRV9BRERSLCBiZmRfYnl0ZSAqKTsKK3N0YXRpYyBsb25nIHJlYWRfZnJhbWUgKGNoYXIgKipidWZfcCwgbG9uZyAqc2l6ZW9mX2J1Zik7CiAKIHN0YXRpYyBpbnQgaGV4bnVtbGVuIChVTE9OR0VTVCBudW0pOwogCkBAIC0yMjgsNiArMjI2LDE1IEBACiAgIC8qIFRoaXMgaXMgdGhlIG1heGltdW0gc2l6ZSAoaW4gY2hhcnMpIG9mIGEgbm9uIHJlYWQvd3JpdGUgcGFja2V0LgogICAgICBJdCBpcyBhbHNvIHVzZWQgYXMgYSBjYXAgb24gdGhlIHNpemUgb2YgcmVhZC93cml0ZSBwYWNrZXRzLiAgKi8KICAgbG9uZyByZW1vdGVfcGFja2V0X3NpemU7CisKKyAgLyogQSBidWZmZXIgdG8gdXNlIGZvciBpbmNvbWluZyBwYWNrZXRzLCBhbmQgaXRzIGN1cnJlbnQgc2l6ZS4gIFRoZQorICAgICBidWZmZXIgaXMgZ3Jvd24gZHluYW1pY2FsbHkgZm9yIGxhcmdlciBpbmNvbWluZyBwYWNrZXRzLgorICAgICBPdXRnb2luZyBwYWNrZXRzIG1heSBhbHNvIGJlIGNvbnN0cnVjdGVkIGluIHRoaXMgYnVmZmVyLgorICAgICBCVUZfU0laRSBpcyBhbHdheXMgYXQgbGVhc3QgUkVNT1RFX1BBQ0tFVF9TSVpFOworICAgICBSRU1PVEVfUEFDS0VUX1NJWkUgc2hvdWxkIGJlIHVzZWQgdG8gbGltaXQgdGhlIGxlbmd0aCBvZiBvdXRnb2luZworICAgICBwYWNrZXRzLiAgKi8KKyAgY2hhciAqYnVmOworICBsb25nIGJ1Zl9zaXplOwogfTsKIAogCkBAIC0yODYsNiArMjkzLDE0IEBACiAgIC8qIFRoaXMgb25lIGlzIGZpbGxlZCBpbiB3aGVuIGEgYGBnJycgcGFja2V0IGlzIHJlY2VpdmVkLiAgKi8KICAgcnMtPmFjdHVhbF9yZWdpc3Rlcl9wYWNrZXRfc2l6ZSA9IDA7CiAKKyAgLyogQ3JlYXRlIHRoZSBidWZmZXIgYXQgYSBkZWZhdWx0IHNpemUuICBOb3RlIHRoYXQgdGhpcyB3b3VsZAorICAgICBsZWFrIG1lbW9yeSBpZiB0aGUgZ2RiYXJjaCB3ZXJlIGV2ZXIgZGVzdHJveWVkOyB0aGVyZSdzIG5vCisgICAgIHdheSB0byByZWdpc3RlciBhIGRlc3RydWN0b3IgZm9yIGl0LCBhbmQgd2UgY2FuJ3QgcmVhbGxvYworICAgICB1c2luZyB0aGUgZ2RiYXJjaCBvYnN0YWNrLiAgQnV0IGdkYmFyY2hlcyBhcmUgbmV2ZXIKKyAgICAgZGVzdHJveWVkLiAgKi8KKyAgcnMtPmJ1Zl9zaXplID0gcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZTsKKyAgcnMtPmJ1ZiA9IHhtYWxsb2MgKHJzLT5idWZfc2l6ZSk7CisKICAgcmV0dXJuIHJzOwogfQogCkBAIC00MzUsNiArNDUwLDE1IEBACiAgICAgd2hhdF90aGV5X2dldCA9IE1BWF9SRU1PVEVfUEFDS0VUX1NJWkU7CiAgIGlmICh3aGF0X3RoZXlfZ2V0IDwgTUlOX1JFTU9URV9QQUNLRVRfU0laRSkKICAgICB3aGF0X3RoZXlfZ2V0ID0gTUlOX1JFTU9URV9QQUNLRVRfU0laRTsKKworICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgcm9vbSBpbiB0aGUgZ2xvYmFsIGJ1ZmZlciBmb3IgdGhpcyBwYWNrZXQKKyAgICAgKGluY2x1ZGluZyBpdHMgdHJhaWxpbmcgTlVMIGJ5dGUpLiAgKi8KKyAgaWYgKHJzLT5idWZfc2l6ZSA8IHdoYXRfdGhleV9nZXQgKyAxKQorICAgIHsKKyAgICAgIHJzLT5idWZfc2l6ZSA9IDIgKiB3aGF0X3RoZXlfZ2V0OworICAgICAgcnMtPmJ1ZiA9IHhyZWFsbG9jIChycy0+YnVmLCAyICogd2hhdF90aGV5X2dldCk7CisgICAgfQorCiAgIHJldHVybiB3aGF0X3RoZXlfZ2V0OwogfQogCkBAIC04ODQsNyArOTA4LDcgQEAKIHNldF90aHJlYWQgKGludCB0aCwgaW50IGdlbikKIHsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwotICBjaGFyICpidWYgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOworICBjaGFyICpidWYgPSBycy0+YnVmOwogICBpbnQgc3RhdGUgPSBnZW4gPyBnZW5lcmFsX3RocmVhZCA6IGNvbnRpbnVlX3RocmVhZDsKIAogICBpZiAoc3RhdGUgPT0gdGgpCkBAIC05MDIsNyArOTI2LDcgQEAKICAgZWxzZQogICAgIHhzbnByaW50ZiAoJmJ1ZlsyXSwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSAtIDIsICIleCIsIHRoKTsKICAgcHV0cGt0IChidWYpOwotICBnZXRwa3QgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7CisgIGdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDApOwogICBpZiAoZ2VuKQogICAgIGdlbmVyYWxfdGhyZWFkID0gdGg7CiAgIGVsc2UKQEAgLTkxNCwxNSArOTM4LDE2IEBACiBzdGF0aWMgaW50CiByZW1vdGVfdGhyZWFkX2FsaXZlIChwdGlkX3QgcHRpZCkKIHsKKyAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwogICBpbnQgdGlkID0gUElER0VUIChwdGlkKTsKLSAgY2hhciBidWZbMTZdOworICBjaGFyICpidWYgPSBycy0+YnVmOwogCiAgIGlmICh0aWQgPCAwKQotICAgIHhzbnByaW50ZiAoYnVmLCBzaXplb2YgKGJ1ZiksICJULSUwOHgiLCAtdGlkKTsKKyAgICB4c25wcmludGYgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgIlQtJTA4eCIsIC10aWQpOwogICBlbHNlCi0gICAgeHNucHJpbnRmIChidWYsIHNpemVvZiAoYnVmKSwgIlQlMDh4IiwgdGlkKTsKKyAgICB4c25wcmludGYgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgIlQlMDh4IiwgdGlkKTsKICAgcHV0cGt0IChidWYpOwotICBnZXRwa3QgKGJ1Ziwgc2l6ZW9mIChidWYpLCAwKTsKKyAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAgIHJldHVybiAoYnVmWzBdID09ICdPJyAmJiBidWZbMV0gPT0gJ0snKTsKIH0KIApAQCAtMTMzMSw3ICsxMzU2LDcgQEAKICAgaW50IG1hc2ssIGxlbmd0aDsKICAgaW50IHRhZzsKICAgdGhyZWFkcmVmIHJlZjsKLSAgY2hhciAqbGltaXQgPSBwa3QgKyBycy0+cmVtb3RlX3BhY2tldF9zaXplOyAvKiBQbGF1c2libGUgcGFyc2luZyBsaW1pdC4gICovCisgIGNoYXIgKmxpbWl0ID0gcGt0ICsgcnMtPmJ1Zl9zaXplOyAvKiBQbGF1c2libGUgcGFyc2luZyBsaW1pdC4gICovCiAgIGludCByZXR2YWwgPSAxOwogCiAgIC8qIGluZm8tPnRocmVhZGlkID0gMDsgRklYTUU6IGltcGxlbWVudCB6ZXJvX3RocmVhZHJlZi4gICovCkBAIC0xNDIyLDExICsxNDQ3LDExIEBACiB7CiAgIHN0cnVjdCByZW1vdGVfc3RhdGUgKnJzID0gZ2V0X3JlbW90ZV9zdGF0ZSAoKTsKICAgaW50IHJlc3VsdDsKLSAgY2hhciAqdGhyZWFkaW5mb19wa3QgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOworICBjaGFyICp0aHJlYWRpbmZvX3BrdCA9IHJzLT5idWY7CiAKICAgcGFja190aHJlYWRpbmZvX3JlcXVlc3QgKHRocmVhZGluZm9fcGt0LCBmaWVsZHNldCwgdGhyZWFkaWQpOwogICBwdXRwa3QgKHRocmVhZGluZm9fcGt0KTsKLSAgZ2V0cGt0ICh0aHJlYWRpbmZvX3BrdCwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7CisgIGdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDApOwogICByZXN1bHQgPSByZW1vdGVfdW5wYWNrX3RocmVhZF9pbmZvX3Jlc3BvbnNlICh0aHJlYWRpbmZvX3BrdCArIDIsCiAJCQkJCSAgICAgICB0aHJlYWRpZCwgaW5mbyk7CiAgIHJldHVybiByZXN1bHQ7CkBAIC0xNDYwLDcgKzE0ODUsNyBAQAogCiAgIHJlc3VsdGNvdW50ID0gMDsKICAgLyogQXNzdW1lIHRoZSAncScgYW5kICdNIGNoYXJzIGhhdmUgYmVlbiBzdHJpcHBlZC4gICovCi0gIGxpbWl0ID0gcGt0ICsgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUgLSBCVUZfVEhSRUFEX0lEX1NJWkUpOworICBsaW1pdCA9IHBrdCArIChycy0+YnVmX3NpemUgLSBCVUZfVEhSRUFEX0lEX1NJWkUpOwogICAvKiBkb25lIHBhcnNlIHBhc3QgaGVyZSAqLwogICBwa3QgPSB1bnBhY2tfYnl0ZSAocGt0LCAmY291bnQpOwkvKiBjb3VudCBmaWVsZCAqLwogICBwa3QgPSB1bnBhY2tfbmliYmxlIChwa3QsICZkb25lKTsKQEAgLTE0ODMsMjEgKzE1MDgsMTkgQEAKIHsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwogICBzdGF0aWMgdGhyZWFkcmVmIGVjaG9fbmV4dHRocmVhZDsKLSAgY2hhciAqdGhyZWFkbGlzdF9wYWNrZXQgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOwotICBjaGFyICp0X3Jlc3BvbnNlID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKKyAgY2hhciAqdGhyZWFkbGlzdF9wYWNrZXQgPSBycy0+YnVmOwogICBpbnQgcmVzdWx0ID0gMTsKIAogICAvKiBUcmFuY2F0ZSByZXN1bHQgbGltaXQgdG8gYmUgc21hbGxlciB0aGFuIHRoZSBwYWNrZXQgc2l6ZS4gICovCiAgIGlmICgoKChyZXN1bHRfbGltaXQgKyAxKSAqIEJVRl9USFJFQURfSURfU0laRSkgKyAxMCkgPj0gcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSkKICAgICByZXN1bHRfbGltaXQgPSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSAvIEJVRl9USFJFQURfSURfU0laRSkgLSAyOwogCi0gIHBhY2tfdGhyZWFkbGlzdF9yZXF1ZXN0ICh0aHJlYWRsaXN0X3BhY2tldCwKLQkJCSAgIHN0YXJ0ZmxhZywgcmVzdWx0X2xpbWl0LCBuZXh0dGhyZWFkKTsKLSAgcHV0cGt0ICh0aHJlYWRsaXN0X3BhY2tldCk7Ci0gIGdldHBrdCAodF9yZXNwb25zZSwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7CisgIHBhY2tfdGhyZWFkbGlzdF9yZXF1ZXN0IChycy0+YnVmLCBzdGFydGZsYWcsIHJlc3VsdF9saW1pdCwgbmV4dHRocmVhZCk7CisgIHB1dHBrdCAocnMtPmJ1Zik7CisgIGdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDApOwogCiAgICpyZXN1bHRfY291bnQgPQotICAgIHBhcnNlX3RocmVhZGxpc3RfcmVzcG9uc2UgKHRfcmVzcG9uc2UgKyAyLCByZXN1bHRfbGltaXQsICZlY2hvX25leHR0aHJlYWQsCisgICAgcGFyc2VfdGhyZWFkbGlzdF9yZXNwb25zZSAocnMtPmJ1ZiArIDIsIHJlc3VsdF9saW1pdCwgJmVjaG9fbmV4dHRocmVhZCwKIAkJCSAgICAgICB0aHJlYWRsaXN0LCBkb25lKTsKIAogICBpZiAoIXRocmVhZG1hdGNoICgmZWNob19uZXh0dGhyZWFkLCBuZXh0dGhyZWFkKSkKQEAgLTE2MDIsMTAgKzE2MjUsMTAgQEAKIHJlbW90ZV9jdXJyZW50X3RocmVhZCAocHRpZF90IG9sZHBpZCkKIHsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwotICBjaGFyICpidWYgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOworICBjaGFyICpidWYgPSBycy0+YnVmOwogCiAgIHB1dHBrdCAoInFDIik7Ci0gIGdldHBrdCAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAwKTsKKyAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAgIGlmIChidWZbMF0gPT0gJ1EnICYmIGJ1ZlsxXSA9PSAnQycpCiAgICAgLyogVXNlIHN0cnRvdWwgaGVyZSwgc28gd2UnbGwgY29ycmVjdGx5IHBhcnNlIHZhbHVlcyB3aG9zZSBoaWdoZXN0CiAgICAgICAgYml0IGlzIHNldC4gIFRoZSBwcm90b2NvbCBjYXJyaWVzIHRoZW0gYXMgYSBzaW1wbGUgc2VyaWVzIG9mCkBAIC0xNjQxLDcgKzE2NjQsNiBAQAogcmVtb3RlX3RocmVhZHNfaW5mbyAodm9pZCkKIHsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwotICBjaGFyICpidWYgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOwogICBjaGFyICpidWZwOwogICBpbnQgdGlkOwogCkBAIC0xNjUxLDggKzE2NzMsOCBAQAogICBpZiAodXNlX3RocmVhZGluZm9fcXVlcnkpCiAgICAgewogICAgICAgcHV0cGt0ICgicWZUaHJlYWRJbmZvIik7Ci0gICAgICBidWZwID0gYnVmOwotICAgICAgZ2V0cGt0IChidWZwLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAwKTsKKyAgICAgIGJ1ZnAgPSBycy0+YnVmOworICAgICAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAgICAgICBpZiAoYnVmcFswXSAhPSAnXDAnKQkJLyogcSBwYWNrZXQgcmVjb2duaXplZCAqLwogCXsKIAkgIHdoaWxlICgqYnVmcCsrID09ICdtJykJLyogcmVwbHkgY29udGFpbnMgb25lIG9yIG1vcmUgVElEICovCkBAIC0xNjcxLDggKzE2OTMsOCBAQAogCQl9CiAJICAgICAgd2hpbGUgKCpidWZwKysgPT0gJywnKTsJLyogY29tbWEtc2VwYXJhdGVkIGxpc3QgKi8KIAkgICAgICBwdXRwa3QgKCJxc1RocmVhZEluZm8iKTsKLQkgICAgICBidWZwID0gYnVmOwotCSAgICAgIGdldHBrdCAoYnVmcCwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7CisJICAgICAgYnVmcCA9IHJzLT5idWY7CisJICAgICAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAJICAgIH0KIAkgIHJldHVybjsJLyogZG9uZSAqLwogCX0KQEAgLTE3MDIsNyArMTcyNCw2IEBACiAgIHRocmVhZHJlZiBpZDsKICAgc3RydWN0IGdkYl9leHRfdGhyZWFkX2luZm8gdGhyZWFkaW5mbzsKICAgc3RhdGljIGNoYXIgZGlzcGxheV9idWZbMTAwXTsJLyogYXJiaXRyYXJ5Li4uICAqLwotICBjaGFyICpidWZwID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKICAgaW50IG4gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogcG9zaXRpb24gaW4gZGlzcGxheV9idWYgKi8KIAogICBpZiAocmVtb3RlX2Rlc2MgPT0gMCkJCS8qIHBhcmFub2lhICovCkBAIC0xNzExLDEwICsxNzMyLDEyIEBACiAKICAgaWYgKHVzZV90aHJlYWRleHRyYV9xdWVyeSkKICAgICB7CisgICAgICBjaGFyICpidWZwID0gcnMtPmJ1ZjsKKwogICAgICAgeHNucHJpbnRmIChidWZwLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAicVRocmVhZEV4dHJhSW5mbywleCIsIAogCQkgUElER0VUICh0cC0+cHRpZCkpOwogICAgICAgcHV0cGt0IChidWZwKTsKLSAgICAgIGdldHBrdCAoYnVmcCwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7CisgICAgICBnZXRwa3QgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplLCAwKTsKICAgICAgIGlmIChidWZwWzBdICE9IDApCiAJewogCSAgbiA9IG1pbiAoc3RybGVuIChidWZwKSAvIDIsIHNpemVvZiAoZGlzcGxheV9idWYpKTsKQEAgLTE3NjAsMTcgKzE3ODMsMTYgQEAKIGV4dGVuZGVkX3JlbW90ZV9yZXN0YXJ0ICh2b2lkKQogewogICBzdHJ1Y3QgcmVtb3RlX3N0YXRlICpycyA9IGdldF9yZW1vdGVfc3RhdGUgKCk7Ci0gIGNoYXIgKmJ1ZiA9IGFsbG9jYSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7CiAKICAgLyogU2VuZCB0aGUgcmVzdGFydCBjb21tYW5kOyBmb3IgcmVhc29ucyBJIGRvbid0IHVuZGVyc3RhbmQgdGhlCiAgICAgIHJlbW90ZSBzaWRlIHJlYWxseSBleHBlY3RzIGEgbnVtYmVyIGFmdGVyIHRoZSAiUiIuICAqLwotICB4c25wcmludGYgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgIlIleCIsIDApOwotICBwdXRwa3QgKGJ1Zik7CisgIHhzbnByaW50ZiAocnMtPmJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgIlIleCIsIDApOworICBwdXRwa3QgKHJzLT5idWYpOwogCiAgIC8qIE5vdyBxdWVyeSBmb3Igc3RhdHVzIHNvIHRoaXMgbG9va3MganVzdCBsaWtlIHdlIHJlc3RhcnRlZAogICAgICBnZGJzZXJ2ZXIgZnJvbSBzY3JhdGNoLiAgKi8KICAgcHV0cGt0ICgiPyIpOwotICBnZXRwa3QgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7CisgIGdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDApOwogfQogDAogLyogQ2xlYW4gdXAgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZWJ1Z2dlci4gICovCkBAIC0xNzg5LDE0ICsxODExLDE0IEBACiBnZXRfb2Zmc2V0cyAodm9pZCkKIHsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwotICBjaGFyICpidWYgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOworICBjaGFyICpidWYgPSBycy0+YnVmOwogICBjaGFyICpwdHI7CiAgIGludCBsb3NlOwogICBDT1JFX0FERFIgdGV4dF9hZGRyLCBkYXRhX2FkZHIsIGJzc19hZGRyOwogICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpvZmZzOwogCiAgIHB1dHBrdCAoInFPZmZzZXRzIik7Ci0gIGdldHBrdCAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAwKTsKKyAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAKICAgaWYgKGJ1ZlswXSA9PSAnXDAwMCcpCiAgICAgcmV0dXJuOwkJCS8qIFJldHVybiBzaWxlbnRseS4gIFN0dWIgZG9lc24ndCBzdXBwb3J0CkBAIC0xOTU1LDE0ICsxOTc3LDE3IEBACiAgIGlmIChyZW1vdGVfcHJvdG9jb2xfcGFja2V0c1tQQUNLRVRfcVN5bWJvbF0uc3VwcG9ydCA9PSBQQUNLRVRfRElTQUJMRSkKICAgICByZXR1cm47CiAKLSAgbXNnICAgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOwotICByZXBseSA9IGFsbG9jYSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7CisgIC8qIEFsbG9jYXRlIGEgbWVzc2FnZSBidWZmZXIuICBXZSBjYW4ndCByZXVzZSB0aGUgaW5wdXQgYnVmZmVyIGluIFJTLAorICAgICBiZWNhdXNlIHdlIG5lZWQgYm90aCBhdCB0aGUgc2FtZSB0aW1lLiAgKi8KKyAgbXNnID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKKworICByZXBseSA9IHJzLT5idWY7CiAKICAgLyogSW52aXRlIHRhcmdldCB0byByZXF1ZXN0IHN5bWJvbCBsb29rdXBzLiAgKi8KIAogICBwdXRwa3QgKCJxU3ltYm9sOjoiKTsKLSAgZ2V0cGt0IChyZXBseSwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7Ci0gIHBhY2tldF9vayAocmVwbHksICZyZW1vdGVfcHJvdG9jb2xfcGFja2V0c1tQQUNLRVRfcVN5bWJvbF0pOworICBnZXRwa3QgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplLCAwKTsKKyAgcGFja2V0X29rIChycy0+YnVmLCAmcmVtb3RlX3Byb3RvY29sX3BhY2tldHNbUEFDS0VUX3FTeW1ib2xdKTsKIAogICB3aGlsZSAoc3RybmNtcCAocmVwbHksICJxU3ltYm9sOiIsIDgpID09IDApCiAgICAgewpAQCAtMTk3Nyw3ICsyMDAyLDcgQEAKIAkJICAgcGFkZHJfbnogKFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pKSwKIAkJICAgJnJlcGx5WzhdKTsKICAgICAgIHB1dHBrdCAobXNnKTsKLSAgICAgIGdldHBrdCAocmVwbHksIHJzLT5yZW1vdGVfcGFja2V0X3NpemUsIDApOworICAgICAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAgICAgfQogfQogCkBAIC0yMTIzLDkgKzIxNDgsOCBAQAogICBpZiAoZXh0ZW5kZWRfcCkKICAgICB7CiAgICAgICAvKiBUZWxsIHRoZSByZW1vdGUgdGhhdCB3ZSBhcmUgdXNpbmcgdGhlIGV4dGVuZGVkIHByb3RvY29sLiAgKi8KLSAgICAgIGNoYXIgKmJ1ZiA9IGFsbG9jYSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7CiAgICAgICBwdXRwa3QgKCIhIik7Ci0gICAgICBnZXRwa3QgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7CisgICAgICBnZXRwa3QgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplLCAwKTsKICAgICB9CiAKICAgcG9zdF9jcmVhdGVfaW5mZXJpb3IgKCZjdXJyZW50X3RhcmdldCwgZnJvbV90dHkpOwpAQCAtMjE0MywxNCArMjE2NywxMyBAQAogcmVtb3RlX2RldGFjaCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQogewogICBzdHJ1Y3QgcmVtb3RlX3N0YXRlICpycyA9IGdldF9yZW1vdGVfc3RhdGUgKCk7Ci0gIGNoYXIgKmJ1ZiA9IGFsbG9jYSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7CiAKICAgaWYgKGFyZ3MpCiAgICAgZXJyb3IgKF8oIkFyZ3VtZW50IGdpdmVuIHRvIFwiZGV0YWNoXCIgd2hlbiByZW1vdGVseSBkZWJ1Z2dpbmcuIikpOwogCiAgIC8qIFRlbGwgdGhlIHJlbW90ZSB0YXJnZXQgdG8gZGV0YWNoLiAgKi8KLSAgc3RyY3B5IChidWYsICJEIik7Ci0gIHJlbW90ZV9zZW5kIChidWYsIHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOworICBzdHJjcHkgKHJzLT5idWYsICJEIik7CisgIHJlbW90ZV9zZW5kICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSk7CiAKICAgLyogVW5yZWdpc3RlciB0aGUgZmlsZSBkZXNjcmlwdG9yIGZyb20gdGhlIGV2ZW50IGxvb3AuICAqLwogICBpZiAodGFyZ2V0X2lzX2FzeW5jX3AgKCkpCkBAIC0yMjQ0LDExICsyMjY3LDEzIEBACiAgICB0aGUgcmVzcG9uc2UuICAqLwogCiBzdGF0aWMgdm9pZAotcmVtb3RlX3Zjb250X3Byb2JlIChzdHJ1Y3QgcmVtb3RlX3N0YXRlICpycywgY2hhciAqYnVmKQorcmVtb3RlX3Zjb250X3Byb2JlIChzdHJ1Y3QgcmVtb3RlX3N0YXRlICpycykKIHsKKyAgY2hhciAqYnVmID0gcnMtPmJ1ZjsKKwogICBzdHJjcHkgKGJ1ZiwgInZDb250PyIpOwogICBwdXRwa3QgKGJ1Zik7Ci0gIGdldHBrdCAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAwKTsKKyAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAKICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGZlYXR1cmVzIHdlIGFzc3VtZSBhcmUgc3VwcG9ydGVkLiAgKi8KICAgaWYgKHN0cm5jbXAgKGJ1ZiwgInZDb250IiwgNSkgPT0gMCkKQEAgLTIzMDIsMTcgKzIzMjcsMTEgQEAKICAgY2hhciAqYnVmID0gTlVMTCwgKm91dGJ1ZjsKICAgc3RydWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwOwogCi0gIGJ1ZiA9IHhtYWxsb2MgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOwotICBvbGRfY2xlYW51cCA9IG1ha2VfY2xlYW51cCAoeGZyZWUsIGJ1Zik7Ci0KICAgaWYgKHJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF92Q29udF0uc3VwcG9ydCA9PSBQQUNLRVRfU1VQUE9SVF9VTktOT1dOKQotICAgIHJlbW90ZV92Y29udF9wcm9iZSAocnMsIGJ1Zik7CisgICAgcmVtb3RlX3Zjb250X3Byb2JlIChycyk7CiAKICAgaWYgKHJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF92Q29udF0uc3VwcG9ydCA9PSBQQUNLRVRfRElTQUJMRSkKLSAgICB7Ci0gICAgICBkb19jbGVhbnVwcyAob2xkX2NsZWFudXApOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiAwOwogCiAgIC8qIElmIHdlIGNvdWxkIGdlbmVyYXRlIGEgd2lkZXIgcmFuZ2Ugb2YgcGFja2V0cywgd2UnZCBoYXZlIHRvIHdvcnJ5CiAgICAgIGFib3V0IG92ZXJmbG93aW5nIEJVRi4gIFNob3VsZCB0aGVyZSBiZSBhIGdlbmVyaWMKQEAgLTIzNjAsNyArMjM3OSw3IEBACiAgICAgfQogCiAgIGdkYl9hc3NlcnQgKG91dGJ1ZiAmJiBzdHJsZW4gKG91dGJ1ZikgPCBycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKLSAgbWFrZV9jbGVhbnVwICh4ZnJlZSwgb3V0YnVmKTsKKyAgb2xkX2NsZWFudXAgPSBtYWtlX2NsZWFudXAgKHhmcmVlLCBvdXRidWYpOwogCiAgIHB1dHBrdCAob3V0YnVmKTsKIApAQCAtMjM3OSw3ICsyMzk4LDcgQEAKIHJlbW90ZV9yZXN1bWUgKHB0aWRfdCBwdGlkLCBpbnQgc3RlcCwgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWwpCiB7CiAgIHN0cnVjdCByZW1vdGVfc3RhdGUgKnJzID0gZ2V0X3JlbW90ZV9zdGF0ZSAoKTsKLSAgY2hhciAqYnVmID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKKyAgY2hhciAqYnVmID0gcnMtPmJ1ZjsKICAgaW50IHBpZCA9IFBJREdFVCAocHRpZCk7CiAKICAgbGFzdF9zZW50X3NpZ25hbCA9IHNpZ2duYWw7CkBAIC0yNjQ5LDcgKzI2NjgsNyBAQAogcmVtb3RlX3dhaXQgKHB0aWRfdCBwdGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1cykKIHsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwotICBjaGFyICpidWYgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOworICBjaGFyICpidWYgPSBycy0+YnVmOwogICBVTE9OR0VTVCB0aHJlYWRfbnVtID0gLTE7CiAgIFVMT05HRVNUIGFkZHI7CiAKQEAgLTI2NjEsNyArMjY4MCw3IEBACiAgICAgICBjaGFyICpwOwogCiAgICAgICBvZnVuYyA9IHNpZ25hbCAoU0lHSU5ULCByZW1vdGVfaW50ZXJydXB0KTsKLSAgICAgIGdldHBrdCAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAxKTsKKyAgICAgIGdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDEpOwogICAgICAgc2lnbmFsIChTSUdJTlQsIG9mdW5jKTsKIAogICAgICAgLyogVGhpcyBpcyBhIGhvb2sgZm9yIHdoZW4gd2UgbmVlZCB0byBkbyBzb21ldGhpbmcgKHBlcmhhcHMgdGhlCkBAIC0yNzE4LDkgKzI3MzcsOSBAQAogCQkgIHsKIAkJICAgIHAxID0gc3RyY2hyIChwLCAnOicpOwogCQkgICAgaWYgKHAxID09IE5VTEwpCi0JCSAgICAgIHdhcm5pbmcgKF8oIk1hbGZvcm1lZCBwYWNrZXQoYSkgKG1pc3NpbmcgY29sb24pOiAlc1xuXAorCQkgICAgICBlcnJvciAoXygiTWFsZm9ybWVkIHBhY2tldChhKSAobWlzc2luZyBjb2xvbik6ICVzXG5cCiBQYWNrZXQ6ICclcydcbiIpLAotCQkJICAgICAgIHAsIGJ1Zik7CisJCQkgICAgIHAsIGJ1Zik7CiAJCSAgICBpZiAoc3RybmNtcCAocCwgInRocmVhZCIsIHAxIC0gcCkgPT0gMCkKIAkJICAgICAgewogCQkJcF90ZW1wID0gdW5wYWNrX3Zhcmxlbl9oZXggKCsrcDEsICZ0aHJlYWRfbnVtKTsKQEAgLTI4MzgsNyArMjg1Nyw3IEBACiByZW1vdGVfYXN5bmNfd2FpdCAocHRpZF90IHB0aWQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzKQogewogICBzdHJ1Y3QgcmVtb3RlX3N0YXRlICpycyA9IGdldF9yZW1vdGVfc3RhdGUgKCk7Ci0gIGNoYXIgKmJ1ZiA9IGFsbG9jYSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7CisgIGNoYXIgKmJ1ZiA9IHJzLT5idWY7CiAgIFVMT05HRVNUIHRocmVhZF9udW0gPSAtMTsKICAgVUxPTkdFU1QgYWRkcjsKIApAQCAtMjg1Nyw3ICsyODc2LDcgQEAKICAgICAgICAgIF9uZXZlcl8gd2FpdCBmb3IgZXZlciAtPiB0ZXN0IG9uIHRhcmdldF9pc19hc3luY19wKCkuCiAgICAgICAgICBIb3dldmVyLCBiZWZvcmUgd2UgZG8gdGhhdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBjYWxsZXIKICAgICAgICAgIGtub3dzIGhvdyB0byB0YWtlIHRoZSB0YXJnZXQgaW50by9vdXQgb2YgYXN5bmMgbW9kZS4gICovCi0gICAgICBnZXRwa3QgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgd2FpdF9mb3JldmVyX2VuYWJsZWRfcCk7CisgICAgICBnZXRwa3QgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplLCB3YWl0X2ZvcmV2ZXJfZW5hYmxlZF9wKTsKICAgICAgIGlmICghdGFyZ2V0X2lzX2FzeW5jX3AgKCkpCiAJc2lnbmFsIChTSUdJTlQsIG9mdW5jKTsKIApAQCAtMzA0MSw3ICszMDYwLDcgQEAKIGZldGNoX3JlZ2lzdGVyX3VzaW5nX3AgKGludCByZWdudW0pCiB7CiAgIHN0cnVjdCByZW1vdGVfc3RhdGUgKnJzID0gZ2V0X3JlbW90ZV9zdGF0ZSAoKTsKLSAgY2hhciAqYnVmID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKSwgKnA7CisgIGNoYXIgKmJ1ZiA9IHJzLT5idWYsICpwOwogICBjaGFyIHJlZ3BbTUFYX1JFR0lTVEVSX1NJWkVdOwogICBpbnQgaTsKIApAQCAtMzA0OSw3ICszMDY4LDcgQEAKICAgKnArKyA9ICdwJzsKICAgcCArPSBoZXhudW1zdHIgKHAsIHJlZ251bSk7CiAgICpwKysgPSAnXDAnOwotICByZW1vdGVfc2VuZCAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKKyAgcmVtb3RlX3NlbmQgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplKTsKIAogICAvKiBJZiB0aGUgc3R1YiBkaWRuJ3QgcmVjb2duaXplIHRoZSBwYWNrZXQsIG9yIGlmIHdlIGdvdCBhbiBlcnJvciwKICAgICAgdGVsbCBvdXIgY2FsbGVyLiAgKi8KQEAgLTMwODYsNyArMzEwNSw3IEBACiByZW1vdGVfZmV0Y2hfcmVnaXN0ZXJzIChpbnQgcmVnbnVtKQogewogICBzdHJ1Y3QgcmVtb3RlX3N0YXRlICpycyA9IGdldF9yZW1vdGVfc3RhdGUgKCk7Ci0gIGNoYXIgKmJ1ZiA9IGFsbG9jYSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7CisgIGNoYXIgKmJ1ZiA9IHJzLT5idWY7CiAgIGludCBpOwogICBjaGFyICpwOwogICBjaGFyICpyZWdzID0gYWxsb2NhIChycy0+c2l6ZW9mX2dfcGFja2V0KTsKQEAgLTMxMjksNyArMzE0OCw3IEBACiAJfQogCiAgIHNwcmludGYgKGJ1ZiwgImciKTsKLSAgcmVtb3RlX3NlbmQgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7CisgIHJlbW90ZV9zZW5kICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSk7CiAKICAgLyogU2F2ZSB0aGUgc2l6ZSBvZiB0aGUgcGFja2V0IHNlbnQgdG8gdXMgYnkgdGhlIHRhcmdldC4gIEl0cyB1c2VkCiAgICAgIGFzIGEgaGV1cmlzdGljIHdoZW4gZGV0ZXJtaW5pbmcgdGhlIG1heCBzaXplIG9mIHBhY2tldHMgdGhhdCB0aGUKQEAgLTMxNTEsNyArMzE3MCw3IEBACiAgICAgICBpZiAocmVtb3RlX2RlYnVnKQogCWZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywKIAkJCSAgICAiQmFkIHJlZ2lzdGVyIHBhY2tldDsgZmV0Y2hpbmcgYSBuZXcgcGFja2V0XG4iKTsKLSAgICAgIGdldHBrdCAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAwKTsKKyAgICAgIGdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDApOwogICAgIH0KIAogICAvKiBSZXBseSBkZXNjcmliZXMgcmVnaXN0ZXJzIGJ5dGUgYnkgYnl0ZSwgZWFjaCBieXRlIGVuY29kZWQgYXMgdHdvCkBAIC0zMjUwLDcgKzMyNjksNyBAQAogICBzdHJ1Y3QgcmVtb3RlX3N0YXRlICpycyA9IGdldF9yZW1vdGVfc3RhdGUgKCk7CiAgIHN0cnVjdCBwYWNrZXRfcmVnICpyZWcgPSBwYWNrZXRfcmVnX2Zyb21fcmVnbnVtIChycywgcmVnbnVtKTsKICAgLyogVHJ5IHN0b3JpbmcgYSBzaW5nbGUgcmVnaXN0ZXIuICAqLwotICBjaGFyICpidWYgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOworICBjaGFyICpidWYgPSBycy0+YnVmOwogICBnZGJfYnl0ZSByZWdwW01BWF9SRUdJU1RFUl9TSVpFXTsKICAgY2hhciAqcDsKIApAQCAtMzI1OCw3ICszMjc3LDcgQEAKICAgcCA9IGJ1ZiArIHN0cmxlbiAoYnVmKTsKICAgcmVnY2FjaGVfcmF3X2NvbGxlY3QgKGN1cnJlbnRfcmVnY2FjaGUsIHJlZy0+cmVnbnVtLCByZWdwKTsKICAgYmluMmhleCAocmVncCwgcCwgcmVnaXN0ZXJfc2l6ZSAoY3VycmVudF9nZGJhcmNoLCByZWctPnJlZ251bSkpOwotICByZW1vdGVfc2VuZCAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKKyAgcmVtb3RlX3NlbmQgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplKTsKIAogICByZXR1cm4gYnVmWzBdICE9ICdcMCc7CiB9CkBAIC0zMjcxLDcgKzMyOTAsNiBAQAogcmVtb3RlX3N0b3JlX3JlZ2lzdGVycyAoaW50IHJlZ251bSkKIHsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwotICBjaGFyICpidWY7CiAgIGdkYl9ieXRlICpyZWdzOwogICBjaGFyICpwOwogCkBAIC0zMzIyLDEyICszMzQwLDExIEBACiAKICAgLyogQ29tbWFuZCBkZXNjcmliZXMgcmVnaXN0ZXJzIGJ5dGUgYnkgYnl0ZSwKICAgICAgZWFjaCBieXRlIGVuY29kZWQgYXMgdHdvIGhleCBjaGFyYWN0ZXJzLiAgKi8KLSAgYnVmID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKLSAgcCA9IGJ1ZjsKKyAgcCA9IHJzLT5idWY7CiAgICpwKysgPSAnRyc7CiAgIC8qIHJlbW90ZV9wcmVwYXJlX3RvX3N0b3JlIGluc3VyZXMgdGhhdCByZWdpc3Rlcl9ieXRlc19mb3VuZCBnZXRzIHNldC4gICovCiAgIGJpbjJoZXggKHJlZ3MsIHAsIHJlZ2lzdGVyX2J5dGVzX2ZvdW5kKTsKLSAgcmVtb3RlX3NlbmQgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7CisgIHJlbW90ZV9zZW5kICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSk7CiB9CiAMCiAKQEAgLTM0MTMsNyArMzQzMCw3IEBACiAgICAgICBicmVhazsKICAgICBjYXNlIFBBQ0tFVF9TVVBQT1JUX1VOS05PV046CiAgICAgICB7Ci0JY2hhciAqYnVmID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKKwljaGFyICpidWYgPSBycy0+YnVmOwogCWNoYXIgKnA7CiAKIAlwID0gYnVmOwpAQCAtMzQyNSw3ICszNDQyLDcgQEAKIAkqcCA9ICdcMCc7CiAKIAlwdXRwa3RfYmluYXJ5IChidWYsIChpbnQpIChwIC0gYnVmKSk7Ci0JZ2V0cGt0IChidWYsIHJzLT5yZW1vdGVfcGFja2V0X3NpemUsIDApOworCWdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDApOwogCiAJaWYgKGJ1ZlswXSA9PSAnXDAnKQogCSAgewpAQCAtMzQ1OCwxMCArMzQ3NSwxMCBAQAogaW50CiByZW1vdGVfd3JpdGVfYnl0ZXMgKENPUkVfQUREUiBtZW1hZGRyLCBnZGJfYnl0ZSAqbXlhZGRyLCBpbnQgbGVuKQogeworICBzdHJ1Y3QgcmVtb3RlX3N0YXRlICpycyA9IGdldF9yZW1vdGVfc3RhdGUgKCk7CiAgIGNoYXIgKmJ1ZjsKICAgY2hhciAqcDsKICAgY2hhciAqcGxlbjsKLSAgbG9uZyBzaXplb2ZfYnVmOwogICBpbnQgcGxlbmxlbjsKICAgaW50IHRvZG87CiAgIGludCBucl9ieXRlczsKQEAgLTM0NzMsMTAgKzM0OTAsOSBAQAogCiAgIHBheWxvYWRfc2l6ZSA9IGdldF9tZW1vcnlfd3JpdGVfcGFja2V0X3NpemUgKCk7CiAgIAotICAvKiBDb21wdXRlIHRoZSBzaXplLCBhbmQgdGhlbiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxhcmdlc3QKLSAgICAgcG9zc2libGUgcGFja2V0LiAgSW5jbHVkZSBzcGFjZSBmb3IgYW4gZXh0cmEgdHJhaWxpbmcgTlVMLiAgKi8KLSAgc2l6ZW9mX2J1ZiA9IHBheWxvYWRfc2l6ZSArIDE7Ci0gIGJ1ZiA9IGFsbG9jYSAoc2l6ZW9mX2J1Zik7CisgIC8qIFRoZSBwYWNrZXQgYnVmZmVyIHdpbGwgYmUgbGFyZ2UgZW5vdWdoIGZvciB0aGUgcGF5bG9hZDsKKyAgICAgZ2V0X21lbW9yeV9wYWNrZXRfc2l6ZSBlbnN1cmVzIHRoaXMuICAqLworICBidWYgPSBycy0+YnVmOwogCiAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGFjdHVhbCBwYXlsb2FkIGJ5IHN1YnRyYWN0aW5nIG91dCB0aGUKICAgICAgcGFja2V0IGhlYWRlciBhbmQgZm9vdGVyIG92ZXJoZWFkOiAiJE08bWVtYWRkcj4sPGxlbj46Li4uI25uIi4KQEAgLTM1ODMsNyArMzU5OSw3IEBACiAgICAgfQogCiAgIHB1dHBrdF9iaW5hcnkgKGJ1ZiwgKGludCkgKHAgLSBidWYpKTsKLSAgZ2V0cGt0IChidWYsIHNpemVvZl9idWYsIDApOworICBnZXRwa3QgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplLCAwKTsKIAogICBpZiAoYnVmWzBdID09ICdFJykKICAgICB7CkBAIC0zNjE4LDE1ICszNjM0LDE1IEBACiBpbnQKIHJlbW90ZV9yZWFkX2J5dGVzIChDT1JFX0FERFIgbWVtYWRkciwgZ2RiX2J5dGUgKm15YWRkciwgaW50IGxlbikKIHsKKyAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwogICBjaGFyICpidWY7CiAgIGludCBtYXhfYnVmX3NpemU7CQkvKiBNYXggc2l6ZSBvZiBwYWNrZXQgb3V0cHV0IGJ1ZmZlci4gICovCi0gIGxvbmcgc2l6ZW9mX2J1ZjsKICAgaW50IG9yaWdsZW47CiAKLSAgLyogQ3JlYXRlIGEgYnVmZmVyIGJpZyBlbm91Z2ggZm9yIHRoaXMgcGFja2V0LiAgKi8KICAgbWF4X2J1Zl9zaXplID0gZ2V0X21lbW9yeV9yZWFkX3BhY2tldF9zaXplICgpOwotICBzaXplb2ZfYnVmID0gbWF4X2J1Zl9zaXplICsgMTsgLyogU3BhY2UgZm9yIHRyYWlsaW5nIE5VTEwuICAqLwotICBidWYgPSBhbGxvY2EgKHNpemVvZl9idWYpOworICAvKiBUaGUgcGFja2V0IGJ1ZmZlciB3aWxsIGJlIGxhcmdlIGVub3VnaCBmb3IgdGhlIHBheWxvYWQ7CisgICAgIGdldF9tZW1vcnlfcGFja2V0X3NpemUgZW5zdXJlcyB0aGlzLiAgKi8KKyAgYnVmID0gcnMtPmJ1ZjsKIAogICBvcmlnbGVuID0gbGVuOwogICB3aGlsZSAobGVuID4gMCkKQEAgLTM2NDgsNyArMzY2NCw3IEBACiAgICAgICAqcCA9ICdcMCc7CiAKICAgICAgIHB1dHBrdCAoYnVmKTsKLSAgICAgIGdldHBrdCAoYnVmLCBzaXplb2ZfYnVmLCAwKTsKKyAgICAgIGdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDApOwogCiAgICAgICBpZiAoYnVmWzBdID09ICdFJwogCSAgJiYgaXN4ZGlnaXQgKGJ1ZlsxXSkgJiYgaXN4ZGlnaXQgKGJ1ZlsyXSkKQEAgLTM3NDcsMTggKzM3NjMsMjAgQEAKICAgcmV0dXJuIGNoOwogfQogCi0vKiBTZW5kIHRoZSBjb21tYW5kIGluIEJVRiB0byB0aGUgcmVtb3RlIG1hY2hpbmUsIGFuZCByZWFkIHRoZSByZXBseQotICAgaW50byBCVUYuICBSZXBvcnQgYW4gZXJyb3IgaWYgd2UgZ2V0IGFuIGVycm9yIHJlcGx5LiAgKi8KKy8qIFNlbmQgdGhlIGNvbW1hbmQgaW4gKkJVRiB0byB0aGUgcmVtb3RlIG1hY2hpbmUsIGFuZCByZWFkIHRoZSByZXBseQorICAgaW50byAqQlVGLiAgUmVwb3J0IGFuIGVycm9yIGlmIHdlIGdldCBhbiBlcnJvciByZXBseS4gIFJlc2l6ZQorICAgKkJVRiB1c2luZyB4cmVhbGxvYyBpZiBuZWNlc3NhcnkgdG8gaG9sZCB0aGUgcmVzdWx0LCBhbmQgdXBkYXRlCisgICAqU0laRU9GX0JVRi4gICovCiAKIHN0YXRpYyB2b2lkCi1yZW1vdGVfc2VuZCAoY2hhciAqYnVmLAotCSAgICAgbG9uZyBzaXplb2ZfYnVmKQorcmVtb3RlX3NlbmQgKGNoYXIgKipidWYsCisJICAgICBsb25nICpzaXplb2ZfYnVmKQogewotICBwdXRwa3QgKGJ1Zik7CisgIHB1dHBrdCAoKmJ1Zik7CiAgIGdldHBrdCAoYnVmLCBzaXplb2ZfYnVmLCAwKTsKIAotICBpZiAoYnVmWzBdID09ICdFJykKLSAgICBlcnJvciAoXygiUmVtb3RlIGZhaWx1cmUgcmVwbHk6ICVzIiksIGJ1Zik7CisgIGlmICgoKmJ1ZilbMF0gPT0gJ0UnKQorICAgIGVycm9yIChfKCJSZW1vdGUgZmFpbHVyZSByZXBseTogJXMiKSwgKmJ1Zik7CiB9CiAKIC8qIERpc3BsYXkgYSBudWxsLXRlcm1pbmF0ZWQgcGFja2V0IG9uIHN0ZG91dCwgZm9yIGRlYnVnZ2luZywgdXNpbmcgQwpAQCAtMzc5MSw4ICszODA5LDYgQEAKICAgaW50IGk7CiAgIHVuc2lnbmVkIGNoYXIgY3N1bSA9IDA7CiAgIGNoYXIgKmJ1ZjIgPSBhbGxvY2EgKGNudCArIDYpOwotICBsb25nIHNpemVvZl9qdW5rYnVmID0gcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZTsKLSAgY2hhciAqanVua2J1ZiA9IGFsbG9jYSAoc2l6ZW9mX2p1bmtidWYpOwogCiAgIGludCBjaDsKICAgaW50IHRjb3VudCA9IDA7CkBAIC0zODc0LDcgKzM4OTAsNyBAQAogCQkgICB3YXMgbG9zdC4gIEdvYmJsZSB1cCB0aGUgcGFja2V0IGFuZCBhY2sgaXQgc28gaXQKIAkJICAgZG9lc24ndCBnZXQgcmV0cmFuc21pdHRlZCB3aGVuIHdlIHJlc2VuZCB0aGlzCiAJCSAgIHBhY2tldC4gICovCi0JCXJlYWRfZnJhbWUgKGp1bmtidWYsIHNpemVvZl9qdW5rYnVmKTsKKwkJc2tpcF9mcmFtZSAoKTsKIAkJc2VyaWFsX3dyaXRlIChyZW1vdGVfZGVzYywgIisiLCAxKTsKIAkJY29udGludWU7CS8qIE5vdywgZ28gbG9vayBmb3IgKy4gICovCiAJICAgICAgfQpAQCAtMzkwOCwyOSArMzkyNCw2NSBAQAogICAgIH0KIH0KIAorLyogQ29tZSBoZXJlIGFmdGVyIGZpbmRpbmcgdGhlIHN0YXJ0IG9mIGEgZnJhbWUgd2hlbiB3ZSBleHBlY3RlZCBhbgorICAgYWNrLiAgRG8gb3VyIGJlc3QgdG8gZGlzY2FyZCB0aGUgcmVzdCBvZiB0aGlzIHBhY2tldC4gICovCisKK3N0YXRpYyB2b2lkCitza2lwX2ZyYW1lICh2b2lkKQoreworICBpbnQgYzsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjID0gcmVhZGNoYXIgKHJlbW90ZV90aW1lb3V0KTsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSBTRVJJQUxfVElNRU9VVDoKKwkgIC8qIE5vdGhpbmcgd2UgY2FuIGRvLiAgKi8KKwkgIHJldHVybjsKKwljYXNlICcjJzoKKwkgIC8qIERpc2NhcmQgdGhlIHR3byBieXRlcyBvZiBjaGVja3N1bSBhbmQgc3RvcC4gICovCisJICBjID0gcmVhZGNoYXIgKHJlbW90ZV90aW1lb3V0KTsKKwkgIGlmIChjID49IDApCisJICAgIGMgPSByZWFkY2hhciAocmVtb3RlX3RpbWVvdXQpOworCisJICByZXR1cm47CisJY2FzZSAnKic6CQkvKiBSdW4gbGVuZ3RoIGVuY29kaW5nLiAgKi8KKwkgIC8qIERpc2NhcmQgdGhlIHJlcGVhdCBjb3VudC4gICovCisJICBjID0gcmVhZGNoYXIgKHJlbW90ZV90aW1lb3V0KTsKKwkgIGlmIChjIDwgMCkKKwkgICAgcmV0dXJuOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIC8qIEEgcmVndWxhciBjaGFyYWN0ZXIuICAqLworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKwogLyogQ29tZSBoZXJlIGFmdGVyIGZpbmRpbmcgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZS4gIENvbGxlY3QgdGhlIHJlc3QKLSAgIGludG8gQlVGLCB2ZXJpZnlpbmcgdGhlIGNoZWNrc3VtLCBsZW5ndGgsIGFuZCBoYW5kbGluZyBydW4tbGVuZ3RoCi0gICBjb21wcmVzc2lvbi4gIE5vIG1vcmUgdGhhbiBzaXplb2ZfYnVmLTEgY2hhcmFjdGVycyBhcmUgcmVhZCBzbyB0aGF0Ci0gICB0aGUgYnVmZmVyIGNhbiBiZSBOVUwgdGVybWluYXRlZC4KKyAgIGludG8gKkJVRiwgdmVyaWZ5aW5nIHRoZSBjaGVja3N1bSwgbGVuZ3RoLCBhbmQgaGFuZGxpbmcgcnVuLWxlbmd0aAorICAgY29tcHJlc3Npb24uICBOVUwgdGVybWluYXRlIHRoZSBidWZmZXIuICBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20sCisgICBleHBhbmQgKkJVRiB1c2luZyB4cmVhbGxvYy4KIAogICAgUmV0dXJucyAtMSBvbiBlcnJvciwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYnVmZmVyIChpZ25vcmluZyB0aGUKICAgIHRyYWlsaW5nIE5VTEwpIG9uIHN1Y2Nlc3MuIChjb3VsZCBiZSBleHRlbmRlZCB0byByZXR1cm4gb25lIG9mIHRoZQogICAgU0VSSUFMIHN0YXR1cyBpbmRpY2F0aW9ucykuICAqLwogCiBzdGF0aWMgbG9uZwotcmVhZF9mcmFtZSAoY2hhciAqYnVmLAotCSAgICBsb25nIHNpemVvZl9idWYpCityZWFkX2ZyYW1lIChjaGFyICoqYnVmX3AsCisJICAgIGxvbmcgKnNpemVvZl9idWYpCiB7CiAgIHVuc2lnbmVkIGNoYXIgY3N1bTsKICAgbG9uZyBiYzsKICAgaW50IGM7CisgIGNoYXIgKmJ1ZiA9ICpidWZfcDsKIAogICBjc3VtID0gMDsKICAgYmMgPSAwOwogCiAgIHdoaWxlICgxKQogICAgIHsKLSAgICAgIC8qIEFTU0VSVCAoYmMgPCBzaXplb2ZfYnVmIC0gMSkgLSBzcGFjZSBmb3IgdHJhaWxpbmcgTlVMTC4gICovCiAgICAgICBjID0gcmVhZGNoYXIgKHJlbW90ZV90aW1lb3V0KTsKICAgICAgIHN3aXRjaCAoYykKIAl7CkBAIC0zOTk3LDUxICs0MDQ5LDUzIEBACiAKIAkgICAgLyogVGhlIGNoYXJhY3RlciBiZWZvcmUgYGAqJycgaXMgcmVwZWF0ZWQuICAqLwogCi0JICAgIGlmIChyZXBlYXQgPiAwICYmIHJlcGVhdCA8PSAyNTUKLQkJJiYgYmMgPiAwCi0gICAgICAgICAgICAgICAgJiYgYmMgKyByZXBlYXQgLSAxIDwgc2l6ZW9mX2J1ZiAtIDEpCisJICAgIGlmIChyZXBlYXQgPiAwICYmIHJlcGVhdCA8PSAyNTUgJiYgYmMgPiAwKQogCSAgICAgIHsKKwkJaWYgKGJjICsgcmVwZWF0IC0gMSA+PSAqc2l6ZW9mX2J1ZiAtIDEpCisJCSAgeworCQkgICAgLyogTWFrZSBzb21lIG1vcmUgcm9vbSBpbiB0aGUgYnVmZmVyLiAgKi8KKwkJICAgICpzaXplb2ZfYnVmICs9IHJlcGVhdDsKKwkJICAgICpidWZfcCA9IHhyZWFsbG9jICgqYnVmX3AsICpzaXplb2ZfYnVmKTsKKwkJICAgIGJ1ZiA9ICpidWZfcDsKKwkJICB9CisKIAkJbWVtc2V0ICgmYnVmW2JjXSwgYnVmW2JjIC0gMV0sIHJlcGVhdCk7CiAJCWJjICs9IHJlcGVhdDsKIAkJY29udGludWU7CiAJICAgICAgfQogCiAJICAgIGJ1ZltiY10gPSAnXDAnOwotCSAgICBwcmludGZfZmlsdGVyZWQgKF8oIlJlcGVhdCBjb3VudCAlZCB0b28gbGFyZ2UgZm9yIGJ1ZmZlcjogIiksIAotCQkJICAgICByZXBlYXQpOwotCSAgICBwdXRzX2ZpbHRlcmVkIChidWYpOwotCSAgICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKwkgICAgcHJpbnRmX2ZpbHRlcmVkIChfKCJJbnZhbGlkIHJ1biBsZW5ndGggZW5jb2Rpbmc6ICVzXG4iKSwgYnVmKTsKIAkgICAgcmV0dXJuIC0xOwogCSAgfQogCWRlZmF1bHQ6Ci0JICBpZiAoYmMgPCBzaXplb2ZfYnVmIC0gMSkKKwkgIGlmIChiYyA+PSAqc2l6ZW9mX2J1ZiAtIDEpCiAJICAgIHsKLQkgICAgICBidWZbYmMrK10gPSBjOwotCSAgICAgIGNzdW0gKz0gYzsKLQkgICAgICBjb250aW51ZTsKKwkgICAgICAvKiBNYWtlIHNvbWUgbW9yZSByb29tIGluIHRoZSBidWZmZXIuICAqLworCSAgICAgICpzaXplb2ZfYnVmICo9IDI7CisJICAgICAgKmJ1Zl9wID0geHJlYWxsb2MgKCpidWZfcCwgKnNpemVvZl9idWYpOworCSAgICAgIGJ1ZiA9ICpidWZfcDsKIAkgICAgfQogCi0JICBidWZbYmNdID0gJ1wwJzsKLQkgIHB1dHNfZmlsdGVyZWQgKCJSZW1vdGUgcGFja2V0IHRvbyBsb25nOiAiKTsKLQkgIHB1dHNfZmlsdGVyZWQgKGJ1Zik7Ci0JICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKLQotCSAgcmV0dXJuIC0xOworCSAgYnVmW2JjKytdID0gYzsKKwkgIGNzdW0gKz0gYzsKKwkgIGNvbnRpbnVlOwogCX0KICAgICB9CiB9CiAKIC8qIFJlYWQgYSBwYWNrZXQgZnJvbSB0aGUgcmVtb3RlIG1hY2hpbmUsIHdpdGggZXJyb3IgY2hlY2tpbmcsIGFuZAotICAgc3RvcmUgaXQgaW4gQlVGLiAgSWYgRk9SRVZFUiwgd2FpdCBmb3JldmVyIHJhdGhlciB0aGFuIHRpbWluZyBvdXQ7Ci0gICB0aGlzIGlzIHVzZWQgKGluIHN5bmNocm9ub3VzIG1vZGUpIHRvIHdhaXQgZm9yIGEgdGFyZ2V0IHRoYXQgaXMgaXMKLSAgIGV4ZWN1dGluZyB1c2VyIGNvZGUgdG8gc3RvcC4gICovCisgICBzdG9yZSBpdCBpbiAqQlVGLiAgUmVzaXplICpCVUYgdXNpbmcgeHJlYWxsb2MgaWYgbmVjZXNzYXJ5IHRvIGhvbGQKKyAgIHRoZSByZXN1bHQsIGFuZCB1cGRhdGUgKlNJWkVPRl9CVUYuICBJZiBGT1JFVkVSLCB3YWl0IGZvcmV2ZXIKKyAgIHJhdGhlciB0aGFuIHRpbWluZyBvdXQ7IHRoaXMgaXMgdXNlZCAoaW4gc3luY2hyb25vdXMgbW9kZSkgdG8gd2FpdAorICAgZm9yIGEgdGFyZ2V0IHRoYXQgaXMgaXMgZXhlY3V0aW5nIHVzZXIgY29kZSB0byBzdG9wLiAgKi8KIC8qIEZJWE1FOiBlemFubm9uaSAyMDAwLTAyLTAxIHRoaXMgd3JhcHBlciBpcyBuZWNlc3Nhcnkgc28gdGhhdCB3ZQogICAgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UgYWxsIHRoZSBjYWxscyB0byBnZXRwa3QgdG8gZGVhbCB3aXRoIHRoZQogICAgcmV0dXJuIHZhbHVlLCBiZWNhdXNlIGF0IHRoZSBtb21lbnQgSSBkb24ndCBrbm93IHdoYXQgdGhlIHJpZ2h0CiAgICB0aGluZyB0byBkbyBpdCBmb3IgdGhvc2UuICAqLwogdm9pZAotZ2V0cGt0IChjaGFyICpidWYsCi0JbG9uZyBzaXplb2ZfYnVmLAorZ2V0cGt0IChjaGFyICoqYnVmLAorCWxvbmcgKnNpemVvZl9idWYsCiAJaW50IGZvcmV2ZXIpCiB7CiAgIGludCB0aW1lZF9vdXQ7CkBAIC00MDUxLDIyICs0MTA1LDIxIEBACiAKIAogLyogUmVhZCBhIHBhY2tldCBmcm9tIHRoZSByZW1vdGUgbWFjaGluZSwgd2l0aCBlcnJvciBjaGVja2luZywgYW5kCi0gICBzdG9yZSBpdCBpbiBCVUYuICBJZiBGT1JFVkVSLCB3YWl0IGZvcmV2ZXIgcmF0aGVyIHRoYW4gdGltaW5nIG91dDsKLSAgIHRoaXMgaXMgdXNlZCAoaW4gc3luY2hyb25vdXMgbW9kZSkgdG8gd2FpdCBmb3IgYSB0YXJnZXQgdGhhdCBpcyBpcwotICAgZXhlY3V0aW5nIHVzZXIgY29kZSB0byBzdG9wLiBJZiBGT1JFVkVSID09IDAsIHRoaXMgZnVuY3Rpb24gaXMKLSAgIGFsbG93ZWQgdG8gdGltZSBvdXQgZ3JhY2VmdWxseSBhbmQgcmV0dXJuIGFuIGluZGljYXRpb24gb2YgdGhpcyB0bwotICAgdGhlIGNhbGxlci4gICovCisgICBzdG9yZSBpdCBpbiAqQlVGLiAgUmVzaXplICpCVUYgdXNpbmcgeHJlYWxsb2MgaWYgbmVjZXNzYXJ5IHRvIGhvbGQKKyAgIHRoZSByZXN1bHQsIGFuZCB1cGRhdGUgKlNJWkVPRl9CVUYuICBJZiBGT1JFVkVSLCB3YWl0IGZvcmV2ZXIKKyAgIHJhdGhlciB0aGFuIHRpbWluZyBvdXQ7IHRoaXMgaXMgdXNlZCAoaW4gc3luY2hyb25vdXMgbW9kZSkgdG8gd2FpdAorICAgZm9yIGEgdGFyZ2V0IHRoYXQgaXMgaXMgZXhlY3V0aW5nIHVzZXIgY29kZSB0byBzdG9wLiAgSWYgRk9SRVZFUiA9PQorICAgMCwgdGhpcyBmdW5jdGlvbiBpcyBhbGxvd2VkIHRvIHRpbWUgb3V0IGdyYWNlZnVsbHkgYW5kIHJldHVybiBhbgorICAgaW5kaWNhdGlvbiBvZiB0aGlzIHRvIHRoZSBjYWxsZXIuICAqLwogc3RhdGljIGludAotZ2V0cGt0X3NhbmUgKGNoYXIgKmJ1ZiwKLQlsb25nIHNpemVvZl9idWYsCi0JaW50IGZvcmV2ZXIpCitnZXRwa3Rfc2FuZSAoY2hhciAqKmJ1ZiwgbG9uZyAqc2l6ZW9mX2J1ZiwgaW50IGZvcmV2ZXIpCiB7CiAgIGludCBjOwogICBpbnQgdHJpZXM7CiAgIGludCB0aW1lb3V0OwogICBpbnQgdmFsOwogCi0gIHN0cmNweSAoYnVmLCAidGltZW91dCIpOworICBzdHJjcHkgKCpidWYsICJ0aW1lb3V0Iik7CiAKICAgaWYgKGZvcmV2ZXIpCiAgICAgewpAQCAtNDExOCw3ICs0MTcxLDcgQEAKIAkgIGlmIChyZW1vdGVfZGVidWcpCiAJICAgIHsKIAkgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csICJQYWNrZXQgcmVjZWl2ZWQ6ICIpOwotCSAgICAgIGZwdXRzdHJfdW5maWx0ZXJlZCAoYnVmLCAwLCBnZGJfc3RkbG9nKTsKKwkgICAgICBmcHV0c3RyX3VuZmlsdGVyZWQgKCpidWYsIDAsIGdkYl9zdGRsb2cpOwogCSAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywgIlxuIik7CiAJICAgIH0KIAkgIHNlcmlhbF93cml0ZSAocmVtb3RlX2Rlc2MsICIrIiwgMSk7CkBAIC00Mjk5LDIyICs0MzUyLDE4IEBACiAKICNlbmRpZiAvKiBERVBSRUNBVEVEX1JFTU9URV9CUkVBS1BPSU5UICovCiAKLS8qIEluc2VydCBhIGJyZWFrcG9pbnQgb24gdGFyZ2V0cyB0aGF0IGRvbid0IGhhdmUgYW55IGJldHRlcgotICAgYnJlYWtwb2ludCBzdXBwb3J0LiAgV2UgcmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHRhcmdldCBsb2NhdGlvbgotICAgYW5kIHN0YXNoIGl0LCB0aGVuIG92ZXJ3cml0ZSBpdCB3aXRoIGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4KLSAgIEFERFIgaXMgdGhlIHRhcmdldCBsb2NhdGlvbiBpbiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBDT05URU5UU19DQUNIRQotICAgaXMgYSBwb2ludGVyIHRvIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHNhdmluZyB0aGUgdGFyZ2V0IGNvbnRlbnRzLgotICAgSXQgaXMgZ3VhcmFudGVlZCBieSB0aGUgY2FsbGVyIHRvIGJlIGxvbmcgZW5vdWdoIHRvIHNhdmUgdGhlIG51bWJlcgotICAgb2YgYnl0ZXMgcmV0dXJuZWQgYnkgQlJFQUtQT0lOVF9GUk9NX1BDLiAgKi8KKy8qIEluc2VydCBhIGJyZWFrcG9pbnQuICBPbiB0YXJnZXRzIHRoYXQgaGF2ZSBzb2Z0d2FyZSBicmVha3BvaW50CisgICBzdXBwb3J0LCB3ZSBhc2sgdGhlIHJlbW90ZSB0YXJnZXQgdG8gZG8gdGhlIHdvcms7IG9uIHRhcmdldHMKKyAgIHdoaWNoIGRvbid0LCB3ZSBpbnNlcnQgYSB0cmFkaXRpb25hbCBtZW1vcnkgYnJlYWtwb2ludC4gICovCiAKIHN0YXRpYyBpbnQKLXJlbW90ZV9pbnNlcnRfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGJmZF9ieXRlICpjb250ZW50c19jYWNoZSkKK3JlbW90ZV9pbnNlcnRfYnJlYWtwb2ludCAoc3RydWN0IGJwX3RhcmdldF9pbmZvICpicF90Z3QpCiB7CisgIENPUkVfQUREUiBhZGRyID0gYnBfdGd0LT5wbGFjZWRfYWRkcmVzczsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwogI2lmZGVmIERFUFJFQ0FURURfUkVNT1RFX0JSRUFLUE9JTlQKICAgaW50IHZhbDsKICNlbmRpZgotICBpbnQgYnBfc2l6ZTsKIAogICAvKiBUcnkgdGhlICJaIiBzL3cgYnJlYWtwb2ludCBwYWNrZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgZGlzYWJsZWQuCiAgICAgIElmIGl0IHN1Y2NlZWRzLCB0aGVuIHNldCB0aGUgc3VwcG9ydCB0byBQQUNLRVRfRU5BQkxFLiAgSWYgaXQKQEAgLTQzMjMsMjEgKzQzNzIsMjAgQEAKIAogICBpZiAocmVtb3RlX3Byb3RvY29sX3BhY2tldHNbUEFDS0VUX1owXS5zdXBwb3J0ICE9IFBBQ0tFVF9ESVNBQkxFKQogICAgIHsKLSAgICAgIGNoYXIgKmJ1ZiA9IGFsbG9jYSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7Ci0gICAgICBjaGFyICpwID0gYnVmOworICAgICAgY2hhciAqcCA9IHJzLT5idWY7CiAKLSAgICAgIGFkZHIgPSByZW1vdGVfYWRkcmVzc19tYXNrZWQgKGFkZHIpOwogICAgICAgKihwKyspID0gJ1onOwogICAgICAgKihwKyspID0gJzAnOwogICAgICAgKihwKyspID0gJywnOwotICAgICAgcCArPSBoZXhudW1zdHIgKHAsIChVTE9OR0VTVCkgYWRkcik7Ci0gICAgICBCUkVBS1BPSU5UX0ZST01fUEMgKCZhZGRyLCAmYnBfc2l6ZSk7Ci0gICAgICBzcHJpbnRmIChwLCAiLCVkIiwgYnBfc2l6ZSk7CisgICAgICBCUkVBS1BPSU5UX0ZST01fUEMgKCZicF90Z3QtPnBsYWNlZF9hZGRyZXNzLCAmYnBfdGd0LT5wbGFjZWRfc2l6ZSk7CisgICAgICBhZGRyID0gKFVMT05HRVNUKSByZW1vdGVfYWRkcmVzc19tYXNrZWQgKGJwX3RndC0+cGxhY2VkX2FkZHJlc3MpOworICAgICAgcCArPSBoZXhudW1zdHIgKHAsIGFkZHIpOworICAgICAgc3ByaW50ZiAocCwgIiwlZCIsIGJwX3RndC0+cGxhY2VkX3NpemUpOwogCi0gICAgICBwdXRwa3QgKGJ1Zik7Ci0gICAgICBnZXRwa3QgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7CisgICAgICBwdXRwa3QgKHJzLT5idWYpOworICAgICAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAKLSAgICAgIHN3aXRjaCAocGFja2V0X29rIChidWYsICZyZW1vdGVfcHJvdG9jb2xfcGFja2V0c1tQQUNLRVRfWjBdKSkKKyAgICAgIHN3aXRjaCAocGFja2V0X29rIChycy0+YnVmLCAmcmVtb3RlX3Byb3RvY29sX3BhY2tldHNbUEFDS0VUX1owXSkpCiAJewogCWNhc2UgUEFDS0VUX0VSUk9SOgogCSAgcmV0dXJuIC0xOwpAQCAtNDM0OSw3ICs0Mzk3LDggQEAKICAgICB9CiAKICNpZmRlZiBERVBSRUNBVEVEX1JFTU9URV9CUkVBS1BPSU5UCi0gIHZhbCA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciwgY29udGVudHNfY2FjaGUsIHNpemVvZiBiaWdfYnJlYWtfaW5zbik7CisgIGJwX3RndC0+cGxhY2VkX3NpemUgPSBicF90Z3QtPnNoYWRvd19sZW4gPSBzaXplb2YgYmlnX2JyZWFrX2luc247CisgIHZhbCA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciwgYnBfdGd0LT5zaGFkb3dfY29udGVudHMsIGJwX3RndC0+c2hhZG93X2xlbik7CiAKICAgaWYgKHZhbCA9PSAwKQogICAgIHsKQEAgLTQzNjMsNDAgKzQ0MTIsNDAgQEAKIAogICByZXR1cm4gdmFsOwogI2Vsc2UKLSAgcmV0dXJuIG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpOworICByZXR1cm4gbWVtb3J5X2luc2VydF9icmVha3BvaW50IChicF90Z3QpOwogI2VuZGlmIC8qIERFUFJFQ0FURURfUkVNT1RFX0JSRUFLUE9JTlQgKi8KIH0KIAogc3RhdGljIGludAotcmVtb3RlX3JlbW92ZV9icmVha3BvaW50IChDT1JFX0FERFIgYWRkciwgYmZkX2J5dGUgKmNvbnRlbnRzX2NhY2hlKQorcmVtb3RlX3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCkKIHsKKyAgQ09SRV9BRERSIGFkZHIgPSBicF90Z3QtPnBsYWNlZF9hZGRyZXNzOwogICBzdHJ1Y3QgcmVtb3RlX3N0YXRlICpycyA9IGdldF9yZW1vdGVfc3RhdGUgKCk7CiAgIGludCBicF9zaXplOwogCiAgIGlmIChyZW1vdGVfcHJvdG9jb2xfcGFja2V0c1tQQUNLRVRfWjBdLnN1cHBvcnQgIT0gUEFDS0VUX0RJU0FCTEUpCiAgICAgewotICAgICAgY2hhciAqYnVmID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKLSAgICAgIGNoYXIgKnAgPSBidWY7CisgICAgICBjaGFyICpwID0gcnMtPmJ1ZjsKIAogICAgICAgKihwKyspID0gJ3onOwogICAgICAgKihwKyspID0gJzAnOwogICAgICAgKihwKyspID0gJywnOwogCi0gICAgICBhZGRyID0gcmVtb3RlX2FkZHJlc3NfbWFza2VkIChhZGRyKTsKLSAgICAgIHAgKz0gaGV4bnVtc3RyIChwLCAoVUxPTkdFU1QpIGFkZHIpOwotICAgICAgQlJFQUtQT0lOVF9GUk9NX1BDICgmYWRkciwgJmJwX3NpemUpOwotICAgICAgc3ByaW50ZiAocCwgIiwlZCIsIGJwX3NpemUpOworICAgICAgYWRkciA9IChVTE9OR0VTVCkgcmVtb3RlX2FkZHJlc3NfbWFza2VkIChicF90Z3QtPnBsYWNlZF9hZGRyZXNzKTsKKyAgICAgIHAgKz0gaGV4bnVtc3RyIChwLCBhZGRyKTsKKyAgICAgIHNwcmludGYgKHAsICIsJWQiLCBicF90Z3QtPnBsYWNlZF9zaXplKTsKIAotICAgICAgcHV0cGt0IChidWYpOwotICAgICAgZ2V0cGt0IChidWYsIHJzLT5yZW1vdGVfcGFja2V0X3NpemUsIDApOworICAgICAgcHV0cGt0IChycy0+YnVmKTsKKyAgICAgIGdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDApOwogCi0gICAgICByZXR1cm4gKGJ1ZlswXSA9PSAnRScpOworICAgICAgcmV0dXJuIChycy0+YnVmWzBdID09ICdFJyk7CiAgICAgfQogCiAjaWZkZWYgREVQUkVDQVRFRF9SRU1PVEVfQlJFQUtQT0lOVAotICByZXR1cm4gdGFyZ2V0X3dyaXRlX21lbW9yeSAoYWRkciwgY29udGVudHNfY2FjaGUsIHNpemVvZiBiaWdfYnJlYWtfaW5zbik7CisgIHJldHVybiB0YXJnZXRfd3JpdGVfbWVtb3J5IChicF90Z3QtPnBsYWNlZF9hZGRyZXNzLCBicF90Z3QtPnNoYWRvd19jb250ZW50cywKKwkJCSAgICAgIGJwX3RndC0+c2hhZG93X2xlbik7CiAjZWxzZQotICByZXR1cm4gbWVtb3J5X3JlbW92ZV9icmVha3BvaW50IChhZGRyLCBjb250ZW50c19jYWNoZSk7CisgIHJldHVybiBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKGJwX3RndCk7CiAjZW5kaWYgLyogREVQUkVDQVRFRF9SRU1PVEVfQlJFQUtQT0lOVCAqLwogfQogCkBAIC00NDA2LDEzICs0NDU1LDEzIEBACiAgIHN3aXRjaCAodHlwZSkKICAgICB7CiAgICAgY2FzZSBod193cml0ZToKLSAgICAgIHJldHVybiAyOworICAgICAgcmV0dXJuIFpfUEFDS0VUX1dSSVRFX1dQOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBod19yZWFkOgotICAgICAgcmV0dXJuIDM7CisgICAgICByZXR1cm4gWl9QQUNLRVRfUkVBRF9XUDsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgaHdfYWNjZXNzOgotICAgICAgcmV0dXJuIDQ7CisgICAgICByZXR1cm4gWl9QQUNLRVRfQUNDRVNTX1dQOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIGludGVybmFsX2Vycm9yIChfX0ZJTEVfXywgX19MSU5FX18sCkBAIC00NDI0LDcgKzQ0NzMsNiBAQAogcmVtb3RlX2luc2VydF93YXRjaHBvaW50IChDT1JFX0FERFIgYWRkciwgaW50IGxlbiwgaW50IHR5cGUpCiB7CiAgIHN0cnVjdCByZW1vdGVfc3RhdGUgKnJzID0gZ2V0X3JlbW90ZV9zdGF0ZSAoKTsKLSAgY2hhciAqYnVmID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKICAgY2hhciAqcDsKICAgZW51bSBaX3BhY2tldF90eXBlIHBhY2tldCA9IHdhdGNocG9pbnRfdG9fWl9wYWNrZXQgKHR5cGUpOwogCkBAIC00NDMzLDE2ICs0NDgxLDE2IEBACiAJICAgcmVtb3RlX3Byb3RvY29sX3BhY2tldHNbUEFDS0VUX1owICsgcGFja2V0XS5uYW1lLAogCSAgIHJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9aMCArIHBhY2tldF0udGl0bGUpOwogCi0gIHNwcmludGYgKGJ1ZiwgIloleCwiLCBwYWNrZXQpOwotICBwID0gc3RyY2hyIChidWYsICdcMCcpOworICBzcHJpbnRmIChycy0+YnVmLCAiWiV4LCIsIHBhY2tldCk7CisgIHAgPSBzdHJjaHIgKHJzLT5idWYsICdcMCcpOwogICBhZGRyID0gcmVtb3RlX2FkZHJlc3NfbWFza2VkIChhZGRyKTsKICAgcCArPSBoZXhudW1zdHIgKHAsIChVTE9OR0VTVCkgYWRkcik7CiAgIHNwcmludGYgKHAsICIsJXgiLCBsZW4pOwogCi0gIHB1dHBrdCAoYnVmKTsKLSAgZ2V0cGt0IChidWYsIHJzLT5yZW1vdGVfcGFja2V0X3NpemUsIDApOworICBwdXRwa3QgKHJzLT5idWYpOworICBnZXRwa3QgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplLCAwKTsKIAotICBzd2l0Y2ggKHBhY2tldF9vayAoYnVmLCAmcmVtb3RlX3Byb3RvY29sX3BhY2tldHNbUEFDS0VUX1owICsgcGFja2V0XSkpCisgIHN3aXRjaCAocGFja2V0X29rIChycy0+YnVmLCAmcmVtb3RlX3Byb3RvY29sX3BhY2tldHNbUEFDS0VUX1owICsgcGFja2V0XSkpCiAgICAgewogICAgIGNhc2UgUEFDS0VUX0VSUk9SOgogICAgIGNhc2UgUEFDS0VUX1VOS05PV046CkBAIC00NDU5LDcgKzQ1MDcsNiBAQAogcmVtb3RlX3JlbW92ZV93YXRjaHBvaW50IChDT1JFX0FERFIgYWRkciwgaW50IGxlbiwgaW50IHR5cGUpCiB7CiAgIHN0cnVjdCByZW1vdGVfc3RhdGUgKnJzID0gZ2V0X3JlbW90ZV9zdGF0ZSAoKTsKLSAgY2hhciAqYnVmID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKICAgY2hhciAqcDsKICAgZW51bSBaX3BhY2tldF90eXBlIHBhY2tldCA9IHdhdGNocG9pbnRfdG9fWl9wYWNrZXQgKHR5cGUpOwogCkBAIC00NDY4LDE1ICs0NTE1LDE1IEBACiAJICAgcmVtb3RlX3Byb3RvY29sX3BhY2tldHNbUEFDS0VUX1owICsgcGFja2V0XS5uYW1lLAogCSAgIHJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9aMCArIHBhY2tldF0udGl0bGUpOwogCi0gIHNwcmludGYgKGJ1ZiwgInoleCwiLCBwYWNrZXQpOwotICBwID0gc3RyY2hyIChidWYsICdcMCcpOworICBzcHJpbnRmIChycy0+YnVmLCAieiV4LCIsIHBhY2tldCk7CisgIHAgPSBzdHJjaHIgKHJzLT5idWYsICdcMCcpOwogICBhZGRyID0gcmVtb3RlX2FkZHJlc3NfbWFza2VkIChhZGRyKTsKICAgcCArPSBoZXhudW1zdHIgKHAsIChVTE9OR0VTVCkgYWRkcik7CiAgIHNwcmludGYgKHAsICIsJXgiLCBsZW4pOwotICBwdXRwa3QgKGJ1Zik7Ci0gIGdldHBrdCAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAwKTsKKyAgcHV0cGt0IChycy0+YnVmKTsKKyAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAKLSAgc3dpdGNoIChwYWNrZXRfb2sgKGJ1ZiwgJnJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9aMCArIHBhY2tldF0pKQorICBzd2l0Y2ggKHBhY2tldF9vayAocnMtPmJ1ZiwgJnJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9aMCArIHBhY2tldF0pKQogICAgIHsKICAgICBjYXNlIFBBQ0tFVF9FUlJPUjoKICAgICBjYXNlIFBBQ0tFVF9VTktOT1dOOgpAQCAtNDU0MiwxNyArNDU4OSwxNiBAQAogCiAKIHN0YXRpYyBpbnQKLXJlbW90ZV9pbnNlcnRfaHdfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpzaGFkb3cpCityZW1vdGVfaW5zZXJ0X2h3X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewotICBpbnQgbGVuID0gMDsKKyAgQ09SRV9BRERSIGFkZHI7CiAgIHN0cnVjdCByZW1vdGVfc3RhdGUgKnJzID0gZ2V0X3JlbW90ZV9zdGF0ZSAoKTsKLSAgY2hhciAqYnVmID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKLSAgY2hhciAqcCA9IGJ1ZjsKKyAgY2hhciAqcCA9IHJzLT5idWY7CiAKICAgLyogVGhlIGxlbmd0aCBmaWVsZCBzaG91bGQgYmUgc2V0IHRvIHRoZSBzaXplIG9mIGEgYnJlYWtwb2ludAotICAgICBpbnN0cnVjdGlvbi4gICovCisgICAgIGluc3RydWN0aW9uLCBldmVuIHRob3VnaCB3ZSBhcmVuJ3QgaW5zZXJ0aW5nIG9uZSBvdXJzZWx2ZXMuICAqLwogCi0gIEJSRUFLUE9JTlRfRlJPTV9QQyAoJmFkZHIsICZsZW4pOworICBCUkVBS1BPSU5UX0ZST01fUEMgKCZicF90Z3QtPnBsYWNlZF9hZGRyZXNzLCAmYnBfdGd0LT5wbGFjZWRfc2l6ZSk7CiAKICAgaWYgKHJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9aMV0uc3VwcG9ydCA9PSBQQUNLRVRfRElTQUJMRSkKICAgICBlcnJvciAoXygiQ2FuJ3Qgc2V0IGhhcmR3YXJlIGJyZWFrcG9pbnQgd2l0aG91dCB0aGUgJyVzJyAoJXMpIHBhY2tldC4iKSwKQEAgLTQ1NjMsMTQgKzQ2MDksMTQgQEAKICAgKihwKyspID0gJzEnOwogICAqKHArKykgPSAnLCc7CiAKLSAgYWRkciA9IHJlbW90ZV9hZGRyZXNzX21hc2tlZCAoYWRkcik7CisgIGFkZHIgPSByZW1vdGVfYWRkcmVzc19tYXNrZWQgKGJwX3RndC0+cGxhY2VkX2FkZHJlc3MpOwogICBwICs9IGhleG51bXN0ciAocCwgKFVMT05HRVNUKSBhZGRyKTsKLSAgc3ByaW50ZiAocCwgIiwleCIsIGxlbik7CisgIHNwcmludGYgKHAsICIsJXgiLCBicF90Z3QtPnBsYWNlZF9zaXplKTsKIAotICBwdXRwa3QgKGJ1Zik7Ci0gIGdldHBrdCAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAwKTsKKyAgcHV0cGt0IChycy0+YnVmKTsKKyAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAKLSAgc3dpdGNoIChwYWNrZXRfb2sgKGJ1ZiwgJnJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9aMV0pKQorICBzd2l0Y2ggKHBhY2tldF9vayAocnMtPmJ1ZiwgJnJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9aMV0pKQogICAgIHsKICAgICBjYXNlIFBBQ0tFVF9FUlJPUjoKICAgICBjYXNlIFBBQ0tFVF9VTktOT1dOOgpAQCAtNDU4NCwxNyArNDYzMCwxMSBAQAogCiAKIHN0YXRpYyBpbnQKLXJlbW90ZV9yZW1vdmVfaHdfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpzaGFkb3cpCityZW1vdGVfcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewotICBpbnQgbGVuOworICBDT1JFX0FERFIgYWRkcjsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwotICBjaGFyICpidWYgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOwotICBjaGFyICpwID0gYnVmOwotCi0gIC8qIFRoZSBsZW5ndGggZmllbGQgc2hvdWxkIGJlIHNldCB0byB0aGUgc2l6ZSBvZiBhIGJyZWFrcG9pbnQKLSAgICAgaW5zdHJ1Y3Rpb24uICAqLwotCi0gIEJSRUFLUE9JTlRfRlJPTV9QQyAoJmFkZHIsICZsZW4pOworICBjaGFyICpwID0gcnMtPmJ1ZjsKIAogICBpZiAocmVtb3RlX3Byb3RvY29sX3BhY2tldHNbUEFDS0VUX1oxXS5zdXBwb3J0ID09IFBBQ0tFVF9ESVNBQkxFKQogICAgIGVycm9yIChfKCJDYW4ndCBjbGVhciBoYXJkd2FyZSBicmVha3BvaW50IHdpdGhvdXQgdGhlICclcycgKCVzKSBwYWNrZXQuIiksCkBAIC00NjA1LDE0ICs0NjQ1LDE0IEBACiAgICoocCsrKSA9ICcxJzsKICAgKihwKyspID0gJywnOwogCi0gIGFkZHIgPSByZW1vdGVfYWRkcmVzc19tYXNrZWQgKGFkZHIpOworICBhZGRyID0gcmVtb3RlX2FkZHJlc3NfbWFza2VkIChicF90Z3QtPnBsYWNlZF9hZGRyZXNzKTsKICAgcCArPSBoZXhudW1zdHIgKHAsIChVTE9OR0VTVCkgYWRkcik7Ci0gIHNwcmludGYgKHAsICIsJXgiLCBsZW4pOworICBzcHJpbnRmIChwLCAiLCV4IiwgYnBfdGd0LT5wbGFjZWRfc2l6ZSk7CiAKLSAgcHV0cGt0KGJ1Zik7Ci0gIGdldHBrdCAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAwKTsKKyAgcHV0cGt0IChycy0+YnVmKTsKKyAgZ2V0cGt0ICgmcnMtPmJ1ZiwgJnJzLT5idWZfc2l6ZSwgMCk7CiAKLSAgc3dpdGNoIChwYWNrZXRfb2sgKGJ1ZiwgJnJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9aMV0pKQorICBzd2l0Y2ggKHBhY2tldF9vayAocnMtPmJ1ZiwgJnJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9aMV0pKQogICAgIHsKICAgICBjYXNlIFBBQ0tFVF9FUlJPUjoKICAgICBjYXNlIFBBQ0tFVF9VTktOT1dOOgpAQCAtNDY5NCw3ICs0NzM0LDYgQEAKICAgY2hhciAqdG1wOwogICBjaGFyICpzZWN0ZGF0YTsKICAgY29uc3QgY2hhciAqc2VjdG5hbWU7Ci0gIGNoYXIgKmJ1ZiA9IGFsbG9jYSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7CiAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKICAgYmZkX3ZtYSBsbWE7CiAgIGludCBtYXRjaGVkID0gMDsKQEAgLTQ3MjIsOSArNDc2MSw5IEBACiAgICAgICBtYXRjaGVkID0gMTsJCS8qIGRvIHRoaXMgc2VjdGlvbiAqLwogICAgICAgbG1hID0gcy0+bG1hOwogICAgICAgLyogRklYTUU6IGFzc3VtZXMgbG1hIGNhbiBmaXQgaW50byBsb25nLiAgKi8KLSAgICAgIHhzbnByaW50ZiAoYnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLCAicUNSQzolbHgsJWx4IiwgCisgICAgICB4c25wcmludGYgKHJzLT5idWYsIHJzLT5yZW1vdGVfcGFja2V0X3NpemUsICJxQ1JDOiVseCwlbHgiLAogCQkgKGxvbmcpIGxtYSwgKGxvbmcpIHNpemUpOwotICAgICAgcHV0cGt0IChidWYpOworICAgICAgcHV0cGt0IChycy0+YnVmKTsKIAogICAgICAgLyogQmUgY2xldmVyOyBjb21wdXRlIHRoZSBob3N0X2NyYyBiZWZvcmUgd2FpdGluZyBmb3IgdGFyZ2V0CiAJIHJlcGx5LiAgKi8KQEAgLTQ3MzMsMTQgKzQ3NzIsMTQgQEAKICAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoZXhlY19iZmQsIHMsIHNlY3RkYXRhLCAwLCBzaXplKTsKICAgICAgIGhvc3RfY3JjID0gY3JjMzIgKCh1bnNpZ25lZCBjaGFyICopIHNlY3RkYXRhLCBzaXplLCAweGZmZmZmZmZmKTsKIAotICAgICAgZ2V0cGt0IChidWYsIHJzLT5yZW1vdGVfcGFja2V0X3NpemUsIDApOwotICAgICAgaWYgKGJ1ZlswXSA9PSAnRScpCisgICAgICBnZXRwa3QgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplLCAwKTsKKyAgICAgIGlmIChycy0+YnVmWzBdID09ICdFJykKIAllcnJvciAoXygidGFyZ2V0IG1lbW9yeSBmYXVsdCwgc2VjdGlvbiAlcywgcmFuZ2UgMHglcyAtLSAweCVzIiksCiAJICAgICAgIHNlY3RuYW1lLCBwYWRkciAobG1hKSwgcGFkZHIgKGxtYSArIHNpemUpKTsKLSAgICAgIGlmIChidWZbMF0gIT0gJ0MnKQorICAgICAgaWYgKHJzLT5idWZbMF0gIT0gJ0MnKQogCWVycm9yIChfKCJyZW1vdGUgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24iKSk7CiAKLSAgICAgIGZvciAodGFyZ2V0X2NyYyA9IDAsIHRtcCA9ICZidWZbMV07ICp0bXA7IHRtcCsrKQorICAgICAgZm9yICh0YXJnZXRfY3JjID0gMCwgdG1wID0gJnJzLT5idWZbMV07ICp0bXA7IHRtcCsrKQogCXRhcmdldF9jcmMgPSB0YXJnZXRfY3JjICogMTYgKyBmcm9taGV4ICgqdG1wKTsKIAogICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiU2VjdGlvbiAlcywgcmFuZ2UgMHglcyAtLSAweCVzOiAiLApAQCAtNDc2OSw4ICs0ODA4LDcgQEAKIHsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwogICBpbnQgaTsKLSAgY2hhciAqYnVmMiA9IGFsbG9jYSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7Ci0gIGNoYXIgKnAyID0gJmJ1ZjJbMF07CisgIGNoYXIgKnAyOwogICBjaGFyIHF1ZXJ5X3R5cGU7CiAKICAgLyogSGFuZGxlIG1lbW9yeSB1c2luZyByZW1vdGVfeGZlcl9tZW1vcnkuICAqLwpAQCAtNDgyMCwyMiArNDg1OCwyMiBAQAogCSAgd2hpbGUgKGxlbiA+IDApCiAJICAgIHsKIAkgICAgICBMT05HRVNUIG4gPSBtaW4gKChycy0+cmVtb3RlX3BhY2tldF9zaXplIC0gMikgLyAyLCBsZW4pOwotCSAgICAgIHNucHJpbnRmIChidWYyLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLAorCSAgICAgIHNucHJpbnRmIChycy0+YnVmLCBycy0+cmVtb3RlX3BhY2tldF9zaXplLAogCQkJInFQYXJ0OmF1eHY6cmVhZDo6JXMsJXMiLAogCQkJcGhleF9ueiAob2Zmc2V0LCBzaXplb2Ygb2Zmc2V0KSwKIAkJCXBoZXhfbnogKG4sIHNpemVvZiBuKSk7Ci0JICAgICAgaSA9IHB1dHBrdCAoYnVmMik7CisJICAgICAgaSA9IHB1dHBrdCAocnMtPmJ1Zik7CiAJICAgICAgaWYgKGkgPCAwKQogCQlyZXR1cm4gdG90YWwgPiAwID8gdG90YWwgOiBpOwotCSAgICAgIGJ1ZjJbMF0gPSAnXDAnOwotCSAgICAgIGdldHBrdCAoYnVmMiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7Ci0JICAgICAgaWYgKHBhY2tldF9vayAoYnVmMiwgJnJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9xUGFydF9hdXh2XSkKKwkgICAgICBycy0+YnVmWzBdID0gJ1wwJzsKKwkgICAgICBnZXRwa3QgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplLCAwKTsKKwkgICAgICBpZiAocGFja2V0X29rIChycy0+YnVmLCAmcmVtb3RlX3Byb3RvY29sX3BhY2tldHNbUEFDS0VUX3FQYXJ0X2F1eHZdKQogCQkgICE9IFBBQ0tFVF9PSykKIAkJcmV0dXJuIHRvdGFsID4gMCA/IHRvdGFsIDogLTE7Ci0JICAgICAgaWYgKGJ1ZjJbMF0gPT0gJ08nICYmIGJ1ZjJbMV0gPT0gJ0snICYmIGJ1ZjJbMl0gPT0gJ1wwJykKKwkgICAgICBpZiAoc3RyY21wIChycy0+YnVmLCAiT0siKSA9PSAwKQogCQlicmVhazsJCS8qIEdvdCBFT0YgaW5kaWNhdG9yLiAgKi8KIAkgICAgICAvKiBHb3Qgc29tZSBkYXRhLiAgKi8KLQkgICAgICBpID0gaGV4MmJpbiAoYnVmMiwgcmVhZGJ1ZiwgbGVuKTsKKwkgICAgICBpID0gaGV4MmJpbiAocnMtPmJ1ZiwgcmVhZGJ1ZiwgbGVuKTsKIAkgICAgICBpZiAoaSA+IDApCiAJCXsKIAkJICByZWFkYnVmID0gKHZvaWQgKikgKChjaGFyICopIHJlYWRidWYgKyBpKTsKQEAgLTQ4NjksNiArNDkwNyw3IEBACiAgIGdkYl9hc3NlcnQgKGFubmV4ICE9IE5VTEwpOwogICBnZGJfYXNzZXJ0IChyZWFkYnVmICE9IE5VTEwpOwogCisgIHAyID0gcnMtPmJ1ZjsKICAgKnAyKysgPSAncSc7CiAgICpwMisrID0gcXVlcnlfdHlwZTsKIApAQCAtNDg4OCwxMSArNDkyNywxMiBAQAogICAqcDIgPSAnXDAnOwogICBnZGJfYXNzZXJ0IChhbm5leFtpXSA9PSAnXDAnKTsKIAotICBpID0gcHV0cGt0IChidWYyKTsKKyAgaSA9IHB1dHBrdCAocnMtPmJ1Zik7CiAgIGlmIChpIDwgMCkKICAgICByZXR1cm4gaTsKIAotICBnZXRwa3QgKChjaGFyICopIHJlYWRidWYsIGxlbiwgMCk7CisgIGdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDApOworICBzdHJjcHkgKChjaGFyICopIHJlYWRidWYsIHJzLT5idWYpOwogCiAgIHJldHVybiBzdHJsZW4gKChjaGFyICopIHJlYWRidWYpOwogfQpAQCAtNDkwMiw3ICs0OTQyLDcgQEAKIAkgICAgIHN0cnVjdCB1aV9maWxlICpvdXRidWYpCiB7CiAgIHN0cnVjdCByZW1vdGVfc3RhdGUgKnJzID0gZ2V0X3JlbW90ZV9zdGF0ZSAoKTsKLSAgY2hhciAqYnVmID0gYWxsb2NhIChycy0+cmVtb3RlX3BhY2tldF9zaXplKTsKKyAgY2hhciAqYnVmID0gcnMtPmJ1ZjsKICAgY2hhciAqcCA9IGJ1ZjsKIAogICBpZiAoIXJlbW90ZV9kZXNjKQpAQCAtNDkyMiw3ICs0OTYyLDcgQEAKICAgLyogRW5jb2RlIHRoZSBhY3R1YWwgY29tbWFuZC4gICovCiAgIGJpbjJoZXggKChnZGJfYnl0ZSAqKSBjb21tYW5kLCBwLCAwKTsKIAotICBpZiAocHV0cGt0IChidWYpIDwgMCkKKyAgaWYgKHB1dHBrdCAocnMtPmJ1ZikgPCAwKQogICAgIGVycm9yIChfKCJDb21tdW5pY2F0aW9uIHByb2JsZW0gd2l0aCB0YXJnZXQuIikpOwogCiAgIC8qIGdldC9kaXNwbGF5IHRoZSByZXNwb25zZSAqLwpAQCAtNDkzMCw3ICs0OTcwLDcgQEAKICAgICB7CiAgICAgICAvKiBYWFggLSBzZWUgYWxzbyB0cmFjZXBvaW50LmM6cmVtb3RlX2dldF9ub2lzeV9yZXBseSgpLiAgKi8KICAgICAgIGJ1ZlswXSA9ICdcMCc7Ci0gICAgICBnZXRwa3QgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7CisgICAgICBnZXRwa3QgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplLCAwKTsKICAgICAgIGlmIChidWZbMF0gPT0gJ1wwJykKIAllcnJvciAoXygiVGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBjb21tYW5kLiIpKTsKICAgICAgIGlmIChidWZbMF0gPT0gJ08nICYmIGJ1ZlsxXSAhPSAnSycpCkBAIC00OTU4LDcgKzQ5OTgsNiBAQAogcGFja2V0X2NvbW1hbmQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKIHsKICAgc3RydWN0IHJlbW90ZV9zdGF0ZSAqcnMgPSBnZXRfcmVtb3RlX3N0YXRlICgpOwotICBjaGFyICpidWYgPSBhbGxvY2EgKHJzLT5yZW1vdGVfcGFja2V0X3NpemUpOwogCiAgIGlmICghcmVtb3RlX2Rlc2MpCiAgICAgZXJyb3IgKF8oImNvbW1hbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHJlbW90ZSB0YXJnZXQiKSk7CkBAIC00OTcxLDkgKzUwMTAsOSBAQAogICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKICAgcHV0cGt0IChhcmdzKTsKIAotICBnZXRwa3QgKGJ1ZiwgcnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSwgMCk7CisgIGdldHBrdCAoJnJzLT5idWYsICZycy0+YnVmX3NpemUsIDApOwogICBwdXRzX2ZpbHRlcmVkICgicmVjZWl2ZWQ6ICIpOwotICBwcmludF9wYWNrZXQgKGJ1Zik7CisgIHByaW50X3BhY2tldCAocnMtPmJ1Zik7CiAgIHB1dHNfZmlsdGVyZWQgKCJcbiIpOwogfQogCkBAIC01MTQzLDggKzUxODIsNyBAQAogICBpZiAocmVtb3RlX3Byb3RvY29sX3BhY2tldHNbUEFDS0VUX3FHZXRUTFNBZGRyXS5zdXBwb3J0ICE9IFBBQ0tFVF9ESVNBQkxFKQogICAgIHsKICAgICAgIHN0cnVjdCByZW1vdGVfc3RhdGUgKnJzID0gZ2V0X3JlbW90ZV9zdGF0ZSAoKTsKLSAgICAgIGNoYXIgKmJ1ZiA9IGFsbG9jYSAocnMtPnJlbW90ZV9wYWNrZXRfc2l6ZSk7Ci0gICAgICBjaGFyICpwID0gYnVmOworICAgICAgY2hhciAqcCA9IHJzLT5idWY7CiAgICAgICBlbnVtIHBhY2tldF9yZXN1bHQgcmVzdWx0OwogCiAgICAgICBzdHJjcHkgKHAsICJxR2V0VExTQWRkcjoiKTsKQEAgLTUxNTYsMTQgKzUxOTQsMTQgQEAKICAgICAgIHAgKz0gaGV4bnVtc3RyIChwLCBsbSk7CiAgICAgICAqcCsrID0gJ1wwJzsKIAotICAgICAgcHV0cGt0IChidWYpOwotICAgICAgZ2V0cGt0IChidWYsIHJzLT5yZW1vdGVfcGFja2V0X3NpemUsIDApOwotICAgICAgcmVzdWx0ID0gcGFja2V0X29rIChidWYsICZyZW1vdGVfcHJvdG9jb2xfcGFja2V0c1tQQUNLRVRfcUdldFRMU0FkZHJdKTsKKyAgICAgIHB1dHBrdCAocnMtPmJ1Zik7CisgICAgICBnZXRwa3QgKCZycy0+YnVmLCAmcnMtPmJ1Zl9zaXplLCAwKTsKKyAgICAgIHJlc3VsdCA9IHBhY2tldF9vayAocnMtPmJ1ZiwgJnJlbW90ZV9wcm90b2NvbF9wYWNrZXRzW1BBQ0tFVF9xR2V0VExTQWRkcl0pOwogICAgICAgaWYgKHJlc3VsdCA9PSBQQUNLRVRfT0spCiAJewogCSAgVUxPTkdFU1QgcmVzdWx0OwogCi0JICB1bnBhY2tfdmFybGVuX2hleCAoYnVmLCAmcmVzdWx0KTsKKwkgIHVucGFja192YXJsZW5faGV4IChycy0+YnVmLCAmcmVzdWx0KTsKIAkgIHJldHVybiByZXN1bHQ7CiAJfQogICAgICAgZWxzZSBpZiAocmVzdWx0ID09IFBBQ0tFVF9VTktOT1dOKQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS5oIGIvZ2RiL3JlbW90ZS5oCmluZGV4IGVlMzRmNjMuLmM3MTVlNTggMTAwNjQ0Ci0tLSBhL2dkYi9yZW1vdGUuaAorKysgYi9nZGIvcmVtb3RlLmgKQEAgLTI0LDExICsyNCwxMiBAQAogLyogRklYTUU/OiBtb3ZlIHRoaXMgaW50ZXJmYWNlIGRvd24gdG8gdGd0IHZlY3RvcikgKi8KIAogLyogUmVhZCBhIHBhY2tldCBmcm9tIHRoZSByZW1vdGUgbWFjaGluZSwgd2l0aCBlcnJvciBjaGVja2luZywgYW5kCi0gICBzdG9yZSBpdCBpbiBCVUYuICBCVUYgaXMgZXhwZWN0ZWQgdG8gYmUgb2Ygc2l6ZSBQQlVGU0laLiAgSWYKLSAgIEZPUkVWRVIsIHdhaXQgZm9yZXZlciByYXRoZXIgdGhhbiB0aW1pbmcgb3V0OyB0aGlzIGlzIHVzZWQgd2hpbGUKLSAgIHRoZSB0YXJnZXQgaXMgZXhlY3V0aW5nIHVzZXIgY29kZS4gICovCisgICBzdG9yZSBpdCBpbiAqQlVGLiAgUmVzaXplICpCVUYgdXNpbmcgeHJlYWxsb2MgaWYgbmVjZXNzYXJ5IHRvIGhvbGQKKyAgIHRoZSByZXN1bHQsIGFuZCB1cGRhdGUgKlNJWkVPRl9CVUYuICBJZiBGT1JFVkVSLCB3YWl0IGZvcmV2ZXIKKyAgIHJhdGhlciB0aGFuIHRpbWluZyBvdXQ7IHRoaXMgaXMgdXNlZCAoaW4gc3luY2hyb25vdXMgbW9kZSkgdG8gd2FpdAorICAgZm9yIGEgdGFyZ2V0IHRoYXQgaXMgaXMgZXhlY3V0aW5nIHVzZXIgY29kZSB0byBzdG9wLiAgKi8KIAotZXh0ZXJuIHZvaWQgZ2V0cGt0IChjaGFyICpidWYsIGxvbmcgc2l6ZW9mX2J1ZiwgaW50IGZvcmV2ZXIpOworZXh0ZXJuIHZvaWQgZ2V0cGt0IChjaGFyICoqYnVmLCBsb25nICpzaXplb2ZfYnVmLCBpbnQgZm9yZXZlcik7CiAKIC8qIFNlbmQgYSBwYWNrZXQgdG8gdGhlIHJlbW90ZSBtYWNoaW5lLCB3aXRoIGVycm9yIGNoZWNraW5nLiAgVGhlIGRhdGEKICAgIG9mIHRoZSBwYWNrZXQgaXMgaW4gQlVGLiAgVGhlIHN0cmluZyBpbiBCVUYgY2FuIGJlIGF0IG1vc3QgUEJVRlNJWgpkaWZmIC0tZ2l0IGEvZ2RiL3JzNjAwMC1uYXQuYyBiL2dkYi9yczYwMDAtbmF0LmMKaW5kZXggNGIyZGM2NS4uNzA1MDE2YyAxMDA2NDQKLS0tIGEvZ2RiL3JzNjAwMC1uYXQuYworKysgYi9nZGIvcnM2MDAwLW5hdC5jCkBAIC01MjcsMTUgKzUyNywxNSBAQAogewogI2RlZmluZQlEVU1NWV9JTlNOX0FERFIJKFRFWFRfU0VHTUVOVF9CQVNFKSsweDIwMAogCi0gIGNoYXIgc2hhZG93X2NvbnRlbnRzW0JSRUFLUE9JTlRfTUFYXTsJCS8qIFN0YXNoIG9sZCBia3B0IGFkZHIgY29udGVudHMgKi8KICAgaW50IHJldCwgc3RhdHVzLCBwaWQ7CiAgIENPUkVfQUREUiBwcmV2X3BjOworICB2b2lkICpicDsKIAogICAvKiBXZSBwbGFudCBvbmUgZHVtbXkgYnJlYWtwb2ludCBpbnRvIERVTU1ZX0lOU05fQUREUiBhZGRyZXNzLiBXZQogICAgICBhc3N1bWUgdGhhdCB0aGlzIGFkZHJlc3Mgd2lsbCBuZXZlciBiZSBleGVjdXRlZCBhZ2FpbiBieSB0aGUgcmVhbAogICAgICBjb2RlLiAqLwogCi0gIHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoRFVNTVlfSU5TTl9BRERSLCBzaGFkb3dfY29udGVudHMpOworICBicCA9IGRlcHJlY2F0ZWRfaW5zZXJ0X3Jhd19icmVha3BvaW50IChEVU1NWV9JTlNOX0FERFIpOwogCiAgIC8qIFlvdSBtaWdodCB0aGluayB0aGlzIGNvdWxkIGJlIGRvbmUgd2l0aCBhIHNpbmdsZSBwdHJhY2UgY2FsbCwgYW5kCiAgICAgIHlvdSdkIGJlIGNvcnJlY3QgZm9yIGp1c3QgYWJvdXQgZXZlcnkgcGxhdGZvcm0gSSd2ZSBldmVyIHdvcmtlZApAQCAtNTU5LDcgKzU1OSw3IEBACiAgIHdoaWxlIChwaWQgIT0gUElER0VUIChpbmZlcmlvcl9wdGlkKSk7CiAKICAgd3JpdGVfcGMgKHByZXZfcGMpOwotICB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQgKERVTU1ZX0lOU05fQUREUiwgc2hhZG93X2NvbnRlbnRzKTsKKyAgZGVwcmVjYXRlZF9yZW1vdmVfcmF3X2JyZWFrcG9pbnQgKGJwKTsKIH0KIAogLyogRmV0Y2ggcmVnaXN0ZXJzIGZyb20gdGhlIHJlZ2lzdGVyIHNlY3Rpb24gaW4gY29yZSBiZmQuICovCmRpZmYgLS1naXQgYS9nZGIvcnM2MDAwLXRkZXAuYyBiL2dkYi9yczYwMDAtdGRlcC5jCmluZGV4IGY3ODI4MDAuLmY5MzJiNGMgMTAwNjQ0Ci0tLSBhL2dkYi9yczYwMDAtdGRlcC5jCisrKyBiL2dkYi9yczYwMDAtdGRlcC5jCkBAIC0xMTAsMTcgKzExMCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIG51bWJlci4gICovCiAgIH07CiAKLS8qIEJyZWFrcG9pbnQgc2hhZG93cyBmb3IgdGhlIHNpbmdsZSBzdGVwIGluc3RydWN0aW9ucyB3aWxsIGJlIGtlcHQgaGVyZS4gKi8KLQotc3RhdGljIHN0cnVjdCBzc3RlcF9icmVha3MKLXsKLSAgLyogQWRkcmVzcywgb3IgMCBpZiB0aGlzIGlzIG5vdCBpbiB1c2UuICAqLwotICBDT1JFX0FERFIgYWRkcmVzczsKLSAgLyogU2hhZG93IGNvbnRlbnRzLiAgKi8KLSAgZ2RiX2J5dGUgZGF0YVs0XTsKLX0KLXN0ZXBCcmVha3NbMl07Ci0KIC8qIEhvb2sgZm9yIGRldGVybWluaW5nIHRoZSBUT0MgYWRkcmVzcyB3aGVuIGNhbGxpbmcgZnVuY3Rpb25zIGluIHRoZQogICAgaW5mZXJpb3IgdW5kZXIgQUlYLiBUaGUgaW5pdGlhbGl6YXRpb24gY29kZSBpbiByczYwMDAtbmF0LmMgc2V0cwogICAgdGhpcyBob29rIHRvIHBvaW50IHRvIGZpbmRfdG9jX2FkZHJlc3MuICAqLwpAQCAtNzMwLDcgKzcxOSw2IEBACiAKICAgaWYgKGluc2VydF9icmVha3BvaW50c19wKQogICAgIHsKLQogICAgICAgbG9jID0gcmVhZF9wYyAoKTsKIAogICAgICAgaW5zbiA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGxvYywgNCk7CkBAIC03NDMsMjggKzczMSwxNyBAQAogICAgICAgaWYgKGJyZWFrc1sxXSA9PSBicmVha3NbMF0pCiAJYnJlYWtzWzFdID0gLTE7CiAKLSAgICAgIHN0ZXBCcmVha3NbMV0uYWRkcmVzcyA9IDA7Ci0KICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IDI7ICsraWkpCiAJewotCiAJICAvKiBpZ25vcmUgaW52YWxpZCBicmVha3BvaW50LiAqLwogCSAgaWYgKGJyZWFrc1tpaV0gPT0gLTEpCiAJICAgIGNvbnRpbnVlOwotCSAgdGFyZ2V0X2luc2VydF9icmVha3BvaW50IChicmVha3NbaWldLCBzdGVwQnJlYWtzW2lpXS5kYXRhKTsKLQkgIHN0ZXBCcmVha3NbaWldLmFkZHJlc3MgPSBicmVha3NbaWldOworCSAgaW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQgKGJyZWFrc1tpaV0pOwogCX0KLQogICAgIH0KICAgZWxzZQotICAgIHsKKyAgICByZW1vdmVfc2luZ2xlX3N0ZXBfYnJlYWtwb2ludHMgKCk7CiAKLSAgICAgIC8qIHJlbW92ZSBzdGVwIGJyZWFrcG9pbnRzLiAqLwotICAgICAgZm9yIChpaSA9IDA7IGlpIDwgMjsgKytpaSkKLQlpZiAoc3RlcEJyZWFrc1tpaV0uYWRkcmVzcyAhPSAwKQotCSAgdGFyZ2V0X3JlbW92ZV9icmVha3BvaW50IChzdGVwQnJlYWtzW2lpXS5hZGRyZXNzLAotCQkJCSAgICBzdGVwQnJlYWtzW2lpXS5kYXRhKTsKLSAgICB9CiAgIGVycm5vID0gMDsJCQkvKiBGSVhNRSwgZG9uJ3QgaWdub3JlIGVycm9ycyEgKi8KICAgLyogV2hhdCBlcnJvcnM/ICB7cmVhZCx3cml0ZX1fbWVtb3J5IGNhbGwgZXJyb3IoKS4gICovCiB9CmRpZmYgLS1naXQgYS9nZGIvczM5MC10ZGVwLmMgYi9nZGIvczM5MC10ZGVwLmMKaW5kZXggZGRkZWY3YS4uNDAxOGFkMSAxMDA2NDQKLS0tIGEvZ2RiL3MzOTAtdGRlcC5jCisrKyBiL2dkYi9zMzkwLXRkZXAuYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgImdkYl9hc3NlcnQuaCIKICNpbmNsdWRlICJkaXMtYXNtLmgiCiAjaW5jbHVkZSAic29saWItc3ZyNC5oIgorI2luY2x1ZGUgInByb2xvZ3VlLXZhbHVlLmgiCiAKICNpbmNsdWRlICJzMzkwLXRkZXAuaCIKIApAQCAtNDc2LDMzMCArNDc3LDYgQEAKIH0KIAogCi0vKiBQcm9sb2d1ZSBhbmFseXNpcy4gICovCi0KLS8qIFdoZW4gd2UgYW5hbHl6ZSBhIHByb2xvZ3VlLCB3ZSdyZSByZWFsbHkgZG9pbmcgJ2Fic3RyYWN0Ci0gICBpbnRlcnByZXRhdGlvbicgb3IgJ3BzZXVkby1ldmFsdWF0aW9uJzogcnVubmluZyB0aGUgZnVuY3Rpb24ncyBjb2RlCi0gICBpbiBzaW11bGF0aW9uLCBidXQgdXNpbmcgY29uc2VydmF0aXZlIGFwcHJveGltYXRpb25zIG9mIHRoZSB2YWx1ZXMKLSAgIGl0IHdvdWxkIGhhdmUgd2hlbiBpdCBhY3R1YWxseSBydW5zLiAgRm9yIGV4YW1wbGUsIGlmIG91ciBmdW5jdGlvbgotICAgc3RhcnRzIHdpdGggdGhlIGluc3RydWN0aW9uOgotCi0gICAgICBhaGkgcjEsIDQyICAgICAjIGFkZCBoYWxmd29yZCBpbW1lZGlhdGUgNDIgdG8gcjEKLQotICAgd2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQgdmFsdWUgd2lsbCBiZSBpbiByMSBhZnRlciBleGVjdXRpbmcgdGhpcwotICAgaW5zdHJ1Y3Rpb24sIGJ1dCB3ZSBkbyBrbm93IGl0J2xsIGJlIDQyIGdyZWF0ZXIgdGhhbiBpdHMgb3JpZ2luYWwKLSAgIHZhbHVlLgotCi0gICBJZiB3ZSB0aGVuIHNlZSBhbiBpbnN0cnVjdGlvbiBsaWtlOgotCi0gICAgICBhaGkgcjEsIDIyICAgICAjIGFkZCBoYWxmd29yZCBpbW1lZGlhdGUgMjIgdG8gcjEKLQotICAgd2Ugc3RpbGwgZG9uJ3Qga25vdyB3aGF0IHIxJ3MgdmFsdWUgaXMsIGJ1dCBhZ2Fpbiwgd2UgY2FuIHNheSBpdCBpcwotICAgbm93IDY0IGdyZWF0ZXIgdGhhbiBpdHMgb3JpZ2luYWwgdmFsdWUuCi0KLSAgIElmIHRoZSBuZXh0IGluc3RydWN0aW9uIHdlcmU6Ci0KLSAgICAgIGxyIHIyLCByMSAgICAgICMgc2V0IHIyIHRvIHIxJ3MgdmFsdWUKLQotICAgdGhlbiB3ZSBjYW4gc2F5IHRoYXQgcjIncyB2YWx1ZSBpcyBub3cgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHIxCi0gICBwbHVzIDY0LiAgQW5kIHNvIG9uLgotCi0gICBPZiBjb3Vyc2UsIHRoaXMgY2FuIG9ubHkgZ28gc28gZmFyIGJlZm9yZSBpdCBnZXRzIHVucmVhc29uYWJsZS4gIElmCi0gICB3ZSB3YW50ZWQgdG8gYmUgYWJsZSB0byBzYXkgYW55dGhpbmcgYWJvdXQgdGhlIHZhbHVlIG9mIHIxIGFmdGVyCi0gICB0aGUgaW5zdHJ1Y3Rpb246Ci0KLSAgICAgIHhyIHIxLCByMyAgICAgICMgZXhjbHVzaXZlLW9yIHIxIGFuZCByMywgcGxhY2UgcmVzdWx0IGluIHIxCi0KLSAgIHRoZW4gdGhpbmdzIHdvdWxkIGdldCBwcmV0dHkgY29tcGxleC4gIEJ1dCByZW1lbWJlciwgd2UncmUganVzdAotICAgZG9pbmcgYSBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbjsgaWYgZXhjbHVzaXZlLW9yIGluc3RydWN0aW9ucwotICAgYXJlbid0IHJlbGV2YW50IHRvIHByb2xvZ3Vlcywgd2UgY2FuIGp1c3Qgc2F5IHIxJ3MgdmFsdWUgaXMgbm93Ci0gICAndW5rbm93bicuICBXZSBjYW4gaWdub3JlIHRoaW5ncyB0aGF0IGFyZSB0b28gY29tcGxleCwgaWYgdGhhdCBsb3NzCi0gICBvZiBpbmZvcm1hdGlvbiBpcyBhY2NlcHRhYmxlIGZvciBvdXIgYXBwbGljYXRpb24uCi0KLSAgIE9uY2UgeW91J3ZlIHJlYWNoZWQgYW4gaW5zdHJ1Y3Rpb24gdGhhdCB5b3UgZG9uJ3Qga25vdyBob3cgdG8KLSAgIHNpbXVsYXRlLCB5b3Ugc3RvcC4gIE5vdyB5b3UgZXhhbWluZSB0aGUgc3RhdGUgb2YgdGhlIHJlZ2lzdGVycyBhbmQKLSAgIHN0YWNrIHNsb3RzIHlvdSd2ZSBrZXB0IHRyYWNrIG9mLiAgRm9yIGV4YW1wbGU6Ci0KLSAgIC0gVG8gc2VlIGhvdyBsYXJnZSB5b3VyIHN0YWNrIGZyYW1lIGlzLCBqdXN0IGNoZWNrIHRoZSB2YWx1ZSBvZiBzcDsKLSAgICAgaWYgaXQncyB0aGUgb3JpZ2luYWwgdmFsdWUgb2Ygc3AgbWludXMgYSBjb25zdGFudCwgdGhlbiB0aGF0Ci0gICAgIGNvbnN0YW50IGlzIHRoZSBzdGFjayBmcmFtZSdzIHNpemUuICBJZiB0aGUgc3AncyB2YWx1ZSBoYXMgYmVlbgotICAgICBtYXJrZWQgYXMgJ3Vua25vd24nLCB0aGVuIHRoYXQgbWVhbnMgdGhlIHByb2xvZ3VlIGhhcyBkb25lCi0gICAgIHNvbWV0aGluZyB0b28gY29tcGxleCBmb3IgdXMgdG8gdHJhY2ssIGFuZCB3ZSBkb24ndCBrbm93IHRoZQotICAgICBmcmFtZSBzaXplLgotCi0gICAtIFRvIHNlZSB3aGV0aGVyIHdlJ3ZlIHNhdmVkIHRoZSBTUCBpbiB0aGUgY3VycmVudCBmcmFtZSdzIGJhY2sKLSAgICAgY2hhaW4gc2xvdCwgd2UganVzdCBjaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBiYWNrCi0gICAgIGNoYWluIHN0YWNrIHNsb3QgaXMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBzcC4KLQotICAgU3VyZSwgdGhpcyB0YWtlcyBzb21lIHdvcmsuICBCdXQgcHJvbG9ndWUgYW5hbHl6ZXJzIGFyZW4ndAotICAgcXVpY2stYW5kLXNpbXBsZSBwYXR0ZXJuIHBhdGNoaW5nIHRvIHJlY29nbml6ZSBhIGZldyBmaXhlZCBwcm9sb2d1ZQotICAgZm9ybXMgYW55IG1vcmU7IHRoZXkncmUgYmlnLCBoYWlyeSBmdW5jdGlvbnMuICBBbG9uZyB3aXRoIGluZmVyaW9yCi0gICBmdW5jdGlvbiBjYWxscywgcHJvbG9ndWUgYW5hbHlzaXMgYWNjb3VudHMgZm9yIGEgc3Vic3RhbnRpYWwKLSAgIHBvcnRpb24gb2YgdGhlIHRpbWUgbmVlZGVkIHRvIHN0YWJpbGl6ZSBhIEdEQiBwb3J0LiAgU28gSSB0aGluawotICAgaXQncyB3b3J0aHdoaWxlIHRvIGxvb2sgZm9yIGFuIGFwcHJvYWNoIHRoYXQgd2lsbCBiZSBlYXNpZXIgdG8KLSAgIHVuZGVyc3RhbmQgYW5kIG1haW50YWluLiAgSW4gdGhlIGFwcHJvYWNoIHVzZWQgaGVyZToKLQotICAgLSBJdCdzIGVhc2llciB0byBzZWUgdGhhdCB0aGUgYW5hbHl6ZXIgaXMgY29ycmVjdDogeW91IGp1c3Qgc2VlCi0gICAgIHdoZXRoZXIgdGhlIGFuYWx5emVyIHByb3Blcmx5IChhbGJpZXQgY29uc2VydmF0aXZlbHkpIHNpbXVsYXRlcwotICAgICB0aGUgZWZmZWN0IG9mIGVhY2ggaW5zdHJ1Y3Rpb24uCi0KLSAgIC0gSXQncyBlYXNpZXIgdG8gZXh0ZW5kIHRoZSBhbmFseXplcjogeW91IGNhbiBhZGQgc3VwcG9ydCBmb3IgbmV3Ci0gICAgIGluc3RydWN0aW9ucywgYW5kIGtub3cgdGhhdCB5b3UgaGF2ZW4ndCBicm9rZW4gYW55dGhpbmcgdGhhdAotICAgICB3YXNuJ3QgYWxyZWFkeSBicm9rZW4gYmVmb3JlLgotCi0gICAtIEl0J3Mgb3J0aG9nb25hbDogdG8gZ2F0aGVyIG5ldyBpbmZvcm1hdGlvbiwgeW91IGRvbid0IG5lZWQgdG8KLSAgICAgY29tcGxpY2F0ZSB0aGUgY29kZSBmb3IgZWFjaCBpbnN0cnVjdGlvbi4gIEFzIGxvbmcgYXMgeW91ciBkb21haW4KLSAgICAgb2YgY29uc2VydmF0aXZlIHZhbHVlcyBpcyBhbHJlYWR5IGRldGFpbGVkIGVub3VnaCB0byB0ZWxsIHlvdQotICAgICB3aGF0IHlvdSBuZWVkLCB0aGVuIGFsbCB0aGUgZXhpc3RpbmcgaW5zdHJ1Y3Rpb24gc2ltdWxhdGlvbnMgYXJlCi0gICAgIGFscmVhZHkgZ2F0aGVyaW5nIHRoZSByaWdodCBkYXRhIGZvciB5b3UuCi0KLSAgIEEgJ3N0cnVjdCBwcm9sb2d1ZV92YWx1ZScgaXMgYSBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbiBvZiB0aGUKLSAgIHJlYWwgdmFsdWUgdGhlIHJlZ2lzdGVyIG9yIHN0YWNrIHNsb3Qgd2lsbCBoYXZlLiAgKi8KLQotc3RydWN0IHByb2xvZ3VlX3ZhbHVlIHsKLQotICAvKiBXaGF0IHNvcnQgb2YgdmFsdWUgaXMgdGhpcz8gIFRoaXMgZGV0ZXJtaW5lcyB0aGUgaW50ZXJwcmV0YXRpb24KLSAgICAgb2Ygc3Vic2VxdWVudCBmaWVsZHMuICAqLwotICBlbnVtIHsKLQotICAgIC8qIFdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIHZhbHVlLiAgVGhpcyBpcyBhbHNvIHVzZWQgZm9yCi0gICAgICAgdmFsdWVzIHdlIGNvdWxkIGhhdmUga2VwdCB0cmFjayBvZiwgd2hlbiBkb2luZyBzbyB3b3VsZCBoYXZlCi0gICAgICAgYmVlbiB0b28gY29tcGxleCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBib3RoZXIuICBUaGUgYm90dG9tIG9mCi0gICAgICAgb3VyIGxhdHRpY2UuICAqLwotICAgIHB2X3Vua25vd24sCi0KLSAgICAvKiBBIGtub3duIGNvbnN0YW50LiAgSyBpcyBpdHMgdmFsdWUuICAqLwotICAgIHB2X2NvbnN0YW50LAotCi0gICAgLyogVGhlIHZhbHVlIHRoYXQgcmVnaXN0ZXIgUkVHIG9yaWdpbmFsbHkgaGFkICpVUE9OIEVOVFJZIFRPIFRIRQotICAgICAgIEZVTkNUSU9OKiwgcGx1cyBLLiAgSWYgSyBpcyB6ZXJvLCB0aGlzIG1lYW5zLCBvYnZpb3VzbHksIGp1c3QKLSAgICAgICB0aGUgdmFsdWUgUkVHIGhhZCB1cG9uIGVudHJ5IHRvIHRoZSBmdW5jdGlvbi4gIFJFRyBpcyBhIEdEQgotICAgICAgIHJlZ2lzdGVyIG51bWJlci4gIEJlZm9yZSB3ZSBzdGFydCBpbnRlcnByZXRpbmcsIHdlIGluaXRpYWxpemUKLSAgICAgICBldmVyeSByZWdpc3RlciBSIHRvIHsgcHZfcmVnaXN0ZXIsIFIsIDAgfS4gICovCi0gICAgcHZfcmVnaXN0ZXIsCi0KLSAgfSBraW5kOwotCi0gIC8qIFRoZSBtZWFuaW5ncyBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyBkZXBlbmQgb24gJ2tpbmQnOyBzZWUgdGhlCi0gICAgIGNvbW1lbnRzIGZvciB0aGUgc3BlY2lmaWMgJ2tpbmQnIHZhbHVlcy4gICovCi0gIGludCByZWc7Ci0gIENPUkVfQUREUiBrOwotfTsKLQotCi0vKiBTZXQgViB0byBiZSB1bmtub3duLiAgKi8KLXN0YXRpYyB2b2lkCi1wdl9zZXRfdG9fdW5rbm93biAoc3RydWN0IHByb2xvZ3VlX3ZhbHVlICp2KQotewotICB2LT5raW5kID0gcHZfdW5rbm93bjsKLX0KLQotCi0vKiBTZXQgViB0byB0aGUgY29uc3RhbnQgSy4gICovCi1zdGF0aWMgdm9pZAotcHZfc2V0X3RvX2NvbnN0YW50IChzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKnYsIENPUkVfQUREUiBrKQotewotICB2LT5raW5kID0gcHZfY29uc3RhbnQ7Ci0gIHYtPmsgPSBrOwotfQotCi0KLS8qIFNldCBWIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZWdpc3RlciBSRUcsIHBsdXMgSy4gICovCi1zdGF0aWMgdm9pZAotcHZfc2V0X3RvX3JlZ2lzdGVyIChzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKnYsIGludCByZWcsIENPUkVfQUREUiBrKQotewotICB2LT5raW5kID0gcHZfcmVnaXN0ZXI7Ci0gIHYtPnJlZyA9IHJlZzsKLSAgdi0+ayA9IGs7Ci19Ci0KLQotLyogSWYgb25lIG9mICpBIGFuZCAqQiBpcyBhIGNvbnN0YW50LCBhbmQgdGhlIG90aGVyIGlzbid0LCBzd2FwIHRoZQotICAgcG9pbnRlcnMgYXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0ICpCIHBvaW50cyB0byB0aGUgY29uc3RhbnQuCi0gICBUaGlzIGNhbiByZWR1Y2UgdGhlIG51bWJlciBvZiBjYXNlcyB3ZSBuZWVkIHRvIGFuYWx5emUgaW4gdGhlCi0gICBmdW5jdGlvbnMgYmVsb3cuICAqLwotc3RhdGljIHZvaWQKLXB2X2NvbnN0YW50X2xhc3QgKHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSAqKmEsCi0gICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKipiKQotewotICBpZiAoKCphKS0+a2luZCA9PSBwdl9jb25zdGFudAotICAgICAgJiYgKCpiKS0+a2luZCAhPSBwdl9jb25zdGFudCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKnRlbXAgPSAqYTsKLSAgICAgICphID0gKmI7Ci0gICAgICAqYiA9IHRlbXA7Ci0gICAgfQotfQotCi0KLS8qIFNldCBTVU0gdG8gdGhlIHN1bSBvZiBBIGFuZCBCLiAgU1VNLCBBLCBhbmQgQiBtYXkgcG9pbnQgdG8gdGhlIHNhbWUKLSAgICdzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUnIG9iamVjdC4gICovCi1zdGF0aWMgdm9pZAotcHZfYWRkIChzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKnN1bSwKLSAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlICphLAotICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKmIpCi17Ci0gIHB2X2NvbnN0YW50X2xhc3QgKCZhLCAmYik7Ci0KLSAgLyogV2UgY2FuIGhhbmRsZSBhZGRpbmcgY29uc3RhbnRzIHRvIHJlZ2lzdGVycywgYW5kIG90aGVyIGNvbnN0YW50cy4gICovCi0gIGlmIChiLT5raW5kID09IHB2X2NvbnN0YW50Ci0gICAgICAmJiAoYS0+a2luZCA9PSBwdl9yZWdpc3RlcgotICAgICAgICAgIHx8IGEtPmtpbmQgPT0gcHZfY29uc3RhbnQpKQotICAgIHsKLSAgICAgIHN1bS0+a2luZCA9IGEtPmtpbmQ7Ci0gICAgICBzdW0tPnJlZyA9IGEtPnJlZzsgICAgLyogbm90IG1lYW5pbmdmdWwgaWYgYSBpcyBwdl9jb25zdGFudCwgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFybWxlc3MgKi8KLSAgICAgIHN1bS0+ayA9IGEtPmsgKyBiLT5rOwotICAgIH0KLQotICAvKiBBbnl0aGluZyBlbHNlIHdlIGRvbid0IGtub3cgaG93IHRvIGFkZC4gIFdlIGRvbid0IGhhdmUgYQotICAgICByZXByZXNlbnRhdGlvbiBmb3IsIHNheSwgdGhlIHN1bSBvZiB0d28gcmVnaXN0ZXJzLCBvciBhIG11bHRpcGxlCi0gICAgIG9mIGEgcmVnaXN0ZXIncyB2YWx1ZSAoYWRkaW5nIGEgcmVnaXN0ZXIgdG8gaXRzZWxmKS4gICovCi0gIGVsc2UKLSAgICBzdW0tPmtpbmQgPSBwdl91bmtub3duOwotfQotCi0KLS8qIEFkZCB0aGUgY29uc3RhbnQgSyB0byBWLiAgKi8KLXN0YXRpYyB2b2lkCi1wdl9hZGRfY29uc3RhbnQgKHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSAqdiwgQ09SRV9BRERSIGspCi17Ci0gIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSBwdl9rOwotCi0gIC8qIFJhdGhlciB0aGFuIHRoaW5raW5nIG9mIGFsbCB0aGUgY2FzZXMgd2UgY2FuIGFuZCBjYW4ndCBoYW5kbGUsCi0gICAgIHdlJ2xsIGp1c3QgbGV0IHB2X2FkZCB0YWtlIGNhcmUgb2YgdGhhdCBmb3IgdXMuICAqLwotICBwdl9zZXRfdG9fY29uc3RhbnQgKCZwdl9rLCBrKTsKLSAgcHZfYWRkICh2LCB2LCAmcHZfayk7Ci19Ci0KLQotLyogU3VidHJhY3QgQiBmcm9tIEEsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBESUZGLgotCi0gICBUaGlzIGlzbid0IHF1aXRlIHRoZSBzYW1lIGFzIG5lZ2F0aW5nIEIgYW5kIGFkZGluZyBpdCB0byBBLCBzaW5jZQotICAgd2UgZG9uJ3QgaGF2ZSBhIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgbmVnYXRpb24gb2YgYW55dGhpbmcgYnV0IGEKLSAgIGNvbnN0YW50LiAgRm9yIGV4YW1wbGUsIHdlIGNhbid0IG5lZ2F0ZSB7IHB2X3JlZ2lzdGVyLCBSMSwgMTAgfSwKLSAgIGJ1dCB3ZSBkbyBrbm93IHRoYXQgeyBwdl9yZWdpc3RlciwgUjEsIDEwIH0gbWludXMgeyBwdl9yZWdpc3RlciwKLSAgIFIxLCA1IH0gaXMgeyBwdl9jb25zdGFudCwgPGlnbm9yZWQ+LCA1IH0uCi0KLSAgIFRoaXMgbWVhbnMsIGZvciBleGFtcGxlLCB0aGF0IHdlIGNhbiBzdWJ0cmFjdCB0d28gc3RhY2sgYWRkcmVzc2VzOwotICAgdGhleSdyZSBib3RoIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBTUC4gIFNpbmNlIHRoZSBmcmFtZSBwb2ludGVyCi0gICBpcyBzZXQgYmFzZWQgb24gdGhlIFNQLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUgb3JpZ2luYWwgU1AgcGx1cyBzb21lCi0gICBjb25zdGFudCAocHJvYmFibHkgemVybyksIHNvIHdlIGNhbiB1c2UgaXRzIHZhbHVlIGp1c3QgZmluZS4gICovCi1zdGF0aWMgdm9pZAotcHZfc3VidHJhY3QgKHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSAqZGlmZiwKLSAgICAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKmEsCi0gICAgICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlICpiKQotewotICBwdl9jb25zdGFudF9sYXN0ICgmYSwgJmIpOwotCi0gIC8qIFdlIGNhbiBzdWJ0cmFjdCBhIGNvbnN0YW50IGZyb20gYW5vdGhlciBjb25zdGFudCwgb3IgZnJvbSBhCi0gICAgIHJlZ2lzdGVyLiAgKi8KLSAgaWYgKGItPmtpbmQgPT0gcHZfY29uc3RhbnQKLSAgICAgICYmIChhLT5raW5kID09IHB2X3JlZ2lzdGVyCi0gICAgICAgICAgfHwgYS0+a2luZCA9PSBwdl9jb25zdGFudCkpCi0gICAgewotICAgICAgZGlmZi0+a2luZCA9IGEtPmtpbmQ7Ci0gICAgICBkaWZmLT5yZWcgPSBhLT5yZWc7ICAgIC8qIG5vdCBhbHdheXMgbWVhbmluZ2Z1bCwgYnV0IGhhcm1sZXNzICovCi0gICAgICBkaWZmLT5rID0gYS0+ayAtIGItPms7Ci0gICAgfQotCi0gIC8qIFdlIGNhbiBzdWJ0cmFjdCBhIHJlZ2lzdGVyIGZyb20gaXRzZWxmLCB5aWVsZGluZyBhIGNvbnN0YW50LiAgKi8KLSAgZWxzZSBpZiAoYS0+a2luZCA9PSBwdl9yZWdpc3RlcgotICAgICAgICAgICAmJiBiLT5raW5kID09IHB2X3JlZ2lzdGVyCi0gICAgICAgICAgICYmIGEtPnJlZyA9PSBiLT5yZWcpCi0gICAgewotICAgICAgZGlmZi0+a2luZCA9IHB2X2NvbnN0YW50OwotICAgICAgZGlmZi0+ayA9IGEtPmsgLSBiLT5rOwotICAgIH0KLQotICAvKiBXZSBkb24ndCBrbm93IGhvdyB0byBzdWJ0cmFjdCBhbnl0aGluZyBlbHNlLiAgKi8KLSAgZWxzZQotICAgIGRpZmYtPmtpbmQgPSBwdl91bmtub3duOwotfQotCi0KLS8qIFNldCBBTkQgdG8gdGhlIGxvZ2ljYWwgYW5kIG9mIEEgYW5kIEIuICAqLwotc3RhdGljIHZvaWQKLXB2X2xvZ2ljYWxfYW5kIChzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKmFuZCwKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKmEsCi0gICAgICAgICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlICpiKQotewotICBwdl9jb25zdGFudF9sYXN0ICgmYSwgJmIpOwotCi0gIC8qIFdlIGNhbiAnYW5kJyB0d28gY29uc3RhbnRzLiAgKi8KLSAgaWYgKGEtPmtpbmQgPT0gcHZfY29uc3RhbnQKLSAgICAgICYmIGItPmtpbmQgPT0gcHZfY29uc3RhbnQpCi0gICAgewotICAgICAgYW5kLT5raW5kID0gcHZfY29uc3RhbnQ7Ci0gICAgICBhbmQtPmsgPSBhLT5rICYgYi0+azsKLSAgICB9Ci0KLSAgLyogV2UgY2FuICdhbmQnIGFueXRoaW5nIHdpdGggdGhlIGNvbnN0YW50IHplcm8uICAqLwotICBlbHNlIGlmIChiLT5raW5kID09IHB2X2NvbnN0YW50Ci0gICAgICAgICAgICYmIGItPmsgPT0gMCkKLSAgICB7Ci0gICAgICBhbmQtPmtpbmQgPSBwdl9jb25zdGFudDsKLSAgICAgIGFuZC0+ayA9IDA7Ci0gICAgfQotICAKLSAgLyogV2UgY2FuICdhbmQnIGFueXRoaW5nIHdpdGggfjAuICAqLwotICBlbHNlIGlmIChiLT5raW5kID09IHB2X2NvbnN0YW50Ci0gICAgICAgICAgICYmIGItPmsgPT0gfiAoQ09SRV9BRERSKSAwKQotICAgICphbmQgPSAqYTsKLQotICAvKiBXZSBjYW4gJ2FuZCcgYSByZWdpc3RlciB3aXRoIGl0c2VsZi4gICovCi0gIGVsc2UgaWYgKGEtPmtpbmQgPT0gcHZfcmVnaXN0ZXIKLSAgICAgICAgICAgJiYgYi0+a2luZCA9PSBwdl9yZWdpc3RlcgotICAgICAgICAgICAmJiBhLT5yZWcgPT0gYi0+cmVnCi0gICAgICAgICAgICYmIGEtPmsgPT0gYi0+aykKLSAgICAqYW5kID0gKmE7Ci0KLSAgLyogT3RoZXJ3aXNlLCB3ZSBkb24ndCBrbm93LiAgKi8KLSAgZWxzZQotICAgIHB2X3NldF90b191bmtub3duIChhbmQpOwotfQotCi0KLS8qIFJldHVybiBub24temVybyBpZmYgQSBhbmQgQiBhcmUgaWRlbnRpY2FsIGV4cHJlc3Npb25zLgotCi0gICBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBhc2tpbmcgaWYgdGhlIHR3byB2YWx1ZXMgYXJlIGVxdWFsOyB0aGUKLSAgIHJlc3VsdCBvZiBzdWNoIGEgY29tcGFyaXNvbiB3b3VsZCBoYXZlIHRvIGJlIGEgcHZfYm9vbGVhbiwgYW5kCi0gICBhc2tpbmcgd2hldGhlciB0d28gJ3Vua25vd24nIHZhbHVlcyB3ZXJlIGVxdWFsIHdvdWxkIGdpdmUgeW91Ci0gICBwdl9tYXliZS4gIFNhbWUgZm9yIGNvbXBhcmluZywgc2F5LCB7IHB2X3JlZ2lzdGVyLCBSMSwgMCB9IGFuZCB7Ci0gICBwdl9yZWdpc3RlciwgUjIsIDB9LiAgSW5zdGVhZCwgdGhpcyBpcyBhc2tpbmcgd2hldGhlciB0aGUgdHdvCi0gICByZXByZXNlbnRhdGlvbnMgYXJlIHRoZSBzYW1lLiAgKi8KLXN0YXRpYyBpbnQKLXB2X2lzX2lkZW50aWNhbCAoc3RydWN0IHByb2xvZ3VlX3ZhbHVlICphLAotICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKmIpCi17Ci0gIGlmIChhLT5raW5kICE9IGItPmtpbmQpCi0gICAgcmV0dXJuIDA7Ci0KLSAgc3dpdGNoIChhLT5raW5kKQotICAgIHsKLSAgICBjYXNlIHB2X3Vua25vd246Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIHB2X2NvbnN0YW50OgotICAgICAgcmV0dXJuIChhLT5rID09IGItPmspOwotICAgIGNhc2UgcHZfcmVnaXN0ZXI6Ci0gICAgICByZXR1cm4gKGEtPnJlZyA9PSBiLT5yZWcgJiYgYS0+ayA9PSBiLT5rKTsKLSAgICBkZWZhdWx0OgotICAgICAgZ2RiX2Fzc2VydCAoMCk7Ci0gICAgfQotfQotCi0KLS8qIFJldHVybiBub24temVybyBpZiBBIGlzIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZWdpc3RlciBudW1iZXIgUgotICAgcGx1cyBLLCB6ZXJvIG90aGVyd2lzZS4gICovCi1zdGF0aWMgaW50Ci1wdl9pc19yZWdpc3RlciAoc3RydWN0IHByb2xvZ3VlX3ZhbHVlICphLCBpbnQgciwgQ09SRV9BRERSIGspCi17Ci0gIHJldHVybiAoYS0+a2luZCA9PSBwdl9yZWdpc3RlcgotICAgICAgICAgICYmIGEtPnJlZyA9PSByCi0gICAgICAgICAgJiYgYS0+ayA9PSBrKTsKLX0KLQotCiAvKiBEZWNvZGluZyBTLzM5MCBpbnN0cnVjdGlvbnMuICAqLwogCiAvKiBOYW1lZCBvcGNvZGUgdmFsdWVzIGZvciB0aGUgUy8zOTAgaW5zdHJ1Y3Rpb25zIHdlIHJlY29nbml6ZS4gIFNvbWUKQEAgLTEwMzIsNTAgKzcwOSwyNSBAQAogfQogCiAKLS8qIFNldCBBRERSIHRvIHRoZSBlZmZlY3RpdmUgYWRkcmVzcyBmb3IgYW4gWC1zdHlsZSBpbnN0cnVjdGlvbiwgbGlrZToKLQotICAgICAgICBMIFIxLCBEMihYMiwgQjIpCi0KLSAgIEhlcmUsIFgyIGFuZCBCMiBhcmUgcmVnaXN0ZXJzLCBhbmQgRDIgaXMgYSBzaWduZWQgMjAtYml0Ci0gICBjb25zdGFudDsgdGhlIGVmZmVjdGl2ZSBhZGRyZXNzIGlzIHRoZSBzdW0gb2YgYWxsIHRocmVlLiAgSWYgZWl0aGVyCi0gICBYMiBvciBCMiBhcmUgemVybywgdGhlbiBpdCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHN1bSAtLS0gdGhpcwotICAgbWVhbnMgdGhhdCByMCBjYW4ndCBiZSB1c2VkIGFzIGVpdGhlciBYMiBvciBCMi4KLQotICAgR1BSIGlzIGFuIGFycmF5IG9mIGdlbmVyYWwgcmVnaXN0ZXIgdmFsdWVzLCBpbmRleGVkIGJ5IEdQUiBudW1iZXIsCi0gICBub3QgR0RCIHJlZ2lzdGVyIG51bWJlci4gICovCi1zdGF0aWMgdm9pZAotY29tcHV0ZV94X2FkZHIgKHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSAqYWRkciwgCi0gICAgICAgICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlICpncHIsCi0gICAgICAgICAgICAgICAgaW50IGQyLCB1bnNpZ25lZCBpbnQgeDIsIHVuc2lnbmVkIGludCBiMikKLXsKLSAgLyogV2UgY2FuJ3QganVzdCBhZGQgc3R1ZmYgZGlyZWN0bHkgaW4gYWRkcjsgaXQgbWlnaHQgYWxpYXMgc29tZSBvZgotICAgICB0aGUgcmVnaXN0ZXJzIHdlIG5lZWQgdG8gcmVhZC4gICovCi0gIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSByZXN1bHQ7Ci0KLSAgcHZfc2V0X3RvX2NvbnN0YW50ICgmcmVzdWx0LCBkMik7Ci0gIGlmICh4MikKLSAgICBwdl9hZGQgKCZyZXN1bHQsICZyZXN1bHQsICZncHJbeDJdKTsKLSAgaWYgKGIyKQotICAgIHB2X2FkZCAoJnJlc3VsdCwgJnJlc3VsdCwgJmdwcltiMl0pOwotCi0gICphZGRyID0gcmVzdWx0OwotfQotCisvKiBQcm9sb2d1ZSBhbmFseXNpcy4gICovCiAKICNkZWZpbmUgUzM5MF9OVU1fR1BSUyAxNgogI2RlZmluZSBTMzkwX05VTV9GUFJTIDE2CiAKIHN0cnVjdCBzMzkwX3Byb2xvZ3VlX2RhdGEgewogCisgIC8qIFRoZSBzdGFjay4gICovCisgIHN0cnVjdCBwdl9hcmVhICpzdGFjazsKKwogICAvKiBUaGUgc2l6ZSBvZiBhIEdQUiBvciBGUFIuICAqLwogICBpbnQgZ3ByX3NpemU7CiAgIGludCBmcHJfc2l6ZTsKIAogICAvKiBUaGUgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycy4gICovCi0gIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSBncHJbUzM5MF9OVU1fR1BSU107CisgIHB2X3QgZ3ByW1MzOTBfTlVNX0dQUlNdOwogCiAgIC8qIFRoZSBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMuICAqLwotICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgZnByW1MzOTBfTlVNX0ZQUlNdOworICBwdl90IGZwcltTMzkwX05VTV9GUFJTXTsKIAogICAvKiBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBDRkEgd2hlcmUgdGhlIGluY29taW5nIEdQUiBOIHdhcyBzYXZlZAogICAgICBieSB0aGUgZnVuY3Rpb24gcHJvbG9ndWUuICAwIGlmIG5vdCBzYXZlZCBvciB1bmtub3duLiAgKi8KQEAgLTEwODksMjIgKzc0MSw0NCBAQAogICBpbnQgYmFja19jaGFpbl9zYXZlZF9wOwogfTsKIAotLyogRG8gYSBTSVpFLWJ5dGUgc3RvcmUgb2YgVkFMVUUgdG8gQUREUi4gICovCi1zdGF0aWMgdm9pZAotczM5MF9zdG9yZSAoc3RydWN0IHByb2xvZ3VlX3ZhbHVlICphZGRyLAotICAgICAgICAgICAgQ09SRV9BRERSIHNpemUsCi0gICAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKnZhbHVlLAotCSAgICBzdHJ1Y3QgczM5MF9wcm9sb2d1ZV9kYXRhICpkYXRhKQorLyogUmV0dXJuIHRoZSBlZmZlY3RpdmUgYWRkcmVzcyBmb3IgYW4gWC1zdHlsZSBpbnN0cnVjdGlvbiwgbGlrZToKKworICAgICAgICBMIFIxLCBEMihYMiwgQjIpCisKKyAgIEhlcmUsIFgyIGFuZCBCMiBhcmUgcmVnaXN0ZXJzLCBhbmQgRDIgaXMgYSBzaWduZWQgMjAtYml0CisgICBjb25zdGFudDsgdGhlIGVmZmVjdGl2ZSBhZGRyZXNzIGlzIHRoZSBzdW0gb2YgYWxsIHRocmVlLiAgSWYgZWl0aGVyCisgICBYMiBvciBCMiBhcmUgemVybywgdGhlbiBpdCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHN1bSAtLS0gdGhpcworICAgbWVhbnMgdGhhdCByMCBjYW4ndCBiZSB1c2VkIGFzIGVpdGhlciBYMiBvciBCMi4gICovCitzdGF0aWMgcHZfdAorczM5MF9hZGRyIChzdHJ1Y3QgczM5MF9wcm9sb2d1ZV9kYXRhICpkYXRhLAorCSAgIGludCBkMiwgdW5zaWduZWQgaW50IHgyLCB1bnNpZ25lZCBpbnQgYjIpCiB7Ci0gIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSBjZmEsIG9mZnNldDsKLSAgaW50IGk7CisgIHB2X3QgcmVzdWx0OworCisgIHJlc3VsdCA9IHB2X2NvbnN0YW50IChkMik7CisgIGlmICh4MikKKyAgICByZXN1bHQgPSBwdl9hZGQgKHJlc3VsdCwgZGF0YS0+Z3ByW3gyXSk7CisgIGlmIChiMikKKyAgICByZXN1bHQgPSBwdl9hZGQgKHJlc3VsdCwgZGF0YS0+Z3ByW2IyXSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogRG8gYSBTSVpFLWJ5dGUgc3RvcmUgb2YgVkFMVUUgdG8gRDIoWDIsQjIpLiAgKi8KK3N0YXRpYyB2b2lkCitzMzkwX3N0b3JlIChzdHJ1Y3QgczM5MF9wcm9sb2d1ZV9kYXRhICpkYXRhLAorCSAgICBpbnQgZDIsIHVuc2lnbmVkIGludCB4MiwgdW5zaWduZWQgaW50IGIyLCBDT1JFX0FERFIgc2l6ZSwKKwkgICAgcHZfdCB2YWx1ZSkKK3sKKyAgcHZfdCBhZGRyID0gczM5MF9hZGRyIChkYXRhLCBkMiwgeDIsIGIyKTsKKyAgcHZfdCBvZmZzZXQ7CiAKICAgLyogQ2hlY2sgd2hldGhlciB3ZSBhcmUgc3RvcmluZyB0aGUgYmFja2NoYWluLiAgKi8KLSAgcHZfc3VidHJhY3QgKCZvZmZzZXQsICZkYXRhLT5ncHJbUzM5MF9TUF9SRUdOVU0gLSBTMzkwX1IwX1JFR05VTV0sIGFkZHIpOworICBvZmZzZXQgPSBwdl9zdWJ0cmFjdCAoZGF0YS0+Z3ByW1MzOTBfU1BfUkVHTlVNIC0gUzM5MF9SMF9SRUdOVU1dLCBhZGRyKTsKIAotICBpZiAob2Zmc2V0LmtpbmQgPT0gcHZfY29uc3RhbnQgJiYgb2Zmc2V0LmsgPT0gMCkKKyAgaWYgKHB2X2lzX2NvbnN0YW50IChvZmZzZXQpICYmIG9mZnNldC5rID09IDApCiAgICAgaWYgKHNpemUgPT0gZGF0YS0+Z3ByX3NpemUKLQkmJiBwdl9pc19yZWdpc3RlciAodmFsdWUsIFMzOTBfU1BfUkVHTlVNLCAwKSkKKwkmJiBwdl9pc19yZWdpc3Rlcl9rICh2YWx1ZSwgUzM5MF9TUF9SRUdOVU0sIDApKQogICAgICAgewogCWRhdGEtPmJhY2tfY2hhaW5fc2F2ZWRfcCA9IDE7CiAJcmV0dXJuOwpAQCAtMTExMiwzNyArNzg2LDggQEAKIAogCiAgIC8qIENoZWNrIHdoZXRoZXIgd2UgYXJlIHN0b3JpbmcgYSByZWdpc3RlciBpbnRvIHRoZSBzdGFjay4gICovCi0gIHB2X3NldF90b19yZWdpc3RlciAoJmNmYSwgUzM5MF9TUF9SRUdOVU0sIDE2ICogZGF0YS0+Z3ByX3NpemUgKyAzMik7Ci0gIHB2X3N1YnRyYWN0ICgmb2Zmc2V0LCAmY2ZhLCBhZGRyKTsKLQotICBpZiAob2Zmc2V0LmtpbmQgPT0gcHZfY29uc3RhbnQKLSAgICAgICYmIG9mZnNldC5rIDwgSU5UX01BWCAmJiBvZmZzZXQuayA+IDAKLSAgICAgICYmIG9mZnNldC5rICUgZGF0YS0+Z3ByX3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBhcmUgc3RvcmluZyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgYSByZWdpc3Rlciwgd2Ugd2FudCB0bwotCSByZWNvcmQgdGhlIENGQSBvZmZzZXQuICBJZiB0aGUgc2FtZSByZWdpc3RlciBpcyBzdG9yZWQgbXVsdGlwbGUKLQkgdGltZXMsIHRoZSBzdGFjayBzbG90IHdpdGggdGhlIGhpZ2hlc3QgYWRkcmVzcyBjb3VudHMuICAqLwotICAgICAgCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgUzM5MF9OVU1fR1BSUzsgaSsrKQotCWlmIChzaXplID09IGRhdGEtPmdwcl9zaXplCi0JICAgICYmIHB2X2lzX3JlZ2lzdGVyICh2YWx1ZSwgUzM5MF9SMF9SRUdOVU0gKyBpLCAwKSkKLQkgIGlmIChkYXRhLT5ncHJfc2xvdFtpXSA9PSAwCi0JICAgICAgfHwgZGF0YS0+Z3ByX3Nsb3RbaV0gPiBvZmZzZXQuaykKLQkgICAgewotCSAgICAgIGRhdGEtPmdwcl9zbG90W2ldID0gb2Zmc2V0Lms7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBTMzkwX05VTV9GUFJTOyBpKyspCi0JaWYgKHNpemUgPT0gZGF0YS0+ZnByX3NpemUKLQkgICAgJiYgcHZfaXNfcmVnaXN0ZXIgKHZhbHVlLCBTMzkwX0YwX1JFR05VTSArIGksIDApKQotCSAgaWYgKGRhdGEtPmZwcl9zbG90W2ldID09IDAKLQkgICAgICB8fCBkYXRhLT5mcHJfc2xvdFtpXSA+IG9mZnNldC5rKQotCSAgICB7Ci0JICAgICAgZGF0YS0+ZnByX3Nsb3RbaV0gPSBvZmZzZXQuazsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLSAgICB9CisgIGlmICghcHZfYXJlYV9zdG9yZV93b3VsZF90cmFzaCAoZGF0YS0+c3RhY2ssIGFkZHIpKQorICAgIHB2X2FyZWFfc3RvcmUgKGRhdGEtPnN0YWNrLCBhZGRyLCBzaXplLCB2YWx1ZSk7CiAKIAogICAvKiBOb3RlOiBJZiB0aGlzIGlzIHNvbWUgc3RvcmUgd2UgY2Fubm90IGlkZW50aWZ5LCB5b3UgbWlnaHQgdGhpbmsgd2UKQEAgLTExNTMsNjAgKzc5OCw3NiBAQAogICAgICBzdG9yZXMuICBUaHVzIGV2ZXJ5IHN0b3JlIHdlIGNhbm5vdCByZWNvZ25pemUgZG9lcyBub3QgaGl0IG91ciBkYXRhLiAgKi8KIH0KIAotLyogRG8gYSBTSVpFLWJ5dGUgbG9hZCBmcm9tIEFERFIgaW50byBWQUxVRS4gICovCi1zdGF0aWMgdm9pZAotczM5MF9sb2FkIChzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKmFkZHIsCi0JICAgQ09SRV9BRERSIHNpemUsCi0JICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlICp2YWx1ZSwKLQkgICBzdHJ1Y3QgczM5MF9wcm9sb2d1ZV9kYXRhICpkYXRhKQorLyogRG8gYSBTSVpFLWJ5dGUgbG9hZCBmcm9tIEQyKFgyLEIyKS4gICovCitzdGF0aWMgcHZfdAorczM5MF9sb2FkIChzdHJ1Y3QgczM5MF9wcm9sb2d1ZV9kYXRhICpkYXRhLAorCSAgIGludCBkMiwgdW5zaWduZWQgaW50IHgyLCB1bnNpZ25lZCBpbnQgYjIsIENPUkVfQUREUiBzaXplKQorCSAgIAogewotICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgY2ZhLCBvZmZzZXQ7Ci0gIGludCBpOworICBwdl90IGFkZHIgPSBzMzkwX2FkZHIgKGRhdGEsIGQyLCB4MiwgYjIpOworICBwdl90IG9mZnNldDsKIAogICAvKiBJZiBpdCdzIGEgbG9hZCBmcm9tIGFuIGluLWxpbmUgY29uc3RhbnQgcG9vbCwgdGhlbiB3ZSBjYW4KICAgICAgc2ltdWxhdGUgdGhhdCwgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgY29kZSBpc24ndAogICAgICBnb2luZyB0byBjaGFuZ2UgYmV0d2VlbiB0aGUgdGltZSB0aGUgcHJvY2Vzc29yIGFjdHVhbGx5CiAgICAgIGV4ZWN1dGVkIGl0IGNyZWF0aW5nIHRoZSBjdXJyZW50IGZyYW1lLCBhbmQgdGhlIHRpbWUgd2hlbgogICAgICB3ZSdyZSBhbmFseXppbmcgdGhlIGNvZGUgdG8gdW53aW5kIHBhc3QgdGhhdCBmcmFtZS4gICovCi0gIGlmIChhZGRyLT5raW5kID09IHB2X2NvbnN0YW50KQorICBpZiAocHZfaXNfY29uc3RhbnQgKGFkZHIpKQogICAgIHsKICAgICAgIHN0cnVjdCBzZWN0aW9uX3RhYmxlICpzZWNwOwotICAgICAgc2VjcCA9IHRhcmdldF9zZWN0aW9uX2J5X2FkZHIgKCZjdXJyZW50X3RhcmdldCwgYWRkci0+ayk7CisgICAgICBzZWNwID0gdGFyZ2V0X3NlY3Rpb25fYnlfYWRkciAoJmN1cnJlbnRfdGFyZ2V0LCBhZGRyLmspOwogICAgICAgaWYgKHNlY3AgIT0gTlVMTAogICAgICAgICAgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHNlY3AtPmJmZCwgc2VjcC0+dGhlX2JmZF9zZWN0aW9uKQogICAgICAgICAgICAgICAmIFNFQ19SRUFET05MWSkpCi0JewotICAgICAgICAgIHB2X3NldF90b19jb25zdGFudCAodmFsdWUsIHJlYWRfbWVtb3J5X2ludGVnZXIgKGFkZHItPmssIHNpemUpKTsKLQkgIHJldHVybjsKLQl9CisgICAgICAgIHJldHVybiBwdl9jb25zdGFudCAocmVhZF9tZW1vcnlfaW50ZWdlciAoYWRkci5rLCBzaXplKSk7CiAgICAgfQogCiAgIC8qIENoZWNrIHdoZXRoZXIgd2UgYXJlIGFjY2Vzc2luZyBvbmUgb2Ygb3VyIHNhdmUgc2xvdHMuICAqLwotICBwdl9zZXRfdG9fcmVnaXN0ZXIgKCZjZmEsIFMzOTBfU1BfUkVHTlVNLCAxNiAqIGRhdGEtPmdwcl9zaXplICsgMzIpOwotICBwdl9zdWJ0cmFjdCAoJm9mZnNldCwgJmNmYSwgYWRkcik7Ci0KLSAgaWYgKG9mZnNldC5raW5kID09IHB2X2NvbnN0YW50Ci0gICAgICAmJiBvZmZzZXQuayA8IElOVF9NQVggJiYgb2Zmc2V0LmsgPiAwKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBTMzkwX05VTV9HUFJTOyBpKyspCi0JaWYgKG9mZnNldC5rID09IGRhdGEtPmdwcl9zbG90W2ldKQotCSAgewotCSAgICBwdl9zZXRfdG9fcmVnaXN0ZXIgKHZhbHVlLCBTMzkwX1IwX1JFR05VTSArIGksIDApOwotCSAgICByZXR1cm47Ci0JICB9Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBTMzkwX05VTV9GUFJTOyBpKyspCi0JaWYgKG9mZnNldC5rID09IGRhdGEtPmZwcl9zbG90W2ldKQotCSAgewotCSAgICBwdl9zZXRfdG9fcmVnaXN0ZXIgKHZhbHVlLCBTMzkwX0YwX1JFR05VTSArIGksIDApOwotCSAgICByZXR1cm47Ci0JICB9Ci0gICAgfQotCi0gIC8qIE90aGVyd2lzZSwgd2UgZG9uJ3Qga25vdyB0aGUgdmFsdWUuICAqLwotICBwdl9zZXRfdG9fdW5rbm93biAodmFsdWUpOworICByZXR1cm4gcHZfYXJlYV9mZXRjaCAoZGF0YS0+c3RhY2ssIGFkZHIsIHNpemUpOwogfQotICAgICAgICAgICAgCisKKy8qIEZ1bmN0aW9uIGZvciBmaW5kaW5nIHNhdmVkIHJlZ2lzdGVycyBpbiBhICdzdHJ1Y3QgcHZfYXJlYSc7IHdlIHBhc3MKKyAgIHRoaXMgdG8gcHZfYXJlYV9zY2FuLgorCisgICBJZiBWQUxVRSBpcyBhIHNhdmVkIHJlZ2lzdGVyLCBBRERSIHNheXMgaXQgd2FzIHNhdmVkIGF0IGEgY29uc3RhbnQKKyAgIG9mZnNldCBmcm9tIHRoZSBmcmFtZSBiYXNlLCBhbmQgU0laRSBpbmRpY2F0ZXMgdGhhdCB0aGUgd2hvbGUKKyAgIHJlZ2lzdGVyIHdhcyBzYXZlZCwgcmVjb3JkIGl0cyBvZmZzZXQgaW4gdGhlIHJlZ19vZmZzZXQgdGFibGUgaW4KKyAgIFBST0xPR1VFX1VOVFlQRUQuICAqLworc3RhdGljIHZvaWQKK3MzOTBfY2hlY2tfZm9yX3NhdmVkICh2b2lkICpkYXRhX3VudHlwZWQsIHB2X3QgYWRkciwgQ09SRV9BRERSIHNpemUsIHB2X3QgdmFsdWUpCit7CisgIHN0cnVjdCBzMzkwX3Byb2xvZ3VlX2RhdGEgKmRhdGEgPSBkYXRhX3VudHlwZWQ7CisgIGludCBpLCBvZmZzZXQ7CisKKyAgaWYgKCFwdl9pc19yZWdpc3RlciAoYWRkciwgUzM5MF9TUF9SRUdOVU0pKQorICAgIHJldHVybjsKKworICBvZmZzZXQgPSAxNiAqIGRhdGEtPmdwcl9zaXplICsgMzIgLSBhZGRyLms7CisKKyAgLyogSWYgd2UgYXJlIHN0b3JpbmcgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIGEgcmVnaXN0ZXIsIHdlIHdhbnQgdG8KKyAgICAgcmVjb3JkIHRoZSBDRkEgb2Zmc2V0LiAgSWYgdGhlIHNhbWUgcmVnaXN0ZXIgaXMgc3RvcmVkIG11bHRpcGxlCisgICAgIHRpbWVzLCB0aGUgc3RhY2sgc2xvdCB3aXRoIHRoZSBoaWdoZXN0IGFkZHJlc3MgY291bnRzLiAgKi8KKyAKKyAgZm9yIChpID0gMDsgaSA8IFMzOTBfTlVNX0dQUlM7IGkrKykKKyAgICBpZiAoc2l6ZSA9PSBkYXRhLT5ncHJfc2l6ZQorCSYmIHB2X2lzX3JlZ2lzdGVyX2sgKHZhbHVlLCBTMzkwX1IwX1JFR05VTSArIGksIDApKQorICAgICAgaWYgKGRhdGEtPmdwcl9zbG90W2ldID09IDAKKwkgIHx8IGRhdGEtPmdwcl9zbG90W2ldID4gb2Zmc2V0KQorCXsKKwkgIGRhdGEtPmdwcl9zbG90W2ldID0gb2Zmc2V0OworCSAgcmV0dXJuOworCX0KKworICBmb3IgKGkgPSAwOyBpIDwgUzM5MF9OVU1fRlBSUzsgaSsrKQorICAgIGlmIChzaXplID09IGRhdGEtPmZwcl9zaXplCisJJiYgcHZfaXNfcmVnaXN0ZXJfayAodmFsdWUsIFMzOTBfRjBfUkVHTlVNICsgaSwgMCkpCisgICAgICBpZiAoZGF0YS0+ZnByX3Nsb3RbaV0gPT0gMAorCSAgfHwgZGF0YS0+ZnByX3Nsb3RbaV0gPiBvZmZzZXQpCisJeworCSAgZGF0YS0+ZnByX3Nsb3RbaV0gPSBvZmZzZXQ7CisJICByZXR1cm47CisJfQorfQogCiAvKiBBbmFseXplIHRoZSBwcm9sb2d1ZSBvZiB0aGUgZnVuY3Rpb24gc3RhcnRpbmcgYXQgU1RBUlRfUEMsCiAgICBjb250aW51aW5nIGF0IG1vc3QgdW50aWwgQ1VSUkVOVF9QQy4gIEluaXRpYWxpemUgREFUQSB0bwpAQCAtMTIzOCw2ICs4OTksOCBAQAogICB7CiAgICAgaW50IGk7CiAKKyAgICBkYXRhLT5zdGFjayA9IG1ha2VfcHZfYXJlYSAoUzM5MF9TUF9SRUdOVU0pOworCiAgICAgLyogRm9yIHRoZSBwdXJwb3NlIG9mIHByb2xvZ3VlIHRyYWNraW5nLCB3ZSBjb25zaWRlciB0aGUgR1BSIHNpemUgdG8KICAgICAgICBiZSBlcXVhbCB0byB0aGUgQUJJIHdvcmQgc2l6ZSwgZXZlbiBpZiBpdCBpcyBhY3R1YWxseSBsYXJnZXIKICAgICAgICAoaS5lLiB3aGVuIHJ1bm5pbmcgYSAzMi1iaXQgYmluYXJ5IHVuZGVyIGEgNjQtYml0IGtlcm5lbCkuICAqLwpAQCAtMTI0NSwxMCArOTA4LDEwIEBACiAgICAgZGF0YS0+ZnByX3NpemUgPSA4OwogCiAgICAgZm9yIChpID0gMDsgaSA8IFMzOTBfTlVNX0dQUlM7IGkrKykKLSAgICAgIHB2X3NldF90b19yZWdpc3RlciAoJmRhdGEtPmdwcltpXSwgUzM5MF9SMF9SRUdOVU0gKyBpLCAwKTsKKyAgICAgIGRhdGEtPmdwcltpXSA9IHB2X3JlZ2lzdGVyIChTMzkwX1IwX1JFR05VTSArIGksIDApOwogCiAgICAgZm9yIChpID0gMDsgaSA8IFMzOTBfTlVNX0ZQUlM7IGkrKykKLSAgICAgIHB2X3NldF90b19yZWdpc3RlciAoJmRhdGEtPmZwcltpXSwgUzM5MF9GMF9SRUdOVU0gKyBpLCAwKTsKKyAgICAgIGRhdGEtPmZwcltpXSA9IHB2X3JlZ2lzdGVyIChTMzkwX0YwX1JFR05VTSArIGksIDApOwogCiAgICAgZm9yIChpID0gMDsgaSA8IFMzOTBfTlVNX0dQUlM7IGkrKykKICAgICAgIGRhdGEtPmdwcl9zbG90W2ldICA9IDA7CkBAIC0xMjY2LDEzICs5MjksMTcgQEAKICAgICAgIGJmZF9ieXRlIGluc25bUzM5MF9NQVhfSU5TVFJfU0laRV07CiAgICAgICBpbnQgaW5zbl9sZW4gPSBzMzkwX3JlYWRpbnN0cnVjdGlvbiAoaW5zbiwgcGMpOwogCisgICAgICBiZmRfYnl0ZSBkdW1teVtTMzkwX01BWF9JTlNUUl9TSVpFXSA9IHsgMCB9OworICAgICAgYmZkX2J5dGUgKmluc24zMiA9IHdvcmRfc2l6ZSA9PSA0ID8gaW5zbiA6IGR1bW15OworICAgICAgYmZkX2J5dGUgKmluc242NCA9IHdvcmRfc2l6ZSA9PSA4ID8gaW5zbiA6IGR1bW15OworCiAgICAgICAvKiBGaWVsZHMgZm9yIHZhcmlvdXMga2luZHMgb2YgaW5zdHJ1Y3Rpb25zLiAgKi8KICAgICAgIHVuc2lnbmVkIGludCBiMiwgcjEsIHIyLCB4MiwgcjM7CiAgICAgICBpbnQgaTIsIGQyOwogCiAgICAgICAvKiBUaGUgdmFsdWVzIG9mIFNQIGFuZCBGUCBiZWZvcmUgdGhpcyBpbnN0cnVjdGlvbiwKICAgICAgICAgIGZvciBkZXRlY3RpbmcgaW5zdHJ1Y3Rpb25zIHRoYXQgY2hhbmdlIHRoZW0uICAqLwotICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIHByZV9pbnNuX3NwLCBwcmVfaW5zbl9mcDsKKyAgICAgIHB2X3QgcHJlX2luc25fc3AsIHByZV9pbnNuX2ZwOwogICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSBmbGFnIHdoZXRoZXIgdGhlIGJhY2sgY2hhaW4gd2FzIHNhdmVkLiAgKi8KICAgICAgIGludCBwcmVfaW5zbl9iYWNrX2NoYWluX3NhdmVkX3A7CiAKQEAgLTEyODksMzIwICs5NTYsMTI2IEBACiAgICAgICBwcmVfaW5zbl9mcCA9IGRhdGEtPmdwcltTMzkwX0ZSQU1FX1JFR05VTSAtIFMzOTBfUjBfUkVHTlVNXTsKICAgICAgIHByZV9pbnNuX2JhY2tfY2hhaW5fc2F2ZWRfcCA9IGRhdGEtPmJhY2tfY2hhaW5fc2F2ZWRfcDsKIAotICAgICAgLyogTEhJIHIxLCBpMiAtLS0gbG9hZCBoYWxmd29yZCBpbW1lZGlhdGUgKi8KLSAgICAgIGlmICh3b3JkX3NpemUgPT0gNAotCSAgJiYgaXNfcmkgKGluc24sIG9wMV9saGksIG9wMl9saGksICZyMSwgJmkyKSkKLSAgICAgICAgcHZfc2V0X3RvX2NvbnN0YW50ICgmZGF0YS0+Z3ByW3IxXSwgaTIpOwogCi0gICAgICAvKiBMR0hJIHIxLCBpMiAtLS0gbG9hZCBoYWxmd29yZCBpbW1lZGlhdGUgKDY0LWJpdCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDgKLQkgICAgICAgJiYgaXNfcmkgKGluc24sIG9wMV9sZ2hpLCBvcDJfbGdoaSwgJnIxLCAmaTIpKQotICAgICAgICBwdl9zZXRfdG9fY29uc3RhbnQgKCZkYXRhLT5ncHJbcjFdLCBpMik7CisgICAgICAvKiBMSEkgcjEsIGkyIC0tLSBsb2FkIGhhbGZ3b3JkIGltbWVkaWF0ZS4gICovCisgICAgICAvKiBMR0hJIHIxLCBpMiAtLS0gbG9hZCBoYWxmd29yZCBpbW1lZGlhdGUgKDY0LWJpdCB2ZXJzaW9uKS4gICovCisgICAgICAvKiBMR0ZJIHIxLCBpMiAtLS0gbG9hZCBmdWxsd29yZCBpbW1lZGlhdGUuICAqLworICAgICAgaWYgKGlzX3JpIChpbnNuMzIsIG9wMV9saGksIG9wMl9saGksICZyMSwgJmkyKQorICAgICAgICAgIHx8IGlzX3JpIChpbnNuNjQsIG9wMV9sZ2hpLCBvcDJfbGdoaSwgJnIxLCAmaTIpCisgICAgICAgICAgfHwgaXNfcmlsIChpbnNuLCBvcDFfbGdmaSwgb3AyX2xnZmksICZyMSwgJmkyKSkKKwlkYXRhLT5ncHJbcjFdID0gcHZfY29uc3RhbnQgKGkyKTsKIAotICAgICAgLyogTEdGSSByMSwgaTIgLS0tIGxvYWQgZnVsbHdvcmQgaW1tZWRpYXRlICovCi0gICAgICBlbHNlIGlmIChpc19yaWwgKGluc24sIG9wMV9sZ2ZpLCBvcDJfbGdmaSwgJnIxLCAmaTIpKQotICAgICAgICBwdl9zZXRfdG9fY29uc3RhbnQgKCZkYXRhLT5ncHJbcjFdLCBpMik7CisgICAgICAvKiBMUiByMSwgcjIgLS0tIGxvYWQgZnJvbSByZWdpc3Rlci4gICovCisgICAgICAvKiBMR1IgcjEsIHIyIC0tLSBsb2FkIGZyb20gcmVnaXN0ZXIgKDY0LWJpdCB2ZXJzaW9uKS4gICovCisgICAgICBlbHNlIGlmIChpc19yciAoaW5zbjMyLCBvcF9sciwgJnIxLCAmcjIpCisJICAgICAgIHx8IGlzX3JyZSAoaW5zbjY0LCBvcF9sZ3IsICZyMSwgJnIyKSkKKwlkYXRhLT5ncHJbcjFdID0gZGF0YS0+Z3ByW3IyXTsKIAotICAgICAgLyogTFIgcjEsIHIyIC0tLSBsb2FkIGZyb20gcmVnaXN0ZXIgKi8KLSAgICAgIGVsc2UgaWYgKHdvcmRfc2l6ZSA9PSA0Ci0JICAgICAgICYmIGlzX3JyIChpbnNuLCBvcF9sciwgJnIxLCAmcjIpKQotICAgICAgICBkYXRhLT5ncHJbcjFdID0gZGF0YS0+Z3ByW3IyXTsKKyAgICAgIC8qIEwgcjEsIGQyKHgyLCBiMikgLS0tIGxvYWQuICAqLworICAgICAgLyogTFkgcjEsIGQyKHgyLCBiMikgLS0tIGxvYWQgKGxvbmctZGlzcGxhY2VtZW50IHZlcnNpb24pLiAgKi8KKyAgICAgIC8qIExHIHIxLCBkMih4MiwgYjIpIC0tLSBsb2FkICg2NC1iaXQgdmVyc2lvbikuICAqLworICAgICAgZWxzZSBpZiAoaXNfcnggKGluc24zMiwgb3BfbCwgJnIxLCAmZDIsICZ4MiwgJmIyKQorCSAgICAgICB8fCBpc19yeHkgKGluc24zMiwgb3AxX2x5LCBvcDJfbHksICZyMSwgJmQyLCAmeDIsICZiMikKKwkgICAgICAgfHwgaXNfcnh5IChpbnNuNjQsIG9wMV9sZywgb3AyX2xnLCAmcjEsICZkMiwgJngyLCAmYjIpKQorCWRhdGEtPmdwcltyMV0gPSBzMzkwX2xvYWQgKGRhdGEsIGQyLCB4MiwgYjIsIGRhdGEtPmdwcl9zaXplKTsKIAotICAgICAgLyogTEdSIHIxLCByMiAtLS0gbG9hZCBmcm9tIHJlZ2lzdGVyICg2NC1iaXQgdmVyc2lvbikgKi8KLSAgICAgIGVsc2UgaWYgKHdvcmRfc2l6ZSA9PSA4Ci0gICAgICAgICAgICAgICAmJiBpc19ycmUgKGluc24sIG9wX2xnciwgJnIxLCAmcjIpKQotICAgICAgICBkYXRhLT5ncHJbcjFdID0gZGF0YS0+Z3ByW3IyXTsKKyAgICAgIC8qIFNUIHIxLCBkMih4MiwgYjIpIC0tLSBzdG9yZS4gICovCisgICAgICAvKiBTVFkgcjEsIGQyKHgyLCBiMikgLS0tIHN0b3JlIChsb25nLWRpc3BsYWNlbWVudCB2ZXJzaW9uKS4gICovCisgICAgICAvKiBTVEcgcjEsIGQyKHgyLCBiMikgLS0tIHN0b3JlICg2NC1iaXQgdmVyc2lvbikuICAqLworICAgICAgZWxzZSBpZiAoaXNfcnggKGluc24zMiwgb3Bfc3QsICZyMSwgJmQyLCAmeDIsICZiMikKKwkgICAgICAgfHwgaXNfcnh5IChpbnNuMzIsIG9wMV9zdHksIG9wMl9zdHksICZyMSwgJmQyLCAmeDIsICZiMikKKwkgICAgICAgfHwgaXNfcnh5IChpbnNuNjQsIG9wMV9zdGcsIG9wMl9zdGcsICZyMSwgJmQyLCAmeDIsICZiMikpCisJczM5MF9zdG9yZSAoZGF0YSwgZDIsIHgyLCBiMiwgZGF0YS0+Z3ByX3NpemUsIGRhdGEtPmdwcltyMV0pOwogCi0gICAgICAvKiBMIHIxLCBkMih4MiwgYjIpIC0tLSBsb2FkICovCi0gICAgICBlbHNlIGlmICh3b3JkX3NpemUgPT0gNAotCSAgICAgICAmJiBpc19yeCAoaW5zbiwgb3BfbCwgJnIxLCAmZDIsICZ4MiwgJmIyKSkKLSAgICAgICAgewotICAgICAgICAgIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSBhZGRyOwotCi0gICAgICAgICAgY29tcHV0ZV94X2FkZHIgKCZhZGRyLCBkYXRhLT5ncHIsIGQyLCB4MiwgYjIpOwotCSAgczM5MF9sb2FkICgmYWRkciwgNCwgJmRhdGEtPmdwcltyMV0sIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgIC8qIExZIHIxLCBkMih4MiwgYjIpIC0tLSBsb2FkIChsb25nLWRpc3BsYWNlbWVudCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDQKLQkgICAgICAgJiYgaXNfcnh5IChpbnNuLCBvcDFfbHksIG9wMl9seSwgJnIxLCAmZDIsICZ4MiwgJmIyKSkKLSAgICAgICAgewotICAgICAgICAgIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSBhZGRyOwotCi0gICAgICAgICAgY29tcHV0ZV94X2FkZHIgKCZhZGRyLCBkYXRhLT5ncHIsIGQyLCB4MiwgYjIpOwotCSAgczM5MF9sb2FkICgmYWRkciwgNCwgJmRhdGEtPmdwcltyMV0sIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgIC8qIExHIHIxLCBkMih4MiwgYjIpIC0tLSBsb2FkICg2NC1iaXQgdmVyc2lvbikgKi8KLSAgICAgIGVsc2UgaWYgKHdvcmRfc2l6ZSA9PSA4Ci0JICAgICAgICYmIGlzX3J4eSAoaW5zbiwgb3AxX2xnLCBvcDJfbGcsICZyMSwgJmQyLCAmeDIsICZiMikpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgYWRkcjsKLQotICAgICAgICAgIGNvbXB1dGVfeF9hZGRyICgmYWRkciwgZGF0YS0+Z3ByLCBkMiwgeDIsIGIyKTsKLQkgIHMzOTBfbG9hZCAoJmFkZHIsIDgsICZkYXRhLT5ncHJbcjFdLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAvKiBTVCByMSwgZDIoeDIsIGIyKSAtLS0gc3RvcmUgKi8KLSAgICAgIGVsc2UgaWYgKHdvcmRfc2l6ZSA9PSA0Ci0JICAgICAgICYmIGlzX3J4IChpbnNuLCBvcF9zdCwgJnIxLCAmZDIsICZ4MiwgJmIyKSkKLSAgICAgICAgewotICAgICAgICAgIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSBhZGRyOwotCi0gICAgICAgICAgY29tcHV0ZV94X2FkZHIgKCZhZGRyLCBkYXRhLT5ncHIsIGQyLCB4MiwgYjIpOwotCSAgczM5MF9zdG9yZSAoJmFkZHIsIDQsICZkYXRhLT5ncHJbcjFdLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAvKiBTVFkgcjEsIGQyKHgyLCBiMikgLS0tIHN0b3JlIChsb25nLWRpc3BsYWNlbWVudCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDQKLQkgICAgICAgJiYgaXNfcnh5IChpbnNuLCBvcDFfc3R5LCBvcDJfc3R5LCAmcjEsICZkMiwgJngyLCAmYjIpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIGFkZHI7Ci0KLSAgICAgICAgICBjb21wdXRlX3hfYWRkciAoJmFkZHIsIGRhdGEtPmdwciwgZDIsIHgyLCBiMik7Ci0JICBzMzkwX3N0b3JlICgmYWRkciwgNCwgJmRhdGEtPmdwcltyMV0sIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgIC8qIFNURyByMSwgZDIoeDIsIGIyKSAtLS0gc3RvcmUgKDY0LWJpdCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDgKLQkgICAgICAgJiYgaXNfcnh5IChpbnNuLCBvcDFfc3RnLCBvcDJfc3RnLCAmcjEsICZkMiwgJngyLCAmYjIpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIGFkZHI7Ci0KLSAgICAgICAgICBjb21wdXRlX3hfYWRkciAoJmFkZHIsIGRhdGEtPmdwciwgZDIsIHgyLCBiMik7Ci0JICBzMzkwX3N0b3JlICgmYWRkciwgOCwgJmRhdGEtPmdwcltyMV0sIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgIC8qIFNURCByMSwgZDIoeDIsYjIpIC0tLSBzdG9yZSBmbG9hdGluZy1wb2ludCByZWdpc3RlciAgKi8KKyAgICAgIC8qIFNURCByMSwgZDIoeDIsYjIpIC0tLSBzdG9yZSBmbG9hdGluZy1wb2ludCByZWdpc3Rlci4gICovCiAgICAgICBlbHNlIGlmIChpc19yeCAoaW5zbiwgb3Bfc3RkLCAmcjEsICZkMiwgJngyLCAmYjIpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIGFkZHI7CisJczM5MF9zdG9yZSAoZGF0YSwgZDIsIHgyLCBiMiwgZGF0YS0+ZnByX3NpemUsIGRhdGEtPmZwcltyMV0pOwogCi0gICAgICAgICAgY29tcHV0ZV94X2FkZHIgKCZhZGRyLCBkYXRhLT5ncHIsIGQyLCB4MiwgYjIpOwotICAgICAgICAgIHMzOTBfc3RvcmUgKCZhZGRyLCA4LCAmZGF0YS0+ZnByW3IxXSwgZGF0YSk7CisgICAgICAvKiBTVE0gcjEsIHIzLCBkMihiMikgLS0tIHN0b3JlIG11bHRpcGxlLiAgKi8KKyAgICAgIC8qIFNUTVkgcjEsIHIzLCBkMihiMikgLS0tIHN0b3JlIG11bHRpcGxlIChsb25nLWRpc3BsYWNlbWVudCB2ZXJzaW9uKS4gICovCisgICAgICAvKiBTVE1HIHIxLCByMywgZDIoYjIpIC0tLSBzdG9yZSBtdWx0aXBsZSAoNjQtYml0IHZlcnNpb24pLiAgKi8KKyAgICAgIGVsc2UgaWYgKGlzX3JzIChpbnNuMzIsIG9wX3N0bSwgJnIxLCAmcjMsICZkMiwgJmIyKQorCSAgICAgICB8fCBpc19yc3kgKGluc24zMiwgb3AxX3N0bXksIG9wMl9zdG15LCAmcjEsICZyMywgJmQyLCAmYjIpCisJICAgICAgIHx8IGlzX3JzeSAoaW5zbjY0LCBvcDFfc3RtZywgb3AyX3N0bWcsICZyMSwgJnIzLCAmZDIsICZiMikpCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKDsgcjEgPD0gcjM7IHIxKyssIGQyICs9IGRhdGEtPmdwcl9zaXplKQorCSAgICBzMzkwX3N0b3JlIChkYXRhLCBkMiwgMCwgYjIsIGRhdGEtPmdwcl9zaXplLCBkYXRhLT5ncHJbcjFdKTsKICAgICAgICAgfQogCi0gICAgICAvKiBTVE0gcjEsIHIzLCBkMihiMikgLS0tIHN0b3JlIG11bHRpcGxlICovCi0gICAgICBlbHNlIGlmICh3b3JkX3NpemUgPT0gNAotCSAgICAgICAmJiBpc19ycyAoaW5zbiwgb3Bfc3RtLCAmcjEsICZyMywgJmQyLCAmYjIpKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IHJlZ251bTsKLSAgICAgICAgICBpbnQgb2Zmc2V0OwotICAgICAgICAgIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSBhZGRyOworICAgICAgLyogQUhJIHIxLCBpMiAtLS0gYWRkIGhhbGZ3b3JkIGltbWVkaWF0ZS4gICovCisgICAgICAvKiBBR0hJIHIxLCBpMiAtLS0gYWRkIGhhbGZ3b3JkIGltbWVkaWF0ZSAoNjQtYml0IHZlcnNpb24pLiAgKi8KKyAgICAgIC8qIEFGSSByMSwgaTIgLS0tIGFkZCBmdWxsd29yZCBpbW1lZGlhdGUuICAqLworICAgICAgLyogQUdGSSByMSwgaTIgLS0tIGFkZCBmdWxsd29yZCBpbW1lZGlhdGUgKDY0LWJpdCB2ZXJzaW9uKS4gICovCisgICAgICBlbHNlIGlmIChpc19yaSAoaW5zbjMyLCBvcDFfYWhpLCBvcDJfYWhpLCAmcjEsICZpMikKKwkgICAgICAgfHwgaXNfcmkgKGluc242NCwgb3AxX2FnaGksIG9wMl9hZ2hpLCAmcjEsICZpMikKKwkgICAgICAgfHwgaXNfcmlsIChpbnNuMzIsIG9wMV9hZmksIG9wMl9hZmksICZyMSwgJmkyKQorCSAgICAgICB8fCBpc19yaWwgKGluc242NCwgb3AxX2FnZmksIG9wMl9hZ2ZpLCAmcjEsICZpMikpCisJZGF0YS0+Z3ByW3IxXSA9IHB2X2FkZF9jb25zdGFudCAoZGF0YS0+Z3ByW3IxXSwgaTIpOwogCi0gICAgICAgICAgZm9yIChyZWdudW0gPSByMSwgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgIHJlZ251bSA8PSByMzsKLSAgICAgICAgICAgICAgIHJlZ251bSsrLCBvZmZzZXQgKz0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY29tcHV0ZV94X2FkZHIgKCZhZGRyLCBkYXRhLT5ncHIsIGQyICsgb2Zmc2V0LCAwLCBiMik7Ci0gICAgICAgICAgICAgIHMzOTBfc3RvcmUgKCZhZGRyLCA0LCAmZGF0YS0+Z3ByW3JlZ251bV0sIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAvKiBBTEZJIHIxLCBpMiAtLS0gYWRkIGxvZ2ljYWwgaW1tZWRpYXRlLiAgKi8KKyAgICAgIC8qIEFMR0ZJIHIxLCBpMiAtLS0gYWRkIGxvZ2ljYWwgaW1tZWRpYXRlICg2NC1iaXQgdmVyc2lvbikuICAqLworICAgICAgZWxzZSBpZiAoaXNfcmlsIChpbnNuMzIsIG9wMV9hbGZpLCBvcDJfYWxmaSwgJnIxLCAmaTIpCisJICAgICAgIHx8IGlzX3JpbCAoaW5zbjY0LCBvcDFfYWxnZmksIG9wMl9hbGdmaSwgJnIxLCAmaTIpKQorCWRhdGEtPmdwcltyMV0gPSBwdl9hZGRfY29uc3RhbnQgKGRhdGEtPmdwcltyMV0sCisJCQkJCSAoQ09SRV9BRERSKWkyICYgMHhmZmZmZmZmZik7CiAKLSAgICAgIC8qIFNUTVkgcjEsIHIzLCBkMihiMikgLS0tIHN0b3JlIG11bHRpcGxlIChsb25nLWRpc3BsYWNlbWVudCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDQKLQkgICAgICAgJiYgaXNfcnN5IChpbnNuLCBvcDFfc3RteSwgb3AyX3N0bXksICZyMSwgJnIzLCAmZDIsICZiMikpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgcmVnbnVtOwotICAgICAgICAgIGludCBvZmZzZXQ7Ci0gICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIGFkZHI7CisgICAgICAvKiBBUiByMSwgcjIgLS0gYWRkIHJlZ2lzdGVyLiAgKi8KKyAgICAgIC8qIEFHUiByMSwgcjIgLS0gYWRkIHJlZ2lzdGVyICg2NC1iaXQgdmVyc2lvbikuICAqLworICAgICAgZWxzZSBpZiAoaXNfcnIgKGluc24zMiwgb3BfYXIsICZyMSwgJnIyKQorCSAgICAgICB8fCBpc19ycmUgKGluc242NCwgb3BfYWdyLCAmcjEsICZyMikpCisJZGF0YS0+Z3ByW3IxXSA9IHB2X2FkZCAoZGF0YS0+Z3ByW3IxXSwgZGF0YS0+Z3ByW3IyXSk7CiAKLSAgICAgICAgICBmb3IgKHJlZ251bSA9IHIxLCBvZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgcmVnbnVtIDw9IHIzOwotICAgICAgICAgICAgICAgcmVnbnVtKyssIG9mZnNldCArPSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb21wdXRlX3hfYWRkciAoJmFkZHIsIGRhdGEtPmdwciwgZDIgKyBvZmZzZXQsIDAsIGIyKTsKLSAgICAgICAgICAgICAgczM5MF9zdG9yZSAoJmFkZHIsIDQsICZkYXRhLT5ncHJbcmVnbnVtXSwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIC8qIEEgcjEsIGQyKHgyLCBiMikgLS0gYWRkLiAgKi8KKyAgICAgIC8qIEFZIHIxLCBkMih4MiwgYjIpIC0tIGFkZCAobG9uZy1kaXNwbGFjZW1lbnQgdmVyc2lvbikuICAqLworICAgICAgLyogQUcgcjEsIGQyKHgyLCBiMikgLS0gYWRkICg2NC1iaXQgdmVyc2lvbikuICAqLworICAgICAgZWxzZSBpZiAoaXNfcnggKGluc24zMiwgb3BfYSwgJnIxLCAmZDIsICZ4MiwgJmIyKQorCSAgICAgICB8fCBpc19yeHkgKGluc24zMiwgb3AxX2F5LCBvcDJfYXksICZyMSwgJmQyLCAmeDIsICZiMikKKwkgICAgICAgfHwgaXNfcnh5IChpbnNuNjQsIG9wMV9hZywgb3AyX2FnLCAmcjEsICZkMiwgJngyLCAmYjIpKQorCWRhdGEtPmdwcltyMV0gPSBwdl9hZGQgKGRhdGEtPmdwcltyMV0sCisJCQkJczM5MF9sb2FkIChkYXRhLCBkMiwgeDIsIGIyLCBkYXRhLT5ncHJfc2l6ZSkpOwogCi0gICAgICAvKiBTVE1HIHIxLCByMywgZDIoYjIpIC0tLSBzdG9yZSBtdWx0aXBsZSAoNjQtYml0IHZlcnNpb24pICovCi0gICAgICBlbHNlIGlmICh3b3JkX3NpemUgPT0gOAotCSAgICAgICAmJiBpc19yc3kgKGluc24sIG9wMV9zdG1nLCBvcDJfc3RtZywgJnIxLCAmcjMsICZkMiwgJmIyKSkKLSAgICAgICAgewotICAgICAgICAgIGludCByZWdudW07Ci0gICAgICAgICAgaW50IG9mZnNldDsKLSAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgYWRkcjsKKyAgICAgIC8qIFNMRkkgcjEsIGkyIC0tLSBzdWJ0cmFjdCBsb2dpY2FsIGltbWVkaWF0ZS4gICovCisgICAgICAvKiBTTEdGSSByMSwgaTIgLS0tIHN1YnRyYWN0IGxvZ2ljYWwgaW1tZWRpYXRlICg2NC1iaXQgdmVyc2lvbikuICAqLworICAgICAgZWxzZSBpZiAoaXNfcmlsIChpbnNuMzIsIG9wMV9zbGZpLCBvcDJfc2xmaSwgJnIxLCAmaTIpCisJICAgICAgIHx8IGlzX3JpbCAoaW5zbjY0LCBvcDFfc2xnZmksIG9wMl9zbGdmaSwgJnIxLCAmaTIpKQorCWRhdGEtPmdwcltyMV0gPSBwdl9hZGRfY29uc3RhbnQgKGRhdGEtPmdwcltyMV0sCisJCQkJCSAtKChDT1JFX0FERFIpaTIgJiAweGZmZmZmZmZmKSk7CiAKLSAgICAgICAgICBmb3IgKHJlZ251bSA9IHIxLCBvZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgcmVnbnVtIDw9IHIzOwotICAgICAgICAgICAgICAgcmVnbnVtKyssIG9mZnNldCArPSA4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb21wdXRlX3hfYWRkciAoJmFkZHIsIGRhdGEtPmdwciwgZDIgKyBvZmZzZXQsIDAsIGIyKTsKLSAgICAgICAgICAgICAgczM5MF9zdG9yZSAoJmFkZHIsIDgsICZkYXRhLT5ncHJbcmVnbnVtXSwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIC8qIFNSIHIxLCByMiAtLSBzdWJ0cmFjdCByZWdpc3Rlci4gICovCisgICAgICAvKiBTR1IgcjEsIHIyIC0tIHN1YnRyYWN0IHJlZ2lzdGVyICg2NC1iaXQgdmVyc2lvbikuICAqLworICAgICAgZWxzZSBpZiAoaXNfcnIgKGluc24zMiwgb3Bfc3IsICZyMSwgJnIyKQorCSAgICAgICB8fCBpc19ycmUgKGluc242NCwgb3Bfc2dyLCAmcjEsICZyMikpCisJZGF0YS0+Z3ByW3IxXSA9IHB2X3N1YnRyYWN0IChkYXRhLT5ncHJbcjFdLCBkYXRhLT5ncHJbcjJdKTsKIAotICAgICAgLyogQUhJIHIxLCBpMiAtLS0gYWRkIGhhbGZ3b3JkIGltbWVkaWF0ZSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDQKLQkgICAgICAgJiYgaXNfcmkgKGluc24sIG9wMV9haGksIG9wMl9haGksICZyMSwgJmkyKSkKLSAgICAgICAgcHZfYWRkX2NvbnN0YW50ICgmZGF0YS0+Z3ByW3IxXSwgaTIpOworICAgICAgLyogUyByMSwgZDIoeDIsIGIyKSAtLSBzdWJ0cmFjdC4gICovCisgICAgICAvKiBTWSByMSwgZDIoeDIsIGIyKSAtLSBzdWJ0cmFjdCAobG9uZy1kaXNwbGFjZW1lbnQgdmVyc2lvbikuICAqLworICAgICAgLyogU0cgcjEsIGQyKHgyLCBiMikgLS0gc3VidHJhY3QgKDY0LWJpdCB2ZXJzaW9uKS4gICovCisgICAgICBlbHNlIGlmIChpc19yeCAoaW5zbjMyLCBvcF9zLCAmcjEsICZkMiwgJngyLCAmYjIpCisJICAgICAgIHx8IGlzX3J4eSAoaW5zbjMyLCBvcDFfc3ksIG9wMl9zeSwgJnIxLCAmZDIsICZ4MiwgJmIyKQorCSAgICAgICB8fCBpc19yeHkgKGluc242NCwgb3AxX3NnLCBvcDJfc2csICZyMSwgJmQyLCAmeDIsICZiMikpCisJZGF0YS0+Z3ByW3IxXSA9IHB2X3N1YnRyYWN0IChkYXRhLT5ncHJbcjFdLAorCQkJCXMzOTBfbG9hZCAoZGF0YSwgZDIsIHgyLCBiMiwgZGF0YS0+Z3ByX3NpemUpKTsKIAotICAgICAgLyogQUdISSByMSwgaTIgLS0tIGFkZCBoYWxmd29yZCBpbW1lZGlhdGUgKDY0LWJpdCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDgKLSAgICAgICAgICAgICAgICYmIGlzX3JpIChpbnNuLCBvcDFfYWdoaSwgb3AyX2FnaGksICZyMSwgJmkyKSkKLSAgICAgICAgcHZfYWRkX2NvbnN0YW50ICgmZGF0YS0+Z3ByW3IxXSwgaTIpOworICAgICAgLyogTEEgcjEsIGQyKHgyLCBiMikgLS0tIGxvYWQgYWRkcmVzcy4gICovCisgICAgICAvKiBMQVkgcjEsIGQyKHgyLCBiMikgLS0tIGxvYWQgYWRkcmVzcyAobG9uZy1kaXNwbGFjZW1lbnQgdmVyc2lvbikuICAqLworICAgICAgZWxzZSBpZiAoaXNfcnggKGluc24sIG9wX2xhLCAmcjEsICZkMiwgJngyLCAmYjIpCisgICAgICAgICAgICAgICB8fCBpc19yeHkgKGluc24sIG9wMV9sYXksIG9wMl9sYXksICZyMSwgJmQyLCAmeDIsICZiMikpCisJZGF0YS0+Z3ByW3IxXSA9IHMzOTBfYWRkciAoZGF0YSwgZDIsIHgyLCBiMik7CiAKLSAgICAgIC8qIEFGSSByMSwgaTIgLS0tIGFkZCBmdWxsd29yZCBpbW1lZGlhdGUgKi8KLSAgICAgIGVsc2UgaWYgKHdvcmRfc2l6ZSA9PSA0Ci0JICAgICAgICYmIGlzX3JpbCAoaW5zbiwgb3AxX2FmaSwgb3AyX2FmaSwgJnIxLCAmaTIpKQotICAgICAgICBwdl9hZGRfY29uc3RhbnQgKCZkYXRhLT5ncHJbcjFdLCBpMik7Ci0KLSAgICAgIC8qIEFHRkkgcjEsIGkyIC0tLSBhZGQgZnVsbHdvcmQgaW1tZWRpYXRlICg2NC1iaXQgdmVyc2lvbikgKi8KLSAgICAgIGVsc2UgaWYgKHdvcmRfc2l6ZSA9PSA4Ci0gICAgICAgICAgICAgICAmJiBpc19yaWwgKGluc24sIG9wMV9hZ2ZpLCBvcDJfYWdmaSwgJnIxLCAmaTIpKQotICAgICAgICBwdl9hZGRfY29uc3RhbnQgKCZkYXRhLT5ncHJbcjFdLCBpMik7Ci0KLSAgICAgIC8qIEFMRkkgcjEsIGkyIC0tLSBhZGQgbG9naWNhbCBpbW1lZGlhdGUgKi8KLSAgICAgIGVsc2UgaWYgKHdvcmRfc2l6ZSA9PSA0Ci0JICAgICAgICYmIGlzX3JpbCAoaW5zbiwgb3AxX2FsZmksIG9wMl9hbGZpLCAmcjEsICZpMikpCi0gICAgICAgIHB2X2FkZF9jb25zdGFudCAoJmRhdGEtPmdwcltyMV0sIChDT1JFX0FERFIpaTIgJiAweGZmZmZmZmZmKTsKLQotICAgICAgLyogQUxHRkkgcjEsIGkyIC0tLSBhZGQgbG9naWNhbCBpbW1lZGlhdGUgKDY0LWJpdCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDgKLSAgICAgICAgICAgICAgICYmIGlzX3JpbCAoaW5zbiwgb3AxX2FsZ2ZpLCBvcDJfYWxnZmksICZyMSwgJmkyKSkKLSAgICAgICAgcHZfYWRkX2NvbnN0YW50ICgmZGF0YS0+Z3ByW3IxXSwgKENPUkVfQUREUilpMiAmIDB4ZmZmZmZmZmYpOwotCi0gICAgICAvKiBBUiByMSwgcjIgLS0gYWRkIHJlZ2lzdGVyICovCi0gICAgICBlbHNlIGlmICh3b3JkX3NpemUgPT0gNAotCSAgICAgICAmJiBpc19yciAoaW5zbiwgb3BfYXIsICZyMSwgJnIyKSkKLSAgICAgICAgcHZfYWRkICgmZGF0YS0+Z3ByW3IxXSwgJmRhdGEtPmdwcltyMV0sICZkYXRhLT5ncHJbcjJdKTsKLQotICAgICAgLyogQUdSIHIxLCByMiAtLSBhZGQgcmVnaXN0ZXIgKDY0LWJpdCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDgKLQkgICAgICAgJiYgaXNfcnJlIChpbnNuLCBvcF9hZ3IsICZyMSwgJnIyKSkKLSAgICAgICAgcHZfYWRkICgmZGF0YS0+Z3ByW3IxXSwgJmRhdGEtPmdwcltyMV0sICZkYXRhLT5ncHJbcjJdKTsKLQotICAgICAgLyogQSByMSwgZDIoeDIsIGIyKSAtLSBhZGQgKi8KLSAgICAgIGVsc2UgaWYgKHdvcmRfc2l6ZSA9PSA0Ci0JICAgICAgICYmIGlzX3J4IChpbnNuLCBvcF9hLCAmcjEsICZkMiwgJngyLCAmYjIpKQotCXsKLSAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgYWRkcjsKLSAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgdmFsdWU7Ci0KLSAgICAgICAgICBjb21wdXRlX3hfYWRkciAoJmFkZHIsIGRhdGEtPmdwciwgZDIsIHgyLCBiMik7Ci0JICBzMzkwX2xvYWQgKCZhZGRyLCA0LCAmdmFsdWUsIGRhdGEpOwotCQotCSAgcHZfYWRkICgmZGF0YS0+Z3ByW3IxXSwgJmRhdGEtPmdwcltyMV0sICZ2YWx1ZSk7Ci0JfQotCi0gICAgICAvKiBBWSByMSwgZDIoeDIsIGIyKSAtLSBhZGQgKGxvbmctZGlzcGxhY2VtZW50IHZlcnNpb24pICovCi0gICAgICBlbHNlIGlmICh3b3JkX3NpemUgPT0gNAotCSAgICAgICAmJiBpc19yeHkgKGluc24sIG9wMV9heSwgb3AyX2F5LCAmcjEsICZkMiwgJngyLCAmYjIpKQotCXsKLSAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgYWRkcjsKLSAgICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgdmFsdWU7Ci0KLSAgICAgICAgICBjb21wdXRlX3hfYWRkciAoJmFkZHIsIGRhdGEtPmdwciwgZDIsIHgyLCBiMik7Ci0JICBzMzkwX2xvYWQgKCZhZGRyLCA0LCAmdmFsdWUsIGRhdGEpOwotCQotCSAgcHZfYWRkICgmZGF0YS0+Z3ByW3IxXSwgJmRhdGEtPmdwcltyMV0sICZ2YWx1ZSk7Ci0JfQotCi0gICAgICAvKiBBRyByMSwgZDIoeDIsIGIyKSAtLSBhZGQgKDY0LWJpdCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDgKLQkgICAgICAgJiYgaXNfcnh5IChpbnNuLCBvcDFfYWcsIG9wMl9hZywgJnIxLCAmZDIsICZ4MiwgJmIyKSkKLQl7Ci0gICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIGFkZHI7Ci0gICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIHZhbHVlOwotCi0gICAgICAgICAgY29tcHV0ZV94X2FkZHIgKCZhZGRyLCBkYXRhLT5ncHIsIGQyLCB4MiwgYjIpOwotCSAgczM5MF9sb2FkICgmYWRkciwgOCwgJnZhbHVlLCBkYXRhKTsKLQkKLQkgIHB2X2FkZCAoJmRhdGEtPmdwcltyMV0sICZkYXRhLT5ncHJbcjFdLCAmdmFsdWUpOwotCX0KLQotICAgICAgLyogU0xGSSByMSwgaTIgLS0tIHN1YnRyYWN0IGxvZ2ljYWwgaW1tZWRpYXRlICovCi0gICAgICBlbHNlIGlmICh3b3JkX3NpemUgPT0gNAotCSAgICAgICAmJiBpc19yaWwgKGluc24sIG9wMV9zbGZpLCBvcDJfc2xmaSwgJnIxLCAmaTIpKQotICAgICAgICBwdl9hZGRfY29uc3RhbnQgKCZkYXRhLT5ncHJbcjFdLCAtKChDT1JFX0FERFIpaTIgJiAweGZmZmZmZmZmKSk7Ci0KLSAgICAgIC8qIFNMR0ZJIHIxLCBpMiAtLS0gc3VidHJhY3QgbG9naWNhbCBpbW1lZGlhdGUgKDY0LWJpdCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDgKLSAgICAgICAgICAgICAgICYmIGlzX3JpbCAoaW5zbiwgb3AxX3NsZ2ZpLCBvcDJfc2xnZmksICZyMSwgJmkyKSkKLSAgICAgICAgcHZfYWRkX2NvbnN0YW50ICgmZGF0YS0+Z3ByW3IxXSwgLSgoQ09SRV9BRERSKWkyICYgMHhmZmZmZmZmZikpOwotCi0gICAgICAvKiBTUiByMSwgcjIgLS0gc3VidHJhY3QgcmVnaXN0ZXIgKi8KLSAgICAgIGVsc2UgaWYgKHdvcmRfc2l6ZSA9PSA0Ci0JICAgICAgICYmIGlzX3JyIChpbnNuLCBvcF9zciwgJnIxLCAmcjIpKQotICAgICAgICBwdl9zdWJ0cmFjdCAoJmRhdGEtPmdwcltyMV0sICZkYXRhLT5ncHJbcjFdLCAmZGF0YS0+Z3ByW3IyXSk7Ci0KLSAgICAgIC8qIFNHUiByMSwgcjIgLS0gc3VidHJhY3QgcmVnaXN0ZXIgKDY0LWJpdCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDgKLQkgICAgICAgJiYgaXNfcnJlIChpbnNuLCBvcF9zZ3IsICZyMSwgJnIyKSkKLSAgICAgICAgcHZfc3VidHJhY3QgKCZkYXRhLT5ncHJbcjFdLCAmZGF0YS0+Z3ByW3IxXSwgJmRhdGEtPmdwcltyMl0pOwotCi0gICAgICAvKiBTIHIxLCBkMih4MiwgYjIpIC0tIHN1YnRyYWN0ICovCi0gICAgICBlbHNlIGlmICh3b3JkX3NpemUgPT0gNAotCSAgICAgICAmJiBpc19yeCAoaW5zbiwgb3BfcywgJnIxLCAmZDIsICZ4MiwgJmIyKSkKLQl7Ci0gICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIGFkZHI7Ci0gICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIHZhbHVlOwotCi0gICAgICAgICAgY29tcHV0ZV94X2FkZHIgKCZhZGRyLCBkYXRhLT5ncHIsIGQyLCB4MiwgYjIpOwotCSAgczM5MF9sb2FkICgmYWRkciwgNCwgJnZhbHVlLCBkYXRhKTsKLQkKLQkgIHB2X3N1YnRyYWN0ICgmZGF0YS0+Z3ByW3IxXSwgJmRhdGEtPmdwcltyMV0sICZ2YWx1ZSk7Ci0JfQotCi0gICAgICAvKiBTWSByMSwgZDIoeDIsIGIyKSAtLSBzdWJ0cmFjdCAobG9uZy1kaXNwbGFjZW1lbnQgdmVyc2lvbikgKi8KLSAgICAgIGVsc2UgaWYgKHdvcmRfc2l6ZSA9PSA0Ci0JICAgICAgICYmIGlzX3J4eSAoaW5zbiwgb3AxX3N5LCBvcDJfc3ksICZyMSwgJmQyLCAmeDIsICZiMikpCi0JewotICAgICAgICAgIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSBhZGRyOwotICAgICAgICAgIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSB2YWx1ZTsKLQotICAgICAgICAgIGNvbXB1dGVfeF9hZGRyICgmYWRkciwgZGF0YS0+Z3ByLCBkMiwgeDIsIGIyKTsKLQkgIHMzOTBfbG9hZCAoJmFkZHIsIDQsICZ2YWx1ZSwgZGF0YSk7Ci0JCi0JICBwdl9zdWJ0cmFjdCAoJmRhdGEtPmdwcltyMV0sICZkYXRhLT5ncHJbcjFdLCAmdmFsdWUpOwotCX0KLQotICAgICAgLyogU0cgcjEsIGQyKHgyLCBiMikgLS0gc3VidHJhY3QgKDY0LWJpdCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDgKLQkgICAgICAgJiYgaXNfcnh5IChpbnNuLCBvcDFfc2csIG9wMl9zZywgJnIxLCAmZDIsICZ4MiwgJmIyKSkKLQl7Ci0gICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIGFkZHI7Ci0gICAgICAgICAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlIHZhbHVlOwotCi0gICAgICAgICAgY29tcHV0ZV94X2FkZHIgKCZhZGRyLCBkYXRhLT5ncHIsIGQyLCB4MiwgYjIpOwotCSAgczM5MF9sb2FkICgmYWRkciwgOCwgJnZhbHVlLCBkYXRhKTsKLQkKLQkgIHB2X3N1YnRyYWN0ICgmZGF0YS0+Z3ByW3IxXSwgJmRhdGEtPmdwcltyMV0sICZ2YWx1ZSk7Ci0JfQotCi0gICAgICAvKiBOUiByMSwgcjIgLS0tIGxvZ2ljYWwgYW5kICovCi0gICAgICBlbHNlIGlmICh3b3JkX3NpemUgPT0gNAotCSAgICAgICAmJiBpc19yciAoaW5zbiwgb3BfbnIsICZyMSwgJnIyKSkKLSAgICAgICAgcHZfbG9naWNhbF9hbmQgKCZkYXRhLT5ncHJbcjFdLCAmZGF0YS0+Z3ByW3IxXSwgJmRhdGEtPmdwcltyMl0pOwotCi0gICAgICAvKiBOR1IgcjEsIHIyID4tLS0gbG9naWNhbCBhbmQgKDY0LWJpdCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAod29yZF9zaXplID09IDgKLSAgICAgICAgICAgICAgICYmIGlzX3JyZSAoaW5zbiwgb3BfbmdyLCAmcjEsICZyMikpCi0gICAgICAgIHB2X2xvZ2ljYWxfYW5kICgmZGF0YS0+Z3ByW3IxXSwgJmRhdGEtPmdwcltyMV0sICZkYXRhLT5ncHJbcjJdKTsKLQotICAgICAgLyogTEEgcjEsIGQyKHgyLCBiMikgLS0tIGxvYWQgYWRkcmVzcyAqLwotICAgICAgZWxzZSBpZiAoaXNfcnggKGluc24sIG9wX2xhLCAmcjEsICZkMiwgJngyLCAmYjIpKQotICAgICAgICBjb21wdXRlX3hfYWRkciAoJmRhdGEtPmdwcltyMV0sIGRhdGEtPmdwciwgZDIsIHgyLCBiMik7Ci0KLSAgICAgIC8qIExBWSByMSwgZDIoeDIsIGIyKSAtLS0gbG9hZCBhZGRyZXNzIChsb25nLWRpc3BsYWNlbWVudCB2ZXJzaW9uKSAqLwotICAgICAgZWxzZSBpZiAoaXNfcnh5IChpbnNuLCBvcDFfbGF5LCBvcDJfbGF5LCAmcjEsICZkMiwgJngyLCAmYjIpKQotICAgICAgICBjb21wdXRlX3hfYWRkciAoJmRhdGEtPmdwcltyMV0sIGRhdGEtPmdwciwgZDIsIHgyLCBiMik7Ci0KLSAgICAgIC8qIExBUkwgcjEsIGkyIC0tLSBsb2FkIGFkZHJlc3MgcmVsYXRpdmUgbG9uZyAqLworICAgICAgLyogTEFSTCByMSwgaTIgLS0tIGxvYWQgYWRkcmVzcyByZWxhdGl2ZSBsb25nLiAgKi8KICAgICAgIGVsc2UgaWYgKGlzX3JpbCAoaW5zbiwgb3AxX2xhcmwsIG9wMl9sYXJsLCAmcjEsICZpMikpCi0gICAgICAgIHB2X3NldF90b19jb25zdGFudCAoJmRhdGEtPmdwcltyMV0sIHBjICsgaTIgKiAyKTsKKwlkYXRhLT5ncHJbcjFdID0gcHZfY29uc3RhbnQgKHBjICsgaTIgKiAyKTsKIAotICAgICAgLyogQkFTUiByMSwgMCAtLS0gYnJhbmNoIGFuZCBzYXZlCisgICAgICAvKiBCQVNSIHIxLCAwIC0tLSBicmFuY2ggYW5kIHNhdmUuCiAgICAgICAgICBTaW5jZSByMiBpcyB6ZXJvLCB0aGlzIHNhdmVzIHRoZSBQQyBpbiByMSwgYnV0IGRvZXNuJ3QgYnJhbmNoLiAgKi8KICAgICAgIGVsc2UgaWYgKGlzX3JyIChpbnNuLCBvcF9iYXNyLCAmcjEsICZyMikKICAgICAgICAgICAgICAgICYmIHIyID09IDApCi0gICAgICAgIHB2X3NldF90b19jb25zdGFudCAoJmRhdGEtPmdwcltyMV0sIG5leHRfcGMpOworCWRhdGEtPmdwcltyMV0gPSBwdl9jb25zdGFudCAobmV4dF9wYyk7CiAKLSAgICAgIC8qIEJSQVMgcjEsIGkyIC0tLSBicmFuY2ggcmVsYXRpdmUgYW5kIHNhdmUgKi8KKyAgICAgIC8qIEJSQVMgcjEsIGkyIC0tLSBicmFuY2ggcmVsYXRpdmUgYW5kIHNhdmUuICAqLwogICAgICAgZWxzZSBpZiAoaXNfcmkgKGluc24sIG9wMV9icmFzLCBvcDJfYnJhcywgJnIxLCAmaTIpKQogICAgICAgICB7Ci0gICAgICAgICAgcHZfc2V0X3RvX2NvbnN0YW50ICgmZGF0YS0+Z3ByW3IxXSwgbmV4dF9wYyk7CisgICAgICAgICAgZGF0YS0+Z3ByW3IxXSA9IHB2X2NvbnN0YW50IChuZXh0X3BjKTsKICAgICAgICAgICBuZXh0X3BjID0gcGMgKyBpMiAqIDI7CiAKICAgICAgICAgICAvKiBXZSdkIGJldHRlciBub3QgaW50ZXJwcmV0IGFueSBiYWNrd2FyZCBicmFuY2hlcy4gIFdlJ2xsCkBAIC0xNjM2LDE4ICsxMTA5LDI2IEBACiAgICAgICAgICByZXN0b3JlIGluc3RydWN0aW9ucy4gIChUaGUgYmFjayBjaGFpbiBpcyBuZXZlciByZXN0b3JlZCwKICAgICAgICAgIGp1c3QgcG9wcGVkLikgICovCiAgICAgICB7Ci0gICAgICAgIHN0cnVjdCBwcm9sb2d1ZV92YWx1ZSAqc3AgPSAmZGF0YS0+Z3ByW1MzOTBfU1BfUkVHTlVNIC0gUzM5MF9SMF9SRUdOVU1dOwotICAgICAgICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKmZwID0gJmRhdGEtPmdwcltTMzkwX0ZSQU1FX1JFR05VTSAtIFMzOTBfUjBfUkVHTlVNXTsKKyAgICAgICAgcHZfdCBzcCA9IGRhdGEtPmdwcltTMzkwX1NQX1JFR05VTSAtIFMzOTBfUjBfUkVHTlVNXTsKKyAgICAgICAgcHZfdCBmcCA9IGRhdGEtPmdwcltTMzkwX0ZSQU1FX1JFR05VTSAtIFMzOTBfUjBfUkVHTlVNXTsKICAgICAgICAgCi0gICAgICAgIGlmICgoISBwdl9pc19pZGVudGljYWwgKCZwcmVfaW5zbl9zcCwgc3ApCi0gICAgICAgICAgICAgJiYgISBwdl9pc19yZWdpc3RlciAoc3AsIFMzOTBfU1BfUkVHTlVNLCAwKSkKLSAgICAgICAgICAgIHx8ICghIHB2X2lzX2lkZW50aWNhbCAoJnByZV9pbnNuX2ZwLCBmcCkKLSAgICAgICAgICAgICAgICAmJiAhIHB2X2lzX3JlZ2lzdGVyIChmcCwgUzM5MF9GUkFNRV9SRUdOVU0sIDApKQorICAgICAgICBpZiAoKCEgcHZfaXNfaWRlbnRpY2FsIChwcmVfaW5zbl9zcCwgc3ApCisgICAgICAgICAgICAgJiYgISBwdl9pc19yZWdpc3Rlcl9rIChzcCwgUzM5MF9TUF9SRUdOVU0sIDApCisJICAgICAmJiBzcC5raW5kICE9IHB2a191bmtub3duKQorICAgICAgICAgICAgfHwgKCEgcHZfaXNfaWRlbnRpY2FsIChwcmVfaW5zbl9mcCwgZnApCisgICAgICAgICAgICAgICAgJiYgISBwdl9pc19yZWdpc3Rlcl9rIChmcCwgUzM5MF9GUkFNRV9SRUdOVU0sIDApCisJCSYmIGZwLmtpbmQgIT0gcHZrX3Vua25vd24pCiAgICAgICAgICAgICB8fCBwcmVfaW5zbl9iYWNrX2NoYWluX3NhdmVkX3AgIT0gZGF0YS0+YmFja19jaGFpbl9zYXZlZF9wKQogICAgICAgICAgIHJlc3VsdCA9IG5leHRfcGM7CiAgICAgICB9CiAgICAgfQogCisgIC8qIFJlY29yZCB3aGVyZSBhbGwgdGhlIHJlZ2lzdGVycyB3ZXJlIHNhdmVkLiAgKi8KKyAgcHZfYXJlYV9zY2FuIChkYXRhLT5zdGFjaywgczM5MF9jaGVja19mb3Jfc2F2ZWQsIGRhdGEpOworCisgIGZyZWVfcHZfYXJlYSAoZGF0YS0+c3RhY2spOworICBkYXRhLT5zdGFjayA9IE5VTEw7CisKICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTczMyw4ICsxMjE0LDggQEAKICAgc3RydWN0IGdkYmFyY2hfdGRlcCAqdGRlcCA9IGdkYmFyY2hfdGRlcCAoZ2RiYXJjaCk7CiAgIGludCB3b3JkX3NpemUgPSBnZGJhcmNoX3B0cl9iaXQgKGdkYmFyY2gpIC8gODsKICAgc3RydWN0IHMzOTBfcHJvbG9ndWVfZGF0YSBkYXRhOwotICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKmZwID0gJmRhdGEuZ3ByW1MzOTBfRlJBTUVfUkVHTlVNIC0gUzM5MF9SMF9SRUdOVU1dOwotICBzdHJ1Y3QgcHJvbG9ndWVfdmFsdWUgKnNwID0gJmRhdGEuZ3ByW1MzOTBfU1BfUkVHTlVNIC0gUzM5MF9SMF9SRUdOVU1dOworICBwdl90ICpmcCA9ICZkYXRhLmdwcltTMzkwX0ZSQU1FX1JFR05VTSAtIFMzOTBfUjBfUkVHTlVNXTsKKyAgcHZfdCAqc3AgPSAmZGF0YS5ncHJbUzM5MF9TUF9SRUdOVU0gLSBTMzkwX1IwX1JFR05VTV07CiAgIGludCBpOwogICBDT1JFX0FERFIgY2ZhOwogICBDT1JFX0FERFIgZnVuYzsKQEAgLTE3NjEsNyArMTI0Miw3IEBACiAgIC8qIElmIHRoaXMgd2FzIHN1Y2Nlc3NmdWwsIHdlIHNob3VsZCBoYXZlIGZvdW5kIHRoZSBpbnN0cnVjdGlvbiB0aGF0CiAgICAgIHNldHMgdGhlIHN0YWNrIHBvaW50ZXIgcmVnaXN0ZXIgdG8gdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBzdGFjayAKICAgICAgcG9pbnRlciBtaW51cyB0aGUgZnJhbWUgc2l6ZS4gICovCi0gIGlmIChzcC0+a2luZCAhPSBwdl9yZWdpc3RlciB8fCBzcC0+cmVnICE9IFMzOTBfU1BfUkVHTlVNKQorICBpZiAoIXB2X2lzX3JlZ2lzdGVyICgqc3AsIFMzOTBfU1BfUkVHTlVNKSkKICAgICByZXR1cm4gMDsKIAogICAvKiBBIGZyYW1lIHNpemUgb2YgemVybyBhdCB0aGlzIHBvaW50IGNhbiBtZWFuIGVpdGhlciBhIHJlYWwgCkBAIC0xNzkzLDExICsxMjc0LDEwIEBACiAJICAgICBSZWNvZ25pemUgdGhpcyBjYXNlIGJ5IGxvb2tpbmcgYWhlYWQgYSBiaXQgLi4uICAqLwogCiAJICBzdHJ1Y3QgczM5MF9wcm9sb2d1ZV9kYXRhIGRhdGEyOwotCSAgc3RydWN0IHByb2xvZ3VlX3ZhbHVlICpzcCA9ICZkYXRhMi5ncHJbUzM5MF9TUF9SRUdOVU0gLSBTMzkwX1IwX1JFR05VTV07CisJICBwdl90ICpzcCA9ICZkYXRhMi5ncHJbUzM5MF9TUF9SRUdOVU0gLSBTMzkwX1IwX1JFR05VTV07CiAKIAkgIGlmICghKHMzOTBfYW5hbHl6ZV9wcm9sb2d1ZSAoZ2RiYXJjaCwgZnVuYywgKENPUkVfQUREUiktMSwgJmRhdGEyKQotCSAgICAgICAgJiYgc3AtPmtpbmQgPT0gcHZfcmVnaXN0ZXIKLQkgICAgICAgICYmIHNwLT5yZWcgPT0gUzM5MF9TUF9SRUdOVU0KKwkgICAgICAgICYmIHB2X2lzX3JlZ2lzdGVyICgqc3AsIFMzOTBfU1BfUkVHTlVNKQogCSAgICAgICAgJiYgc3AtPmsgIT0gMCkpCiAJICAgIHJldHVybiAwOwogCX0KQEAgLTE4MTEsNyArMTI5MSw3IEBACiAgICAgIGFzIHRoZSBzdGFjayBwb2ludGVyLCB3ZSdyZSBwcm9iYWJseSB1c2luZyBpdC4gIElmIGl0IGhvbGRzCiAgICAgIHNvbWUgb3RoZXIgdmFsdWUgLS0gZXZlbiBhIGNvbnN0YW50IG9mZnNldCAtLSBpdCBpcyBtb3N0CiAgICAgIGxpa2VseSB1c2VkIGFzIHRlbXAgcmVnaXN0ZXIuICAqLwotICBpZiAocHZfaXNfaWRlbnRpY2FsIChzcCwgZnApKQorICBpZiAocHZfaXNfaWRlbnRpY2FsICgqc3AsICpmcCkpCiAgICAgZnJhbWVfcG9pbnRlciA9IFMzOTBfRlJBTUVfUkVHTlVNOwogICBlbHNlCiAgICAgZnJhbWVfcG9pbnRlciA9IFMzOTBfU1BfUkVHTlVNOwpAQCAtMjI3OSw3ICsxNzU5LDggQEAKIAogc3RhdGljIHZvaWQKIHMzOTBfZHdhcmYyX2ZyYW1lX2luaXRfcmVnIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgaW50IHJlZ251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHdhcmYyX2ZyYW1lX3N0YXRlX3JlZyAqcmVnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkd2FyZjJfZnJhbWVfc3RhdGVfcmVnICpyZWcsCisJCQkgICAgc3RydWN0IGZyYW1lX2luZm8gKm5leHRfZnJhbWUpCiB7CiAgIHN0cnVjdCBnZGJhcmNoX3RkZXAgKnRkZXAgPSBnZGJhcmNoX3RkZXAgKGdkYmFyY2gpOwogCmRpZmYgLS1naXQgYS9nZGIvc2VyaWFsLmMgYi9nZGIvc2VyaWFsLmMKaW5kZXggOWVlMmZhMC4uZmI3NGUxYyAxMDA2NDQKLS0tIGEvZ2RiL3NlcmlhbC5jCisrKyBiL2dkYi9zZXJpYWwuYwpAQCAtMTg0LDggKzE4NCw2IEBACiAKICAgaWYgKHN0cmNtcCAobmFtZSwgInBjIikgPT0gMCkKICAgICBvcHMgPSBzZXJpYWxfaW50ZXJmYWNlX2xvb2t1cCAoInBjIik7Ci0gIGVsc2UgaWYgKHN0cmNociAobmFtZSwgJzonKSkKLSAgICBvcHMgPSBzZXJpYWxfaW50ZXJmYWNlX2xvb2t1cCAoInRjcCIpOwogICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAibHB0IiwgMykgPT0gMCkKICAgICBvcHMgPSBzZXJpYWxfaW50ZXJmYWNlX2xvb2t1cCAoInBhcmFsbGVsIik7CiAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICJ8IiwgMSkgPT0gMCkKQEAgLTE5Myw2ICsxOTEsMTEgQEAKICAgICAgIG9wcyA9IHNlcmlhbF9pbnRlcmZhY2VfbG9va3VwICgicGlwZSIpOwogICAgICAgb3Blbl9uYW1lID0gbmFtZSArIDE7IC8qIGRpc2NhcmQgYGB8JycgKi8KICAgICB9CisgIC8qIENoZWNrIGZvciBhIGNvbG9uLCBzdWdnZXN0aW5nIGFuIElQIGFkZHJlc3MvcG9ydCBwYWlyLgorICAgICBEbyB0aGlzICphZnRlciogY2hlY2tpbmcgZm9yIGFsbCB0aGUgaW50ZXJlc3RpbmcgcHJlZml4ZXMuICBXZQorICAgICBkb24ndCB3YW50IHRvIGNvbnN0cmFpbiB0aGUgc3ludGF4IG9mIHdoYXQgY2FuIGZvbGxvdyB0aGVtLiAgKi8KKyAgZWxzZSBpZiAoc3RyY2hyIChuYW1lLCAnOicpKQorICAgIG9wcyA9IHNlcmlhbF9pbnRlcmZhY2VfbG9va3VwICgidGNwIik7CiAgIGVsc2UKICAgICBvcHMgPSBzZXJpYWxfaW50ZXJmYWNlX2xvb2t1cCAoImhhcmR3aXJlIik7CiAKZGlmZiAtLWdpdCBhL2dkYi9zaC1zdHViLmMgYi9nZGIvc2gtc3R1Yi5jCmluZGV4IGJkZDllNTAuLjc2Yzk4YTUgMTAwNjQ0Ci0tLSBhL2dkYi9zaC1zdHViLmMKKysrIGIvZ2RiL3NoLXN0dWIuYwpAQCAtNDAzLDcgKzQwMyw3IEBACiAgICAgICBjb3VudCA9IDA7CiAKICAgICAgIC8qIG5vdywgcmVhZCB1bnRpbCBhICMgb3IgZW5kIG9mIGJ1ZmZlciBpcyBmb3VuZCAqLwotICAgICAgd2hpbGUgKGNvdW50IDwgQlVGTUFYKQorICAgICAgd2hpbGUgKGNvdW50IDwgQlVGTUFYIC0gMSkKIAl7CiAJICBjaCA9IGdldERlYnVnQ2hhciAoKTsKICAgICAgICAgICBpZiAoY2ggPT0gJyQnKQpkaWZmIC0tZ2l0IGEvZ2RiL3NoLXRkZXAuYyBiL2dkYi9zaC10ZGVwLmMKaW5kZXggZTUzMDg5My4uMmI0ODc4ZSAxMDA2NDQKLS0tIGEvZ2RiL3NoLXRkZXAuYworKysgYi9nZGIvc2gtdGRlcC5jCkBAIC0yMTE0LDYgKzIxMTQsNTggQEAKICAgcmV0dXJuIGxlZ2FjeV9yZWdpc3Rlcl9zaW1fcmVnbm8gKG5yKTsKIH0KIAorLyogU2V0IHVwIHRoZSByZWdpc3RlciB1bndpbmRpbmcgc3VjaCB0aGF0IGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVycyBhcmUKKyAgIG5vdCBkaXNwbGF5ZWQgaW4gZnJhbWVzID4wIGJlY2F1c2UgdGhlIHRydWUgdmFsdWUgaXMgbm90IGNlcnRhaW4uCisgICBUaGUgJ3VuZGVmaW5lZCcgcmVnaXN0ZXJzIHdpbGwgc2hvdyB1cCBhcyAnbm90IGF2YWlsYWJsZScgdW5sZXNzIHRoZQorICAgQ0ZJIHNheXMgb3RoZXJ3aXNlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBzZXQgdXAgZm9yIFNINCBhbmQgY29tcGF0aWJsZSBvbmx5LiAgKi8KKworc3RhdGljIHZvaWQKK3NoX2R3YXJmMl9mcmFtZV9pbml0X3JlZyAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIGludCByZWdudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkd2FyZjJfZnJhbWVfc3RhdGVfcmVnICpyZWcsCisJCQkgIHN0cnVjdCBmcmFtZV9pbmZvICpuZXh0X2ZyYW1lKQoreworICAvKiBNYXJrIHRoZSBQQyBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSByZXR1cm4gYWRkcmVzcy4gICovCisgIGlmIChyZWdudW0gPT0gUENfUkVHTlVNKQorICAgIHJlZy0+aG93ID0gRFdBUkYyX0ZSQU1FX1JFR19SQTsKKworICAvKiBNYXJrIHRoZSBzdGFjayBwb2ludGVyIGFzIHRoZSBjYWxsIGZyYW1lIGFkZHJlc3MuICAqLworICBlbHNlIGlmIChyZWdudW0gPT0gU1BfUkVHTlVNKQorICAgIHJlZy0+aG93ID0gRFdBUkYyX0ZSQU1FX1JFR19DRkE7CisKKyAgLyogVGhlIGFib3ZlIHdhcyB0YWtlbiBmcm9tIHRoZSBkZWZhdWx0IGluaXRfcmVnIGluIGR3YXJmMi1mcmFtZS5jCisgICAgIHdoaWxlIHRoZSBiZWxvdyBpcyBTSCBzcGVjaWZpYy4gICovCisKKyAgLyogQ2FsbGVyIHNhdmUgcmVnaXN0ZXJzLiAgKi8KKyAgZWxzZSBpZiAoKHJlZ251bSA+PSBSMF9SRUdOVU0gJiYgcmVnbnVtIDw9IFIwX1JFR05VTSs3KQorCSAgIHx8IChyZWdudW0gPj0gRlIwX1JFR05VTSAmJiByZWdudW0gPD0gRlIwX1JFR05VTSsxMSkKKwkgICB8fCAocmVnbnVtID49IERSMF9SRUdOVU0gJiYgcmVnbnVtIDw9IERSMF9SRUdOVU0rNSkKKwkgICB8fCAocmVnbnVtID49IEZWMF9SRUdOVU0gJiYgcmVnbnVtIDw9IEZWMF9SRUdOVU0rMikKKwkgICB8fCAocmVnbnVtID09IE1BQ0hfUkVHTlVNKQorCSAgIHx8IChyZWdudW0gPT0gTUFDTF9SRUdOVU0pCisJICAgfHwgKHJlZ251bSA9PSBGUFVMX1JFR05VTSkKKwkgICB8fCAocmVnbnVtID09IFNSX1JFR05VTSkpCisgICAgcmVnLT5ob3cgPSBEV0FSRjJfRlJBTUVfUkVHX1VOREVGSU5FRDsKKworICAvKiBDYWxsZWUgc2F2ZSByZWdpc3RlcnMuICAqLworICBlbHNlIGlmICgocmVnbnVtID49IFIwX1JFR05VTSs4ICYmIHJlZ251bSA8PSBSMF9SRUdOVU0rMTUpCisJICAgfHwgKHJlZ251bSA+PSBGUjBfUkVHTlVNKzEyICYmIHJlZ251bSA8PSBGUjBfUkVHTlVNKzE1KQorCSAgIHx8IChyZWdudW0gPj0gRFIwX1JFR05VTSs2ICYmIHJlZ251bSA8PSBEUjBfUkVHTlVNKzgpCisJICAgfHwgKHJlZ251bSA9PSBGVjBfUkVHTlVNKzMpKQorICAgIHJlZy0+aG93ID0gRFdBUkYyX0ZSQU1FX1JFR19TQU1FX1ZBTFVFOworCisgIC8qIE90aGVyIHJlZ2lzdGVycy4gIFRoZXNlIGFyZSBub3QgaW4gdGhlIEFCSSBhbmQgbWF5IG9yIG1heSBub3QKKyAgICAgbWVhbiBhbnl0aGluZyBpbiBmcmFtZXMgPjAgc28gZG9uJ3Qgc2hvdyB0aGVtLiAgKi8KKyAgZWxzZSBpZiAoKHJlZ251bSA+PSBSMF9CQU5LMF9SRUdOVU0gJiYgcmVnbnVtIDw9IFIwX0JBTkswX1JFR05VTSsxNSkKKwkgICB8fCAocmVnbnVtID09IEdCUl9SRUdOVU0pCisJICAgfHwgKHJlZ251bSA9PSBWQlJfUkVHTlVNKQorCSAgIHx8IChyZWdudW0gPT0gRlBTQ1JfUkVHTlVNKQorCSAgIHx8IChyZWdudW0gPT0gU1NSX1JFR05VTSkKKwkgICB8fCAocmVnbnVtID09IFNQQ19SRUdOVU0pKQorICAgIHJlZy0+aG93ID0gRFdBUkYyX0ZSQU1FX1JFR19VTkRFRklORUQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2hfZnJhbWVfY2FjaGUgKgogc2hfYWxsb2NfZnJhbWVfY2FjaGUgKHZvaWQpCiB7CkBAIC0yNDkyLDYgKzI1NDQsOCBAQAogCiAgIHNldF9nZGJhcmNoX2luX2Z1bmN0aW9uX2VwaWxvZ3VlX3AgKGdkYmFyY2gsIHNoX2luX2Z1bmN0aW9uX2VwaWxvZ3VlX3ApOwogCisgIGR3YXJmMl9mcmFtZV9zZXRfaW5pdF9yZWcgKGdkYmFyY2gsIHNoX2R3YXJmMl9mcmFtZV9pbml0X3JlZyk7CisKICAgc3dpdGNoIChpbmZvLmJmZF9hcmNoX2luZm8tPm1hY2gpCiAgICAgewogICAgIGNhc2UgYmZkX21hY2hfc2g6CmRpZmYgLS1naXQgYS9nZGIvc2gtdGRlcC5oIGIvZ2RiL3NoLXRkZXAuaAppbmRleCBkZDlmZWU4Li42ZDE3YmE1IDEwMDY0NAotLS0gYS9nZGIvc2gtdGRlcC5oCisrKyBiL2dkYi9zaC10ZGVwLmgKQEAgLTQxLDYgKzQxLDcgQEAKICAgICBGUFVMX1JFR05VTSA9IDIzLAogICAgIC8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLwogICAgIEZQU0NSX1JFR05VTSA9IDI0LAorICAgIEZSMF9SRUdOVU0gPSAyNSwKICAgICBGTE9BVF9BUkcwX1JFR05VTSA9IDI5LAogICAgIEZMT0FUX0FSR0xBU1RfUkVHTlVNID0gMzYsCiAgICAgRlBfTEFTVF9SRUdOVU0gPSA0MCwKZGlmZiAtLWdpdCBhL2dkYi9zb2wtdGhyZWFkLmMgYi9nZGIvc29sLXRocmVhZC5jCmluZGV4IGVkNGU4ZTUuLjEwNmVjMTkgMTAwNjQ0Ci0tLSBhL2dkYi9zb2wtdGhyZWFkLmMKKysrIGIvZ2RiL3NvbC10aHJlYWQuYwpAQCAtMTUyNCw3ICsxNTI0LDcgQEAKIH0KIAogc3RhdGljIGludAotaWdub3JlIChDT1JFX0FERFIgYWRkciwgZ2RiX2J5dGUgKmNvbnRlbnRzKQoraWdub3JlIChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKmJwX3RndCkKIHsKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9nZGIvc29saWItaXJpeC5jIGIvZ2RiL3NvbGliLWlyaXguYwppbmRleCBmZmJiMjUyLi45OTQ5NTNhIDEwMDY0NAotLS0gYS9nZGIvc29saWItaXJpeC5jCisrKyBiL2dkYi9zb2xpYi1pcml4LmMKQEAgLTIyNywxMCArMjI3LDkgQEAKIC8qIFRoZSBzeW1ib2wgd2hpY2ggc3RhcnRzIG9mZiB0aGUgbGlzdCBvZiBzaGFyZWQgbGlicmFyaWVzLiAgKi8KICNkZWZpbmUgREVCVUdfQkFTRSAiX19ybGRfb2JqX2hlYWQiCiAKLWNoYXIgc2hhZG93X2NvbnRlbnRzW0JSRUFLUE9JTlRfTUFYXTsJLyogU3Rhc2ggb2xkIGJrcHQgYWRkciBjb250ZW50cyAqLworc3RhdGljIHZvaWQgKmJhc2VfYnJlYWtwb2ludDsKIAogc3RhdGljIENPUkVfQUREUiBkZWJ1Z19iYXNlOwkvKiBCYXNlIG9mIGR5bmFtaWMgbGlua2VyIHN0cnVjdHVyZXMgKi8KLXN0YXRpYyBDT1JFX0FERFIgYnJlYWtwb2ludF9hZGRyOwkvKiBBZGRyZXNzIHdoZXJlIGVuZCBia3B0IGlzIHNldCAqLwogCiAvKgogCkBAIC0zMTksMTEgKzMxOCwxMyBAQAogICAvKiBOb3RlIHRoYXQgYnJlYWtwb2ludCBhZGRyZXNzIGFuZCBvcmlnaW5hbCBjb250ZW50cyBhcmUgaW4gb3VyIGFkZHJlc3MKICAgICAgc3BhY2UsIHNvIHdlIGp1c3QgbmVlZCB0byB3cml0ZSB0aGUgb3JpZ2luYWwgY29udGVudHMgYmFjay4gKi8KIAotICBpZiAobWVtb3J5X3JlbW92ZV9icmVha3BvaW50IChicmVha3BvaW50X2FkZHIsIHNoYWRvd19jb250ZW50cykgIT0gMCkKKyAgaWYgKGRlcHJlY2F0ZWRfcmVtb3ZlX3Jhd19icmVha3BvaW50IChiYXNlX2JyZWFrcG9pbnQpICE9IDApCiAgICAgewogICAgICAgc3RhdHVzID0gMDsKICAgICB9CiAKKyAgYmFzZV9icmVha3BvaW50ID0gTlVMTDsKKwogICAvKiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBoYXZlIHN0b3BwZWQgYXQgYSBsb2NhdGlvbiB0aGF0CiAgICAgIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsb2NhdGlvbiB3aGVyZSB3ZSBpbnNlcnRlZCBvdXIgYnJlYWtwb2ludC4KICAgICAgT24gbWlwcy1pcml4LCB3ZSBjYW4gYWN0dWFsbHkgbGFuZCBpbiBfX2RieF9pbml0KCksIHNvIHdlIHNob3VsZApAQCAtMzUyLDEyICszNTMsMTMgQEAKIHN0YXRpYyBpbnQKIGVuYWJsZV9icmVhayAodm9pZCkKIHsKLSAgaWYgKHN5bWZpbGVfb2JqZmlsZSAhPSBOVUxMCi0gICAgICAmJiB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKGVudHJ5X3BvaW50X2FkZHJlc3MgKCksCi0JCQkJICAgc2hhZG93X2NvbnRlbnRzKSA9PSAwKQorICBpZiAoc3ltZmlsZV9vYmpmaWxlICE9IE5VTEwpCiAgICAgewotICAgICAgYnJlYWtwb2ludF9hZGRyID0gZW50cnlfcG9pbnRfYWRkcmVzcyAoKTsKLSAgICAgIHJldHVybiAxOworICAgICAgYmFzZV9icmVha3BvaW50CisJPSBkZXByZWNhdGVkX2luc2VydF9yYXdfYnJlYWtwb2ludCAoZW50cnlfcG9pbnRfYWRkcmVzcyAoKSk7CisKKyAgICAgIGlmIChiYXNlX2JyZWFrcG9pbnQgIT0gTlVMTCkKKwlyZXR1cm4gMTsKICAgICB9CiAKICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9nZGIvc3BhcmMtbGludXgtbmF0LmMgYi9nZGIvc3BhcmMtbGludXgtbmF0LmMKaW5kZXggYTIzNDQwMi4uODdkYTNmMSAxMDA2NDQKLS0tIGEvZ2RiL3NwYXJjLWxpbnV4LW5hdC5jCisrKyBiL2dkYi9zcGFyYy1saW51eC1uYXQuYwpAQCAtMjAsMTAgKzIwLDQxIEBACiAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCiAKICNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAicmVnY2FjaGUuaCIKKworI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKyNpbmNsdWRlICJncmVnc2V0LmgiCisKKyNpbmNsdWRlICJzcGFyYy10ZGVwLmgiCisjaW5jbHVkZSAic3BhcmMtbmF0LmgiCiAjaW5jbHVkZSAiaW5mZXJpb3IuaCIKICNpbmNsdWRlICJ0YXJnZXQuaCIKICNpbmNsdWRlICJsaW51eC1uYXQuaCIKIAordm9pZAorc3VwcGx5X2dyZWdzZXQgKHByZ3JlZ3NldF90ICpncmVncykKK3sKKyAgc3BhcmMzMl9zdXBwbHlfZ3JlZ3NldCAoc3BhcmNfZ3JlZ3NldCwgY3VycmVudF9yZWdjYWNoZSwgLTEsIGdyZWdzKTsKK30KKwordm9pZAorc3VwcGx5X2ZwcmVnc2V0IChwcmZwcmVnc2V0X3QgKmZwcmVncykKK3sKKyAgc3BhcmMzMl9zdXBwbHlfZnByZWdzZXQgKGN1cnJlbnRfcmVnY2FjaGUsIC0xLCBmcHJlZ3MpOworfQorCit2b2lkCitmaWxsX2dyZWdzZXQgKHByZ3JlZ3NldF90ICpncmVncywgaW50IHJlZ251bSkKK3sKKyAgc3BhcmMzMl9jb2xsZWN0X2dyZWdzZXQgKHNwYXJjX2dyZWdzZXQsIGN1cnJlbnRfcmVnY2FjaGUsIHJlZ251bSwgZ3JlZ3MpOworfQorCit2b2lkCitmaWxsX2ZwcmVnc2V0IChwcmZwcmVnc2V0X3QgKmZwcmVncywgaW50IHJlZ251bSkKK3sKKyAgc3BhcmMzMl9jb2xsZWN0X2ZwcmVnc2V0IChjdXJyZW50X3JlZ2NhY2hlLCByZWdudW0sIGZwcmVncyk7Cit9CisKIHZvaWQgX2luaXRpYWxpYWxpemVfc3BhcmNfbGludXhfbmF0ICh2b2lkKTsKIAogdm9pZApkaWZmIC0tZ2l0IGEvZ2RiL3NwYXJjLWxpbnV4LXRkZXAuYyBiL2dkYi9zcGFyYy1saW51eC10ZGVwLmMKaW5kZXggMzAwZGI5YS4uYmIxYTdmMCAxMDA2NDQKLS0tIGEvZ2RiL3NwYXJjLWxpbnV4LXRkZXAuYworKysgYi9nZGIvc3BhcmMtbGludXgtdGRlcC5jCkBAIC0yMCw5ICsyMCwxMSBAQAogICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLwogCiAjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImR3YXJmMi1mcmFtZS5oIgogI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCiAjaW5jbHVkZSAiZnJhbWUuaCIKICNpbmNsdWRlICJmcmFtZS11bndpbmQuaCIKKyNpbmNsdWRlICJyZWdzZXQuaCIKICNpbmNsdWRlICJnZGJhcmNoLmgiCiAjaW5jbHVkZSAiZ2RiY29yZS5oIgogI2luY2x1ZGUgIm9zYWJpLmgiCkBAIC05MSw3ICs5Myw3IEBACiAJCQkgICAgIHN0cnVjdCB0cmFkX2ZyYW1lX2NhY2hlICp0aGlzX2NhY2hlLAogCQkJICAgICBDT1JFX0FERFIgZnVuYykKIHsKLSAgQ09SRV9BRERSIGJhc2UsIGFkZHI7CisgIENPUkVfQUREUiBiYXNlLCBhZGRyLCBzcF9hZGRyOwogICBpbnQgcmVnbnVtOwogCiAgIGJhc2UgPSBmcmFtZV91bndpbmRfcmVnaXN0ZXJfdW5zaWduZWQgKG5leHRfZnJhbWUsIFNQQVJDX08xX1JFR05VTSk7CkBAIC0xMDcsMTMgKzEwOSwxNiBAQAogCiAgIC8qIFNpbmNlICVnMCBpcyBhbHdheXMgemVybywga2VlcCB0aGUgaWRlbnRpdHkgZW5jb2RpbmcuICAqLwogICBhZGRyID0gYmFzZSArIDIwOworICBzcF9hZGRyID0gYmFzZSArIDE2ICsgKChTUEFSQ19TUF9SRUdOVU0gLSBTUEFSQ19HMF9SRUdOVU0pICogNCk7CiAgIGZvciAocmVnbnVtID0gU1BBUkNfRzFfUkVHTlVNOyByZWdudW0gPD0gU1BBUkNfTzdfUkVHTlVNOyByZWdudW0rKykKICAgICB7CiAgICAgICB0cmFkX2ZyYW1lX3NldF9yZWdfYWRkciAodGhpc19jYWNoZSwgcmVnbnVtLCBhZGRyKTsKICAgICAgIGFkZHIgKz0gNDsKICAgICB9CiAKLSAgYmFzZSA9IGFkZHIgPSBmcmFtZV91bndpbmRfcmVnaXN0ZXJfdW5zaWduZWQgKG5leHRfZnJhbWUsIFNQQVJDX1NQX1JFR05VTSk7CisgIGJhc2UgPSBmcmFtZV91bndpbmRfcmVnaXN0ZXJfdW5zaWduZWQgKG5leHRfZnJhbWUsIFNQQVJDX1NQX1JFR05VTSk7CisgIGFkZHIgPSBnZXRfZnJhbWVfbWVtb3J5X3Vuc2lnbmVkIChuZXh0X2ZyYW1lLCBzcF9hZGRyLCA0KTsKKwogICBmb3IgKHJlZ251bSA9IFNQQVJDX0wwX1JFR05VTTsgcmVnbnVtIDw9IFNQQVJDX0k3X1JFR05VTTsgcmVnbnVtKyspCiAgICAgewogICAgICAgdHJhZF9mcmFtZV9zZXRfcmVnX2FkZHIgKHRoaXNfY2FjaGUsIHJlZ251bSwgYWRkcik7CkBAIC0xMjIsMTIgKzEyNywxMTEgQEAKICAgdHJhZF9mcmFtZV9zZXRfaWQgKHRoaXNfY2FjaGUsIGZyYW1lX2lkX2J1aWxkIChiYXNlLCBmdW5jKSk7CiB9CiAMCisvKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYSBzeXN0ZW0gY2FsbCdzIGFsdGVybmF0aXZlIHJldHVybgorICAgYWRkcmVzcy4gICovCisKK3N0YXRpYyBDT1JFX0FERFIKK3NwYXJjMzJfbGludXhfc3RlcF90cmFwICh1bnNpZ25lZCBsb25nIGluc24pCit7CisgIGlmIChpbnNuID09IDB4OTFkMDIwMTApCisgICAgeworICAgICAgVUxPTkdFU1Qgc2NfbnVtOworCisgICAgICByZWdjYWNoZV9jb29rZWRfcmVhZF91bnNpZ25lZCAoY3VycmVudF9yZWdjYWNoZSwKKwkJCQkgICAgIFNQQVJDX0cxX1JFR05VTSwgJnNjX251bSk7CisKKyAgICAgIC8qIF9fTlJfcnRfc2lncmV0dXJuIGlzIDEwMSBhbmQgX19OUl9zaWdyZXR1cm4gaXMgMjE2ICAqLworICAgICAgaWYgKHNjX251bSA9PSAxMDEgfHwgc2NfbnVtID09IDIxNikKKwl7CisJICBVTE9OR0VTVCBzcCwgcGNfb2Zmc2V0OworCisJICByZWdjYWNoZV9jb29rZWRfcmVhZF91bnNpZ25lZCAoY3VycmVudF9yZWdjYWNoZSwKKwkJCQkJIFNQQVJDX1NQX1JFR05VTSwgJnNwKTsKKworCSAgLyogVGhlIGtlcm5lbCBwdXRzIHRoZSBzaWdyZXR1cm4gcmVnaXN0ZXJzIG9uIHRoZSBzdGFjaywKKwkgICAgIGFuZCB0aGlzIGlzIHdoZXJlIHRoZSBzaWduYWwgdW53aW5kaW5nIHN0YXRlIGlzIHRha2UgZnJvbQorCSAgICAgd2hlbiByZXR1cm5pbmcgZnJvbSBhIHNpZ25hbC4KKworCSAgICAgRm9yIF9fTlJfc2lncmV0dXJuLCB0aGlzIHJlZ2lzdGVyIGFyZWEgc2l0cyA5NiBieXRlcyBmcm9tCisJICAgICB0aGUgYmFzZSBvZiB0aGUgc3RhY2suICBUaGUgc2F2ZWQgUEMgc2l0cyA0IGJ5dGVzIGludG8gdGhlCisJICAgICBzaWdyZXR1cm4gcmVnaXN0ZXIgc2F2ZSBhcmVhLgorCisJICAgICBGb3IgX19OUl9ydF9zaWdyZXR1cm4gYSBzaWdpbmZvX3QsIHdoaWNoIGlzIDEyOCBieXRlcywgc2l0cworCSAgICAgcmlnaHQgYmVmb3JlIHRoZSBzaWdyZXR1cm4gcmVnaXN0ZXIgc2F2ZSBhcmVhLiAgKi8KKworCSAgcGNfb2Zmc2V0ID0gOTYgKyA0OworCSAgaWYgKHNjX251bSA9PSAxMDEpCisJICAgIHBjX29mZnNldCArPSAxMjg7CisKKwkgIHJldHVybiByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChzcCArIHBjX29mZnNldCwgNCk7CisJfQorICAgIH0KKworICByZXR1cm4gMDsKK30KKwwKKworY29uc3Qgc3RydWN0IHNwYXJjX2dyZWdzZXQgc3BhcmMzMl9saW51eF9jb3JlX2dyZWdzZXQgPQoreworICAzMiAqIDQsCQkJLyogJXBzciAqLworICAzMyAqIDQsCQkJLyogJXBjICovCisgIDM0ICogNCwJCQkvKiAlbnBjICovCisgIDM1ICogNCwJCQkvKiAleSAqLworICAtMSwJCQkJLyogJXdpbSAqLworICAtMSwJCQkJLyogJXRiciAqLworICAxICogNCwJCQkvKiAlZzEgKi8KKyAgMTYgKiA0LAkJCS8qICVsMCAqLworICA0LAkJCQkvKiB5IHNpemUgKi8KK307CisMCisKK3N0YXRpYyB2b2lkCitzcGFyYzMyX2xpbnV4X3N1cHBseV9jb3JlX2dyZWdzZXQgKGNvbnN0IHN0cnVjdCByZWdzZXQgKnJlZ3NldCwKKwkJCQkgICBzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlLAorCQkJCSAgIGludCByZWdudW0sIGNvbnN0IHZvaWQgKmdyZWdzLCBzaXplX3QgbGVuKQoreworICBzcGFyYzMyX3N1cHBseV9ncmVnc2V0ICgmc3BhcmMzMl9saW51eF9jb3JlX2dyZWdzZXQsIHJlZ2NhY2hlLCByZWdudW0sIGdyZWdzKTsKK30KKworc3RhdGljIHZvaWQKK3NwYXJjMzJfbGludXhfY29sbGVjdF9jb3JlX2dyZWdzZXQgKGNvbnN0IHN0cnVjdCByZWdzZXQgKnJlZ3NldCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSwKKwkJCQkgICAgaW50IHJlZ251bSwgdm9pZCAqZ3JlZ3MsIHNpemVfdCBsZW4pCit7CisgIHNwYXJjMzJfY29sbGVjdF9ncmVnc2V0ICgmc3BhcmMzMl9saW51eF9jb3JlX2dyZWdzZXQsIHJlZ2NhY2hlLCByZWdudW0sIGdyZWdzKTsKK30KKworc3RhdGljIHZvaWQKK3NwYXJjMzJfbGludXhfc3VwcGx5X2NvcmVfZnByZWdzZXQgKGNvbnN0IHN0cnVjdCByZWdzZXQgKnJlZ3NldCwKKwkJCQkgICAgc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSwKKwkJCQkgICAgaW50IHJlZ251bSwgY29uc3Qgdm9pZCAqZnByZWdzLCBzaXplX3QgbGVuKQoreworICBzcGFyYzMyX3N1cHBseV9mcHJlZ3NldCAocmVnY2FjaGUsIHJlZ251bSwgZnByZWdzKTsKK30KKworc3RhdGljIHZvaWQKK3NwYXJjMzJfbGludXhfY29sbGVjdF9jb3JlX2ZwcmVnc2V0IChjb25zdCBzdHJ1Y3QgcmVnc2V0ICpyZWdzZXQsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlLAorCQkJCSAgICAgaW50IHJlZ251bSwgdm9pZCAqZnByZWdzLCBzaXplX3QgbGVuKQoreworICBzcGFyYzMyX2NvbGxlY3RfZnByZWdzZXQgKHJlZ2NhY2hlLCByZWdudW0sIGZwcmVncyk7Cit9CisKKwwKIAogc3RhdGljIHZvaWQKIHNwYXJjMzJfbGludXhfaW5pdF9hYmkgKHN0cnVjdCBnZGJhcmNoX2luZm8gaW5mbywgc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gpCiB7CiAgIHN0cnVjdCBnZGJhcmNoX3RkZXAgKnRkZXAgPSBnZGJhcmNoX3RkZXAgKGdkYmFyY2gpOwogCisgIHRkZXAtPmdyZWdzZXQgPSByZWdzZXRfYWxsb2MgKGdkYmFyY2gsIHNwYXJjMzJfbGludXhfc3VwcGx5X2NvcmVfZ3JlZ3NldCwKKwkJCQlzcGFyYzMyX2xpbnV4X2NvbGxlY3RfY29yZV9ncmVnc2V0KTsKKyAgdGRlcC0+c2l6ZW9mX2dyZWdzZXQgPSAxNTI7CisKKyAgdGRlcC0+ZnByZWdzZXQgPSByZWdzZXRfYWxsb2MgKGdkYmFyY2gsIHNwYXJjMzJfbGludXhfc3VwcGx5X2NvcmVfZnByZWdzZXQsCisJCQkJIHNwYXJjMzJfbGludXhfY29sbGVjdF9jb3JlX2ZwcmVnc2V0KTsKKyAgdGRlcC0+c2l6ZW9mX2ZwcmVnc2V0ID0gMzk2OworCiAgIHRyYW1wX2ZyYW1lX3ByZXBlbmRfdW53aW5kZXIgKGdkYmFyY2gsICZzcGFyYzMyX2xpbnV4X3NpZ2ZyYW1lKTsKICAgdHJhbXBfZnJhbWVfcHJlcGVuZF91bndpbmRlciAoZ2RiYXJjaCwgJnNwYXJjMzJfbGludXhfcnRfc2lnZnJhbWUpOwogCkBAIC0xNDcsNiArMjUxLDEyIEBACiAgIC8qIEVuYWJsZSBUTFMgc3VwcG9ydC4gICovCiAgIHNldF9nZGJhcmNoX2ZldGNoX3Rsc19sb2FkX21vZHVsZV9hZGRyZXNzIChnZGJhcmNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZyNF9mZXRjaF9vYmpmaWxlX2xpbmtfbWFwKTsKKworICAvKiBNYWtlIHN1cmUgd2UgY2FuIHNpbmdsZS1zdGVwIG92ZXIgc2lnbmFsIHJldHVybiBzeXN0ZW0gY2FsbHMuICAqLworICB0ZGVwLT5zdGVwX3RyYXAgPSBzcGFyYzMyX2xpbnV4X3N0ZXBfdHJhcDsKKworICAvKiBIb29rIGluIHRoZSBEV0FSRiBDRkkgZnJhbWUgdW53aW5kZXIuICAqLworICBmcmFtZV91bndpbmRfYXBwZW5kX3NuaWZmZXIgKGdkYmFyY2gsIGR3YXJmMl9mcmFtZV9zbmlmZmVyKTsKIH0KIAogLyogUHJvdmlkZSBhIHByb3RvdHlwZSB0byBzaWxlbmNlIC1XbWlzc2luZy1wcm90b3R5cGVzLiAgKi8KZGlmZiAtLWdpdCBhL2dkYi9zcGFyYy1zdHViLmMgYi9nZGIvc3BhcmMtc3R1Yi5jCmluZGV4IDFlNjI5OGEuLmMxMmQ0MzYgMTAwNjQ0Ci0tLSBhL2dkYi9zcGFyYy1zdHViLmMKKysrIGIvZ2RiL3NwYXJjLXN0dWIuYwpAQCAtMzA2LDcgKzMwNiw3IEBACiAgICAgICBjb3VudCA9IDA7CiAKICAgICAgIC8qIG5vdywgcmVhZCB1bnRpbCBhICMgb3IgZW5kIG9mIGJ1ZmZlciBpcyBmb3VuZCAqLwotICAgICAgd2hpbGUgKGNvdW50IDwgQlVGTUFYKQorICAgICAgd2hpbGUgKGNvdW50IDwgQlVGTUFYIC0gMSkKIAl7CiAJICBjaCA9IGdldERlYnVnQ2hhciAoKTsKICAgICAgICAgICBpZiAoY2ggPT0gJyQnKQpkaWZmIC0tZ2l0IGEvZ2RiL3NwYXJjLXRkZXAuYyBiL2dkYi9zcGFyYy10ZGVwLmMKaW5kZXggZGM2YzUzNC4uNzk3ZTI0MCAxMDA2NDQKLS0tIGEvZ2RiL3NwYXJjLXRkZXAuYworKysgYi9nZGIvc3BhcmMtdGRlcC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiZGVmcy5oIgogI2luY2x1ZGUgImFyY2gtdXRpbHMuaCIKICNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAiZHdhcmYyLWZyYW1lLmgiCiAjaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKICNpbmNsdWRlICJmcmFtZS5oIgogI2luY2x1ZGUgImZyYW1lLWJhc2UuaCIKQEAgLTY3OSw2ICs2ODAsMjMgQEAKICAgcmV0dXJuIGNhY2hlOwogfQogCitzdGF0aWMgaW50CitzcGFyYzMyX3N0cnVjdF9yZXR1cm5fZnJvbV9zeW0gKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGUgPSBjaGVja190eXBlZGVmIChTWU1CT0xfVFlQRSAoc3ltKSk7CisgIGVudW0gdHlwZV9jb2RlIGNvZGUgPSBUWVBFX0NPREUgKHR5cGUpOworCisgIGlmIChjb2RlID09IFRZUEVfQ09ERV9GVU5DIHx8IGNvZGUgPT0gVFlQRV9DT0RFX01FVEhPRCkKKyAgICB7CisgICAgICB0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOworICAgICAgaWYgKHNwYXJjX3N0cnVjdHVyZV9vcl91bmlvbl9wICh0eXBlKQorCSAgfHwgKHNwYXJjX2Zsb2F0aW5nX3AgKHR5cGUpICYmIFRZUEVfTEVOR1RIICh0eXBlKSA9PSAxNikpCisJcmV0dXJuIDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCiBzdHJ1Y3Qgc3BhcmNfZnJhbWVfY2FjaGUgKgogc3BhcmMzMl9mcmFtZV9jYWNoZSAoc3RydWN0IGZyYW1lX2luZm8gKm5leHRfZnJhbWUsIHZvaWQgKip0aGlzX2NhY2hlKQogewpAQCAtNjkzLDE2ICs3MTEsNyBAQAogICBzeW0gPSBmaW5kX3BjX2Z1bmN0aW9uIChjYWNoZS0+cGMpOwogICBpZiAoc3ltKQogICAgIHsKLSAgICAgIHN0cnVjdCB0eXBlICp0eXBlID0gY2hlY2tfdHlwZWRlZiAoU1lNQk9MX1RZUEUgKHN5bSkpOwotICAgICAgZW51bSB0eXBlX2NvZGUgY29kZSA9IFRZUEVfQ09ERSAodHlwZSk7Ci0KLSAgICAgIGlmIChjb2RlID09IFRZUEVfQ09ERV9GVU5DIHx8IGNvZGUgPT0gVFlQRV9DT0RFX01FVEhPRCkKLQl7Ci0JICB0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotCSAgaWYgKHNwYXJjX3N0cnVjdHVyZV9vcl91bmlvbl9wICh0eXBlKQotCSAgICAgIHx8IChzcGFyY19mbG9hdGluZ19wICh0eXBlKSAmJiBUWVBFX0xFTkdUSCAodHlwZSkgPT0gMTYpKQotCSAgICBjYWNoZS0+c3RydWN0X3JldHVybl9wID0gMTsKLQl9CisgICAgICBjYWNoZS0+c3RydWN0X3JldHVybl9wID0gc3BhcmMzMl9zdHJ1Y3RfcmV0dXJuX2Zyb21fc3ltIChzeW0pOwogICAgIH0KICAgZWxzZQogICAgIHsKQEAgLTk5NCw2ICsxMDAzLDQ4IEBACiAJICB8fCAoc3BhcmNfZmxvYXRpbmdfcCAodHlwZSkgJiYgVFlQRV9MRU5HVEggKHR5cGUpID09IDE2KSk7CiB9CiAKK3N0YXRpYyBpbnQKK3NwYXJjMzJfZHdhcmYyX3N0cnVjdF9yZXR1cm5fcCAoc3RydWN0IGZyYW1lX2luZm8gKm5leHRfZnJhbWUpCit7CisgIENPUkVfQUREUiBwYyA9IGZyYW1lX3Vud2luZF9hZGRyZXNzX2luX2Jsb2NrIChuZXh0X2ZyYW1lKTsKKyAgc3RydWN0IHN5bWJvbCAqc3ltID0gZmluZF9wY19mdW5jdGlvbiAocGMpOworCisgIGlmIChzeW0pCisgICAgcmV0dXJuIHNwYXJjMzJfc3RydWN0X3JldHVybl9mcm9tX3N5bSAoc3ltKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzcGFyYzMyX2R3YXJmMl9mcmFtZV9pbml0X3JlZyAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIGludCByZWdudW0sCisJCQkgICAgICAgc3RydWN0IGR3YXJmMl9mcmFtZV9zdGF0ZV9yZWcgKnJlZywKKwkJCSAgICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqbmV4dF9mcmFtZSkKK3sKKyAgaW50IG9mZjsKKworICBzd2l0Y2ggKHJlZ251bSkKKyAgICB7CisgICAgY2FzZSBTUEFSQ19HMF9SRUdOVU06CisgICAgICAvKiBTaW5jZSAlZzAgaXMgYWx3YXlzIHplcm8sIHRoZXJlIGlzIG5vIHBvaW50IGluIHNhdmluZyBpdCwgYW5kCisJIHBlb3BsZSB3aWxsIGJlIGluY2xpbmVkIG9taXQgaXQgZnJvbSB0aGUgQ0ZJLiAgTWFrZSBzdXJlIHdlCisJIGRvbid0IHdhcm4gYWJvdXQgdGhhdC4gICovCisgICAgICByZWctPmhvdyA9IERXQVJGMl9GUkFNRV9SRUdfU0FNRV9WQUxVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1BBUkNfU1BfUkVHTlVNOgorICAgICAgcmVnLT5ob3cgPSBEV0FSRjJfRlJBTUVfUkVHX0NGQTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1BBUkMzMl9QQ19SRUdOVU06CisgICAgY2FzZSBTUEFSQzMyX05QQ19SRUdOVU06CisgICAgICByZWctPmhvdyA9IERXQVJGMl9GUkFNRV9SRUdfUkFfT0ZGU0VUOworICAgICAgb2ZmID0gODsKKyAgICAgIGlmIChzcGFyYzMyX2R3YXJmMl9zdHJ1Y3RfcmV0dXJuX3AgKG5leHRfZnJhbWUpKQorCW9mZiArPSA0OworICAgICAgaWYgKHJlZ251bSA9PSBTUEFSQzMyX05QQ19SRUdOVU0pCisJb2ZmICs9IDQ7CisgICAgICByZWctPmxvYy5vZmZzZXQgPSBvZmY7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKIAwKIC8qIFRoZSBTUEFSQyBBcmNoaXRlY3R1cmUgZG9lc24ndCBoYXZlIGhhcmR3YXJlIHNpbmdsZS1zdGVwIHN1cHBvcnQsCiAgICBhbmQgbW9zdCBvcGVyYXRpbmcgc3lzdGVtcyBkb24ndCBpbXBsZW1lbnQgaXQgZWl0aGVyLCBzbyB3ZSBwcm92aWRlCkBAIC0xMDg1LDggKzExMzYsNyBAQAogewogICBzdHJ1Y3QgZ2RiYXJjaCAqYXJjaCA9IGN1cnJlbnRfZ2RiYXJjaDsKICAgc3RydWN0IGdkYmFyY2hfdGRlcCAqdGRlcCA9IGdkYmFyY2hfdGRlcCAoYXJjaCk7Ci0gIHN0YXRpYyBDT1JFX0FERFIgbnBjLCBubnBjOwotICBzdGF0aWMgZ2RiX2J5dGUgbnBjX3NhdmVbNF0sIG5ucGNfc2F2ZVs0XTsKKyAgQ09SRV9BRERSIG5wYywgbm5wYzsKIAogICBpZiAoaW5zZXJ0X2JyZWFrcG9pbnRzX3ApCiAgICAgewpAQCAtMTA5OCw5ICsxMTQ4LDEwIEBACiAgICAgICAvKiBBbmFseXplIHRoZSBpbnN0cnVjdGlvbiBhdCBQQy4gICovCiAgICAgICBubnBjID0gc3BhcmNfYW5hbHl6ZV9jb250cm9sX3RyYW5zZmVyIChhcmNoLCBwYywgJm5wYyk7CiAgICAgICBpZiAobnBjICE9IDApCi0JdGFyZ2V0X2luc2VydF9icmVha3BvaW50IChucGMsIG5wY19zYXZlKTsKKwlpbnNlcnRfc2luZ2xlX3N0ZXBfYnJlYWtwb2ludCAobnBjKTsKKwogICAgICAgaWYgKG5ucGMgIT0gMCkKLQl0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKG5ucGMsIG5ucGNfc2F2ZSk7CisJaW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQgKG5ucGMpOwogCiAgICAgICAvKiBBc3NlcnQgdGhhdCB3ZSBoYXZlIHNldCBhdCBsZWFzdCBvbmUgYnJlYWtwb2ludCwgYW5kIHRoYXQKIAkgdGhleSdyZSBub3Qgc2V0IGF0IHRoZSBzYW1lIHNwb3QgLSB1bmxlc3Mgd2UncmUgZ29pbmcKQEAgLTExMDksMTIgKzExNjAsNyBAQAogICAgICAgZ2RiX2Fzc2VydCAobm5wYyAhPSBucGMgfHwgb3JpZ19ucGMgPT0gMCk7CiAgICAgfQogICBlbHNlCi0gICAgewotICAgICAgaWYgKG5wYyAhPSAwKQotCXRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAobnBjLCBucGNfc2F2ZSk7Ci0gICAgICBpZiAobm5wYyAhPSAwKQotCXRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAobm5wYywgbm5wY19zYXZlKTsKLSAgICB9CisgICAgcmVtb3ZlX3NpbmdsZV9zdGVwX2JyZWFrcG9pbnRzICgpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTI0NSw2ICsxMjkxLDExIEBACiAKICAgZnJhbWVfYmFzZV9zZXRfZGVmYXVsdCAoZ2RiYXJjaCwgJnNwYXJjMzJfZnJhbWVfYmFzZSk7CiAKKyAgLyogSG9vayBpbiB0aGUgRFdBUkYgQ0ZJIGZyYW1lIHVud2luZGVyLiAgKi8KKyAgZHdhcmYyX2ZyYW1lX3NldF9pbml0X3JlZyAoZ2RiYXJjaCwgc3BhcmMzMl9kd2FyZjJfZnJhbWVfaW5pdF9yZWcpOworICAvKiBGSVhNRToga2V0dGVuaXMvMjAwNTA0MjM6IERvbid0IGVuYWJsZSB0aGUgdW53aW5kZXIgdW50aWwgdGhlCisgICAgIFN0YWNrR2hvc3QgaXNzdWVzIGhhdmUgYmVlbiByZXNvbHZlZC4gICovCisKICAgLyogSG9vayBpbiBBQkktc3BlY2lmaWMgb3ZlcnJpZGVzLCBpZiB0aGV5IGhhdmUgYmVlbiByZWdpc3RlcmVkLiAgKi8KICAgZ2RiYXJjaF9pbml0X29zYWJpIChpbmZvLCBnZGJhcmNoKTsKIApkaWZmIC0tZ2l0IGEvZ2RiL3NwYXJjNjQtbGludXgtbmF0LmMgYi9nZGIvc3BhcmM2NC1saW51eC1uYXQuYwppbmRleCA3MzBkNGY5Li45ZGM5YTZjIDEwMDY0NAotLS0gYS9nZGIvc3BhcmM2NC1saW51eC1uYXQuYworKysgYi9nZGIvc3BhcmM2NC1saW51eC1uYXQuYwpAQCAtMjAsOCArMjAsMTMgQEAKICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KIAogI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJyZWdjYWNoZS5oIgorCisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorI2luY2x1ZGUgImdyZWdzZXQuaCIKIAogI2luY2x1ZGUgInNwYXJjNjQtdGRlcC5oIgorI2luY2x1ZGUgInNwYXJjLXRkZXAuaCIKICNpbmNsdWRlICJzcGFyYy1uYXQuaCIKICNpbmNsdWRlICJpbmZlcmlvci5oIgogI2luY2x1ZGUgInRhcmdldC5oIgpAQCAtNDEsNiArNDYsMzAgQEAKIH07CiAMCiAKK3ZvaWQKK3N1cHBseV9ncmVnc2V0IChwcmdyZWdzZXRfdCAqZ3JlZ3MpCit7CisgIHNwYXJjNjRfc3VwcGx5X2dyZWdzZXQgKHNwYXJjX2dyZWdzZXQsIGN1cnJlbnRfcmVnY2FjaGUsIC0xLCBncmVncyk7Cit9CisKK3ZvaWQKK3N1cHBseV9mcHJlZ3NldCAocHJmcHJlZ3NldF90ICpmcHJlZ3MpCit7CisgIHNwYXJjNjRfc3VwcGx5X2ZwcmVnc2V0IChjdXJyZW50X3JlZ2NhY2hlLCAtMSwgZnByZWdzKTsKK30KKwordm9pZAorZmlsbF9ncmVnc2V0IChwcmdyZWdzZXRfdCAqZ3JlZ3MsIGludCByZWdudW0pCit7CisgIHNwYXJjNjRfY29sbGVjdF9ncmVnc2V0IChzcGFyY19ncmVnc2V0LCBjdXJyZW50X3JlZ2NhY2hlLCByZWdudW0sIGdyZWdzKTsKK30KKwordm9pZAorZmlsbF9mcHJlZ3NldCAocHJmcHJlZ3NldF90ICpmcHJlZ3MsIGludCByZWdudW0pCit7CisgIHNwYXJjNjRfY29sbGVjdF9mcHJlZ3NldCAoY3VycmVudF9yZWdjYWNoZSwgcmVnbnVtLCBmcHJlZ3MpOworfQorCiAvKiBQcm92aWRlIGEgcHJvdG90eXBlIHRvIHNpbGVuY2UgLVdtaXNzaW5nLXByb3RvdHlwZXMuICAqLwogdm9pZCBfaW5pdGlhbGl6ZV9zcGFyYzY0X2xpbnV4X25hdCAodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2dkYi9zcGFyYzY0LWxpbnV4LXRkZXAuYyBiL2dkYi9zcGFyYzY0LWxpbnV4LXRkZXAuYwppbmRleCA5YzY0Y2E2Li44NTBmMDQ1IDEwMDY0NAotLS0gYS9nZGIvc3BhcmM2NC1saW51eC10ZGVwLmMKKysrIGIvZ2RiL3NwYXJjNjQtbGludXgtdGRlcC5jCkBAIC0yMiw3ICsyMiwxMSBAQAogI2luY2x1ZGUgImRlZnMuaCIKICNpbmNsdWRlICJmcmFtZS5oIgogI2luY2x1ZGUgImZyYW1lLXVud2luZC5oIgorI2luY2x1ZGUgImR3YXJmMi1mcmFtZS5oIgorI2luY2x1ZGUgInJlZ3NldC5oIgorI2luY2x1ZGUgInJlZ2NhY2hlLmgiCiAjaW5jbHVkZSAiZ2RiYXJjaC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKICNpbmNsdWRlICJvc2FiaS5oIgogI2luY2x1ZGUgInNvbGliLXN2cjQuaCIKICNpbmNsdWRlICJzeW10YWIuaCIKQEAgLTU5LDcgKzYzLDcgQEAKIAkJCSAgICAgc3RydWN0IHRyYWRfZnJhbWVfY2FjaGUgKnRoaXNfY2FjaGUsCiAJCQkgICAgIENPUkVfQUREUiBmdW5jKQogewotICBDT1JFX0FERFIgYmFzZSwgYWRkcjsKKyAgQ09SRV9BRERSIGJhc2UsIGFkZHIsIHNwX2FkZHI7CiAgIGludCByZWdudW07CiAKICAgYmFzZSA9IGZyYW1lX3Vud2luZF9yZWdpc3Rlcl91bnNpZ25lZCAobmV4dF9mcmFtZSwgU1BBUkNfTzFfUkVHTlVNKTsKQEAgLTY5LDYgKzczLDcgQEAKIAogICAvKiBTaW5jZSAlZzAgaXMgYWx3YXlzIHplcm8sIGtlZXAgdGhlIGlkZW50aXR5IGVuY29kaW5nLiAgKi8KICAgYWRkciA9IGJhc2UgKyA4OworICBzcF9hZGRyID0gYmFzZSArICgoU1BBUkNfU1BfUkVHTlVNIC0gU1BBUkNfRzBfUkVHTlVNKSAqIDgpOwogICBmb3IgKHJlZ251bSA9IFNQQVJDX0cxX1JFR05VTTsgcmVnbnVtIDw9IFNQQVJDX083X1JFR05VTTsgcmVnbnVtKyspCiAgICAgewogICAgICAgdHJhZF9mcmFtZV9zZXRfcmVnX2FkZHIgKHRoaXNfY2FjaGUsIHJlZ251bSwgYWRkcik7CkBAIC04MSwxMSArODYsMTQgQEAKICAgdHJhZF9mcmFtZV9zZXRfcmVnX2FkZHIgKHRoaXNfY2FjaGUsIFNQQVJDNjRfWV9SRUdOVU0sIGFkZHIgKyAyNCk7CiAgIHRyYWRfZnJhbWVfc2V0X3JlZ19hZGRyICh0aGlzX2NhY2hlLCBTUEFSQzY0X0ZQUlNfUkVHTlVNLCBhZGRyICsgMjgpOwogCi0gIGFkZHIgPSBmcmFtZV91bndpbmRfcmVnaXN0ZXJfdW5zaWduZWQgKG5leHRfZnJhbWUsIFNQQVJDX1NQX1JFR05VTSk7CisgIGJhc2UgPSBmcmFtZV91bndpbmRfcmVnaXN0ZXJfdW5zaWduZWQgKG5leHRfZnJhbWUsIFNQQVJDX1NQX1JFR05VTSk7CisgIGlmIChiYXNlICYgMSkKKyAgICBiYXNlICs9IEJJQVM7CisKKyAgYWRkciA9IGdldF9mcmFtZV9tZW1vcnlfdW5zaWduZWQgKG5leHRfZnJhbWUsIHNwX2FkZHIsIDgpOwogICBpZiAoYWRkciAmIDEpCiAgICAgYWRkciArPSBCSUFTOwogCi0gIGJhc2UgPSBhZGRyOwogICBmb3IgKHJlZ251bSA9IFNQQVJDX0wwX1JFR05VTTsgcmVnbnVtIDw9IFNQQVJDX0k3X1JFR05VTTsgcmVnbnVtKyspCiAgICAgewogICAgICAgdHJhZF9mcmFtZV9zZXRfcmVnX2FkZHIgKHRoaXNfY2FjaGUsIHJlZ251bSwgYWRkcik7CkBAIC05NCwxNCArMTAyLDEwMyBAQAogICB0cmFkX2ZyYW1lX3NldF9pZCAodGhpc19jYWNoZSwgZnJhbWVfaWRfYnVpbGQgKGJhc2UsIGZ1bmMpKTsKIH0KIAwKKy8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiBhIHN5c3RlbSBjYWxsJ3MgYWx0ZXJuYXRpdmUgcmV0dXJuCisgICBhZGRyZXNzLiAgKi8KKworc3RhdGljIENPUkVfQUREUgorc3BhcmM2NF9saW51eF9zdGVwX3RyYXAgKHVuc2lnbmVkIGxvbmcgaW5zbikKK3sKKyAgaWYgKGluc24gPT0gMHg5MWQwMjA2ZCkKKyAgICB7CisgICAgICBVTE9OR0VTVCBzcDsKKworICAgICAgcmVnY2FjaGVfY29va2VkX3JlYWRfdW5zaWduZWQgKGN1cnJlbnRfcmVnY2FjaGUsCisJCQkJICAgICBTUEFSQ19TUF9SRUdOVU0sICZzcCk7CisgICAgICBpZiAoc3AgJiAxKQorCXNwICs9IEJJQVM7CisKKyAgICAgIC8qIFRoZSBrZXJuZWwgcHV0cyB0aGUgc2lncmV0dXJuIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2ssCisJIGFuZCB0aGlzIGlzIHdoZXJlIHRoZSBzaWduYWwgdW53aW5kaW5nIHN0YXRlIGlzIHRha2UgZnJvbQorCSB3aGVuIHJldHVybmluZyBmcm9tIGEgc2lnbmFsLgorCisJIEEgc2lnaW5mb190IHNpdHMgMTkyIGJ5dGVzIGZyb20gdGhlIGJhc2Ugb2YgdGhlIHN0YWNrLiAgVGhpcworCSBzaWdpbmZvX3QgaXMgMTI4IGJ5dGVzLCBhbmQgaXMgZm9sbG93ZWQgYnkgdGhlIHNpZ3JldHVybgorCSByZWdpc3RlciBzYXZlIGFyZWEuICBUaGUgc2F2ZWQgUEMgc2l0cyBhdCBhIDEzNiBieXRlIG9mZnNldAorCSBpbnRvIHRoZXJlLiAgKi8KKworICAgICAgcmV0dXJuIHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKHNwICsgMTkyICsgMTI4ICsgMTM2LCA4KTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisMCisKK2NvbnN0IHN0cnVjdCBzcGFyY19ncmVnc2V0IHNwYXJjNjRfbGludXhfY29yZV9ncmVnc2V0ID0KK3sKKyAgMzIgKiA4LAkJCS8qICV0c3RhdGUgKi8KKyAgMzMgKiA4LAkJCS8qICV0cGMgKi8KKyAgMzQgKiA4LAkJCS8qICV0bnBjICovCisgIDM1ICogOCwJCQkvKiAleSAqLworICAtMSwJCQkJLyogJXdpbSAqLworICAtMSwJCQkJLyogJXRiciAqLworICAxICogOCwJCQkvKiAlZzEgKi8KKyAgMTYgKiA4LAkJCS8qICVsMCAqLworICA4LAkJCQkvKiB5IHNpemUgKi8KK307CisMCisKK3N0YXRpYyB2b2lkCitzcGFyYzY0X2xpbnV4X3N1cHBseV9jb3JlX2dyZWdzZXQgKGNvbnN0IHN0cnVjdCByZWdzZXQgKnJlZ3NldCwKKwkJCQkgICBzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlLAorCQkJCSAgIGludCByZWdudW0sIGNvbnN0IHZvaWQgKmdyZWdzLCBzaXplX3QgbGVuKQoreworICBzcGFyYzY0X3N1cHBseV9ncmVnc2V0ICgmc3BhcmM2NF9saW51eF9jb3JlX2dyZWdzZXQsIHJlZ2NhY2hlLCByZWdudW0sIGdyZWdzKTsKK30KKworc3RhdGljIHZvaWQKK3NwYXJjNjRfbGludXhfY29sbGVjdF9jb3JlX2dyZWdzZXQgKGNvbnN0IHN0cnVjdCByZWdzZXQgKnJlZ3NldCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSwKKwkJCQkgICAgaW50IHJlZ251bSwgdm9pZCAqZ3JlZ3MsIHNpemVfdCBsZW4pCit7CisgIHNwYXJjNjRfY29sbGVjdF9ncmVnc2V0ICgmc3BhcmM2NF9saW51eF9jb3JlX2dyZWdzZXQsIHJlZ2NhY2hlLCByZWdudW0sIGdyZWdzKTsKK30KKworc3RhdGljIHZvaWQKK3NwYXJjNjRfbGludXhfc3VwcGx5X2NvcmVfZnByZWdzZXQgKGNvbnN0IHN0cnVjdCByZWdzZXQgKnJlZ3NldCwKKwkJCQkgICAgc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSwKKwkJCQkgICAgaW50IHJlZ251bSwgY29uc3Qgdm9pZCAqZnByZWdzLCBzaXplX3QgbGVuKQoreworICBzcGFyYzY0X3N1cHBseV9mcHJlZ3NldCAocmVnY2FjaGUsIHJlZ251bSwgZnByZWdzKTsKK30KKworc3RhdGljIHZvaWQKK3NwYXJjNjRfbGludXhfY29sbGVjdF9jb3JlX2ZwcmVnc2V0IChjb25zdCBzdHJ1Y3QgcmVnc2V0ICpyZWdzZXQsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlLAorCQkJCSAgICAgaW50IHJlZ251bSwgdm9pZCAqZnByZWdzLCBzaXplX3QgbGVuKQoreworICBzcGFyYzY0X2NvbGxlY3RfZnByZWdzZXQgKHJlZ2NhY2hlLCByZWdudW0sIGZwcmVncyk7Cit9CisKKwwKIAogc3RhdGljIHZvaWQKIHNwYXJjNjRfbGludXhfaW5pdF9hYmkgKHN0cnVjdCBnZGJhcmNoX2luZm8gaW5mbywgc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gpCiB7CiAgIHN0cnVjdCBnZGJhcmNoX3RkZXAgKnRkZXAgPSBnZGJhcmNoX3RkZXAgKGdkYmFyY2gpOwogCisgIHRkZXAtPmdyZWdzZXQgPSByZWdzZXRfYWxsb2MgKGdkYmFyY2gsIHNwYXJjNjRfbGludXhfc3VwcGx5X2NvcmVfZ3JlZ3NldCwKKwkJCQlzcGFyYzY0X2xpbnV4X2NvbGxlY3RfY29yZV9ncmVnc2V0KTsKKyAgdGRlcC0+c2l6ZW9mX2dyZWdzZXQgPSAyODg7CisKKyAgdGRlcC0+ZnByZWdzZXQgPSByZWdzZXRfYWxsb2MgKGdkYmFyY2gsIHNwYXJjNjRfbGludXhfc3VwcGx5X2NvcmVfZnByZWdzZXQsCisJCQkJIHNwYXJjNjRfbGludXhfY29sbGVjdF9jb3JlX2ZwcmVnc2V0KTsKKyAgdGRlcC0+c2l6ZW9mX2ZwcmVnc2V0ID0gMjgwOworCiAgIHRyYW1wX2ZyYW1lX3ByZXBlbmRfdW53aW5kZXIgKGdkYmFyY2gsICZzcGFyYzY0X2xpbnV4X3J0X3NpZ2ZyYW1lKTsKIAorICAvKiBIb29rIGluIHRoZSBEV0FSRiBDRkkgZnJhbWUgdW53aW5kZXIuICAqLworICBmcmFtZV91bndpbmRfYXBwZW5kX3NuaWZmZXIgKGdkYmFyY2gsIGR3YXJmMl9mcmFtZV9zbmlmZmVyKTsKKwogICBzcGFyYzY0X2luaXRfYWJpIChpbmZvLCBnZGJhcmNoKTsKIAogICAvKiBHTlUvTGludXggaGFzIFNWUjQtc3R5bGUgc2hhcmVkIGxpYnJhcmllcy4uLiAgKi8KQEAgLTExNiw2ICsyMTMsOSBAQAogICAvKiBFbmFibGUgVExTIHN1cHBvcnQuICAqLwogICBzZXRfZ2RiYXJjaF9mZXRjaF90bHNfbG9hZF9tb2R1bGVfYWRkcmVzcyAoZ2RiYXJjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2cjRfZmV0Y2hfb2JqZmlsZV9saW5rX21hcCk7CisKKyAgLyogTWFrZSBzdXJlIHdlIGNhbiBzaW5nbGUtc3RlcCBvdmVyIHNpZ25hbCByZXR1cm4gc3lzdGVtIGNhbGxzLiAgKi8KKyAgdGRlcC0+c3RlcF90cmFwID0gc3BhcmM2NF9saW51eF9zdGVwX3RyYXA7CiB9CiAMCiAKZGlmZiAtLWdpdCBhL2dkYi9zcGFyYzY0LXRkZXAuYyBiL2dkYi9zcGFyYzY0LXRkZXAuYwppbmRleCBkMDk4YmY5Li5hYjZkZmFiIDEwMDY0NAotLS0gYS9nZGIvc3BhcmM2NC10ZGVwLmMKKysrIGIvZ2RiL3NwYXJjNjQtdGRlcC5jCkBAIC0xMTA2LDcgKzExMDYsOCBAQAogCiBzdGF0aWMgdm9pZAogc3BhcmM2NF9kd2FyZjJfZnJhbWVfaW5pdF9yZWcgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLCBpbnQgcmVnbnVtLAotCQkJICAgICAgIHN0cnVjdCBkd2FyZjJfZnJhbWVfc3RhdGVfcmVnICpyZWcpCisJCQkgICAgICAgc3RydWN0IGR3YXJmMl9mcmFtZV9zdGF0ZV9yZWcgKnJlZywKKwkJCSAgICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqbmV4dF9mcmFtZSkKIHsKICAgc3dpdGNoIChyZWdudW0pCiAgICAgewpkaWZmIC0tZ2l0IGEvZ2RiL3N0YWNrLmMgYi9nZGIvc3RhY2suYwppbmRleCA0MzViYjBjLi5kMGJiYzg3IDEwMDY0NAotLS0gYS9nZGIvc3RhY2suYworKysgYi9nZGIvc3RhY2suYwpAQCAtNjEsOCArNjEsNiBAQAogCQkJIGVudW0gcHJpbnRfd2hhdCBwcmludF93aGF0LCAgaW50IHByaW50X2FyZ3MsCiAJCQkgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWwpOwogCi1zdGF0aWMgdm9pZCBzZXRfY3VycmVudF9zYWxfZnJvbV9mcmFtZSAoc3RydWN0IGZyYW1lX2luZm8gKiwgaW50KTsKLQogLyogWmVybyBtZWFucyBkbyB0aGluZ3Mgbm9ybWFsbHk7IHdlIGFyZSBpbnRlcmFjdGluZyBkaXJlY3RseSB3aXRoIHRoZQogICAgdXNlci4gIE9uZSBtZWFucyBwcmludCB0aGUgZnVsbCBmaWxlbmFtZSBhbmQgbGluZW51bWJlciB3aGVuIGEKICAgIGZyYW1lIGlzIHByaW50ZWQsIGFuZCBkbyBzbyBpbiBhIGZvcm1hdCBlbWFjczE4L2VtYWNzMTkuMjIgY2FuCkBAIC0zNzMsNyArMzcxLDcgQEAKICAgIEZSQU1FLCBpZiBwb3NzaWJsZS4gIFdoZW4gQ0VOVEVSIGlzIHRydWUsIGFkanVzdCBzbyB0aGUgcmVsZXZhbnQKICAgIGxpbmUgaXMgaW4gdGhlIGNlbnRlciBvZiB0aGUgbmV4dCAnbGlzdCcuICAqLwogCi1zdGF0aWMgdm9pZAordm9pZAogc2V0X2N1cnJlbnRfc2FsX2Zyb21fZnJhbWUgKHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSwgaW50IGNlbnRlcikKIHsKICAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CmRpZmYgLS1naXQgYS9nZGIvdGFyZ2V0LmMgYi9nZGIvdGFyZ2V0LmMKaW5kZXggZmJmYzU4YS4uNTJlNDUyNyAxMDA2NDQKLS0tIGEvZ2RiL3RhcmdldC5jCisrKyBiL2dkYi90YXJnZXQuYwpAQCAtMTExLDE1ICsxMTEsMTUgQEAKIAogc3RhdGljIHZvaWQgZGVidWdfdG9fZmlsZXNfaW5mbyAoc3RydWN0IHRhcmdldF9vcHMgKik7CiAKLXN0YXRpYyBpbnQgZGVidWdfdG9faW5zZXJ0X2JyZWFrcG9pbnQgKENPUkVfQUREUiwgZ2RiX2J5dGUgKik7CitzdGF0aWMgaW50IGRlYnVnX3RvX2luc2VydF9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKik7CiAKLXN0YXRpYyBpbnQgZGVidWdfdG9fcmVtb3ZlX2JyZWFrcG9pbnQgKENPUkVfQUREUiwgZ2RiX2J5dGUgKik7CitzdGF0aWMgaW50IGRlYnVnX3RvX3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKik7CiAKIHN0YXRpYyBpbnQgZGVidWdfdG9fY2FuX3VzZV9od19icmVha3BvaW50IChpbnQsIGludCwgaW50KTsKIAotc3RhdGljIGludCBkZWJ1Z190b19pbnNlcnRfaHdfYnJlYWtwb2ludCAoQ09SRV9BRERSLCBnZGJfYnl0ZSAqKTsKK3N0YXRpYyBpbnQgZGVidWdfdG9faW5zZXJ0X2h3X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqKTsKIAotc3RhdGljIGludCBkZWJ1Z190b19yZW1vdmVfaHdfYnJlYWtwb2ludCAoQ09SRV9BRERSLCBnZGJfYnl0ZSAqKTsKK3N0YXRpYyBpbnQgZGVidWdfdG9fcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqKTsKIAogc3RhdGljIGludCBkZWJ1Z190b19pbnNlcnRfd2F0Y2hwb2ludCAoQ09SRV9BRERSLCBpbnQsIGludCk7CiAKQEAgLTUxNSwxMCArNTE1LDEwIEBACiAJICAgIChpbnQgKCopIChpbnQsIGludCwgaW50KSkKIAkgICAgcmV0dXJuX3plcm8pOwogICBkZV9mYXVsdCAodG9faW5zZXJ0X2h3X2JyZWFrcG9pbnQsCi0JICAgIChpbnQgKCopIChDT1JFX0FERFIsIGdkYl9ieXRlICopKQorCSAgICAoaW50ICgqKSAoc3RydWN0IGJwX3RhcmdldF9pbmZvICopKQogCSAgICByZXR1cm5fbWludXNfb25lKTsKICAgZGVfZmF1bHQgKHRvX3JlbW92ZV9od19icmVha3BvaW50LAotCSAgICAoaW50ICgqKSAoQ09SRV9BRERSLCBnZGJfYnl0ZSAqKSkKKwkgICAgKGludCAoKikgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqKSkKIAkgICAgcmV0dXJuX21pbnVzX29uZSk7CiAgIGRlX2ZhdWx0ICh0b19pbnNlcnRfd2F0Y2hwb2ludCwKIAkgICAgKGludCAoKikgKENPUkVfQUREUiwgaW50LCBpbnQpKQpAQCAtMjA3NSwyOSArMjA3NSwyOSBAQAogfQogCiBzdGF0aWMgaW50Ci1kZWJ1Z190b19pbnNlcnRfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpzYXZlKQorZGVidWdfdG9faW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewogICBpbnQgcmV0dmFsOwogCi0gIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b19pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgc2F2ZSk7CisgIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b19pbnNlcnRfYnJlYWtwb2ludCAoYnBfdGd0KTsKIAogICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCiAJCSAgICAgICJ0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKDB4JWx4LCB4eHgpID0gJWxkXG4iLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGJwX3RndC0+cGxhY2VkX2FkZHJlc3MsCiAJCSAgICAgICh1bnNpZ25lZCBsb25nKSByZXR2YWwpOwogICByZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50Ci1kZWJ1Z190b19yZW1vdmVfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpzYXZlKQorZGVidWdfdG9fcmVtb3ZlX2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewogICBpbnQgcmV0dmFsOwogCi0gIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b19yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgc2F2ZSk7CisgIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b19yZW1vdmVfYnJlYWtwb2ludCAoYnBfdGd0KTsKIAogICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCiAJCSAgICAgICJ0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQgKDB4JWx4LCB4eHgpID0gJWxkXG4iLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGJwX3RndC0+cGxhY2VkX2FkZHJlc3MsCiAJCSAgICAgICh1bnNpZ25lZCBsb25nKSByZXR2YWwpOwogICByZXR1cm4gcmV0dmFsOwogfQpAQCAtMjE2MSwyOSArMjE2MSwyOSBAQAogfQogCiBzdGF0aWMgaW50Ci1kZWJ1Z190b19pbnNlcnRfaHdfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpzYXZlKQorZGVidWdfdG9faW5zZXJ0X2h3X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewogICBpbnQgcmV0dmFsOwogCi0gIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b19pbnNlcnRfaHdfYnJlYWtwb2ludCAoYWRkciwgc2F2ZSk7CisgIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b19pbnNlcnRfaHdfYnJlYWtwb2ludCAoYnBfdGd0KTsKIAogICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCiAJCSAgICAgICJ0YXJnZXRfaW5zZXJ0X2h3X2JyZWFrcG9pbnQgKDB4JWx4LCB4eHgpID0gJWxkXG4iLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGJwX3RndC0+cGxhY2VkX2FkZHJlc3MsCiAJCSAgICAgICh1bnNpZ25lZCBsb25nKSByZXR2YWwpOwogICByZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50Ci1kZWJ1Z190b19yZW1vdmVfaHdfYnJlYWtwb2ludCAoQ09SRV9BRERSIGFkZHIsIGdkYl9ieXRlICpzYXZlKQorZGVidWdfdG9fcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBfdGd0KQogewogICBpbnQgcmV0dmFsOwogCi0gIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b19yZW1vdmVfaHdfYnJlYWtwb2ludCAoYWRkciwgc2F2ZSk7CisgIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b19yZW1vdmVfaHdfYnJlYWtwb2ludCAoYnBfdGd0KTsKIAogICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCiAJCSAgICAgICJ0YXJnZXRfcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKDB4JWx4LCB4eHgpID0gJWxkXG4iLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGJwX3RndC0+cGxhY2VkX2FkZHJlc3MsCiAJCSAgICAgICh1bnNpZ25lZCBsb25nKSByZXR2YWwpOwogICByZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZ2RiL3RhcmdldC5oIGIvZ2RiL3RhcmdldC5oCmluZGV4IGI4MDRiMDUuLjdkZWNmZDcgMTAwNjQ0Ci0tLSBhL2dkYi90YXJnZXQuaAorKysgYi9nZGIvdGFyZ2V0LmgKQEAgLTMwLDYgKzMwLDcgQEAKIHN0cnVjdCB1aV9maWxlOwogc3RydWN0IG1lbV9hdHRyaWI7CiBzdHJ1Y3QgdGFyZ2V0X29wczsKK3N0cnVjdCBicF90YXJnZXRfaW5mbzsKIAogLyogVGhpcyBpbmNsdWRlIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIG1haW4gcGFydAogICAgb2YgdGhlIGRlYnVnZ2VyLCBhbmQgdGhlIHBhcnQgd2hpY2ggaXMgdGFyZ2V0LXNwZWNpZmljLCBvcgpAQCAtMzM2LDExICszMzcsMTEgQEAKIAkJCQkgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0KTsKIAogICAgIHZvaWQgKCp0b19maWxlc19pbmZvKSAoc3RydWN0IHRhcmdldF9vcHMgKik7Ci0gICAgaW50ICgqdG9faW5zZXJ0X2JyZWFrcG9pbnQpIChDT1JFX0FERFIsIGdkYl9ieXRlICopOwotICAgIGludCAoKnRvX3JlbW92ZV9icmVha3BvaW50KSAoQ09SRV9BRERSLCBnZGJfYnl0ZSAqKTsKKyAgICBpbnQgKCp0b19pbnNlcnRfYnJlYWtwb2ludCkgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqKTsKKyAgICBpbnQgKCp0b19yZW1vdmVfYnJlYWtwb2ludCkgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqKTsKICAgICBpbnQgKCp0b19jYW5fdXNlX2h3X2JyZWFrcG9pbnQpIChpbnQsIGludCwgaW50KTsKLSAgICBpbnQgKCp0b19pbnNlcnRfaHdfYnJlYWtwb2ludCkgKENPUkVfQUREUiwgZ2RiX2J5dGUgKik7Ci0gICAgaW50ICgqdG9fcmVtb3ZlX2h3X2JyZWFrcG9pbnQpIChDT1JFX0FERFIsIGdkYl9ieXRlICopOworICAgIGludCAoKnRvX2luc2VydF9od19icmVha3BvaW50KSAoc3RydWN0IGJwX3RhcmdldF9pbmZvICopOworICAgIGludCAoKnRvX3JlbW92ZV9od19icmVha3BvaW50KSAoc3RydWN0IGJwX3RhcmdldF9pbmZvICopOwogICAgIGludCAoKnRvX3JlbW92ZV93YXRjaHBvaW50KSAoQ09SRV9BRERSLCBpbnQsIGludCk7CiAgICAgaW50ICgqdG9faW5zZXJ0X3dhdGNocG9pbnQpIChDT1JFX0FERFIsIGludCwgaW50KTsKICAgICBpbnQgKCp0b19zdG9wcGVkX2J5X3dhdGNocG9pbnQpICh2b2lkKTsKQEAgLTYxMiwyMiArNjEzLDE3IEBACiAjZGVmaW5lCXRhcmdldF9maWxlc19pbmZvKCkJXAogICAgICAoKmN1cnJlbnRfdGFyZ2V0LnRvX2ZpbGVzX2luZm8pICgmY3VycmVudF90YXJnZXQpCiAKLS8qIEluc2VydCBhIGJyZWFrcG9pbnQgYXQgYWRkcmVzcyBBRERSIGluIHRoZSB0YXJnZXQgbWFjaGluZS4gIFNBVkUgaXMKLSAgIGEgcG9pbnRlciB0byBtZW1vcnkgYWxsb2NhdGVkIGZvciBzYXZpbmcgdGhlIHRhcmdldCBjb250ZW50cy4gIEl0Ci0gICBpcyBndWFyYW50ZWVkIGJ5IHRoZSBjYWxsZXIgdG8gYmUgbG9uZyBlbm91Z2ggdG8gc2F2ZSB0aGUgbnVtYmVyIG9mCi0gICBicmVha3BvaW50IGJ5dGVzIGluZGljYXRlZCBieSBCUkVBS1BPSU5UX0ZST01fUEMuICBSZXN1bHQgaXMgMCBmb3IKLSAgIHN1Y2Nlc3MsIG9yIGFuIGVycm5vIHZhbHVlLiAgKi8KKy8qIEluc2VydCBhIGJyZWFrcG9pbnQgYXQgYWRkcmVzcyBCUF9UR1QtPnBsYWNlZF9hZGRyZXNzIGluIHRoZSB0YXJnZXQKKyAgIG1hY2hpbmUuICBSZXN1bHQgaXMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJybm8gdmFsdWUuICAqLwogCi0jZGVmaW5lCXRhcmdldF9pbnNlcnRfYnJlYWtwb2ludChhZGRyLCBzYXZlKQlcCi0gICAgICgqY3VycmVudF90YXJnZXQudG9faW5zZXJ0X2JyZWFrcG9pbnQpIChhZGRyLCBzYXZlKQorI2RlZmluZQl0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQoYnBfdGd0KQlcCisgICAgICgqY3VycmVudF90YXJnZXQudG9faW5zZXJ0X2JyZWFrcG9pbnQpIChicF90Z3QpCiAKLS8qIFJlbW92ZSBhIGJyZWFrcG9pbnQgYXQgYWRkcmVzcyBBRERSIGluIHRoZSB0YXJnZXQgbWFjaGluZS4KLSAgIFNBVkUgaXMgYSBwb2ludGVyIHRvIHRoZSBzYW1lIHNhdmUgYXJlYQotICAgdGhhdCB3YXMgcHJldmlvdXNseSBwYXNzZWQgdG8gdGFyZ2V0X2luc2VydF9icmVha3BvaW50LgotICAgUmVzdWx0IGlzIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm5vIHZhbHVlLiAgKi8KKy8qIFJlbW92ZSBhIGJyZWFrcG9pbnQgYXQgYWRkcmVzcyBCUF9UR1QtPnBsYWNlZF9hZGRyZXNzIGluIHRoZSB0YXJnZXQKKyAgIG1hY2hpbmUuICBSZXN1bHQgaXMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJybm8gdmFsdWUuICAqLwogCi0jZGVmaW5lCXRhcmdldF9yZW1vdmVfYnJlYWtwb2ludChhZGRyLCBzYXZlKQlcCi0gICAgICgqY3VycmVudF90YXJnZXQudG9fcmVtb3ZlX2JyZWFrcG9pbnQpIChhZGRyLCBzYXZlKQorI2RlZmluZQl0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQoYnBfdGd0KQlcCisgICAgICgqY3VycmVudF90YXJnZXQudG9fcmVtb3ZlX2JyZWFrcG9pbnQpIChicF90Z3QpCiAKIC8qIEluaXRpYWxpemUgdGhlIHRlcm1pbmFsIHNldHRpbmdzIHdlIHJlY29yZCBmb3IgdGhlIGluZmVyaW9yLAogICAgYmVmb3JlIHdlIGFjdHVhbGx5IHJ1biB0aGUgaW5mZXJpb3IuICAqLwpAQCAtMTA1NywxMSArMTA1MywxMSBAQAogI2VuZGlmCiAKICNpZm5kZWYgdGFyZ2V0X2luc2VydF9od19icmVha3BvaW50Ci0jZGVmaW5lIHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludChhZGRyLCBzYXZlKSBcCi0gICAgICgqY3VycmVudF90YXJnZXQudG9faW5zZXJ0X2h3X2JyZWFrcG9pbnQpIChhZGRyLCBzYXZlKQorI2RlZmluZSB0YXJnZXRfaW5zZXJ0X2h3X2JyZWFrcG9pbnQoYnBfdGd0KSBcCisgICAgICgqY3VycmVudF90YXJnZXQudG9faW5zZXJ0X2h3X2JyZWFrcG9pbnQpIChicF90Z3QpCiAKLSNkZWZpbmUgdGFyZ2V0X3JlbW92ZV9od19icmVha3BvaW50KGFkZHIsIHNhdmUpIFwKLSAgICAgKCpjdXJyZW50X3RhcmdldC50b19yZW1vdmVfaHdfYnJlYWtwb2ludCkgKGFkZHIsIHNhdmUpCisjZGVmaW5lIHRhcmdldF9yZW1vdmVfaHdfYnJlYWtwb2ludChicF90Z3QpIFwKKyAgICAgKCpjdXJyZW50X3RhcmdldC50b19yZW1vdmVfaHdfYnJlYWtwb2ludCkgKGJwX3RndCkKICNlbmRpZgogCiBleHRlcm4gaW50IHRhcmdldF9zdG9wcGVkX2RhdGFfYWRkcmVzc19wIChzdHJ1Y3QgdGFyZ2V0X29wcyAqKTsKQEAgLTExNDIsMTMgKzExMzgsMTMgQEAKIAogLyogRnJvbSBtZW0tYnJlYWsuYyAqLwogCi1leHRlcm4gaW50IG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoQ09SRV9BRERSLCBnZGJfYnl0ZSAqKTsKK2V4dGVybiBpbnQgbWVtb3J5X3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKik7CiAKLWV4dGVybiBpbnQgbWVtb3J5X2luc2VydF9icmVha3BvaW50IChDT1JFX0FERFIsIGdkYl9ieXRlICopOworZXh0ZXJuIGludCBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqKTsKIAotZXh0ZXJuIGludCBkZWZhdWx0X21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoQ09SRV9BRERSLCBnZGJfYnl0ZSAqKTsKK2V4dGVybiBpbnQgZGVmYXVsdF9tZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqKTsKIAotZXh0ZXJuIGludCBkZWZhdWx0X21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAoQ09SRV9BRERSLCBnZGJfYnl0ZSAqKTsKK2V4dGVybiBpbnQgZGVmYXVsdF9tZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqKTsKIAogCiAvKiBGcm9tIHRhcmdldC5jICovCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL0NoYW5nZUxvZyBiL2dkYi90ZXN0c3VpdGUvQ2hhbmdlTG9nCmluZGV4IDE2ZDY2YzcuLjczOGVlNjkgMTAwNjQ0Ci0tLSBhL2dkYi90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyBiL2dkYi90ZXN0c3VpdGUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAKKzIwMDYtMDQtMDcgIEFuZHJldyBTdHViYnMgIDxhbmRyZXcuc3R1YmJzQHN0LmNvbT4KKworCSogZ2RiLmJhc2UvY29tbWFuZHMuZXhwIChyZWN1cnNpdmVfc291cmNlX3Rlc3QpOiBOZXcgdGVzdC4KKworMjAwNi0wNC0wNCAgRGF2aWQgUy4gTWlsbGVyICA8ZGF2ZW1Ac3Vuc2V0LmRhdmVtbG9mdC5uZXQ+CisKKwkqIGdkYi5iYXNlL2Zsb2F0LmV4cDogQWRkIHBhdHRlcm4gZm9yIHNwYXJjIHRhcmdldHMuCisKKzIwMDYtMDMtMzAgIERhbmllbCBKYWNvYm93aXR6ICA8ZGFuQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIGdkYi5iYXNlL2NvbW1hbmRzLmV4cCAoc3RyYXlfYXJnMF90ZXN0KTogTmV3IHRlc3QuCisKKzIwMDYtMDMtMzAgIFBhdWwgQnJvb2sgIDxwYXVsQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIGdkYi5taS9taS11bnRpbC5leHA6IGtmYWlsIGJyb2tlbiB1bnRpbCBjb21tYW5kLgorCSogZ2RiLm1pL21pMi11bnRpbC5leHA6IERpdHRvLgorCiAyMDA2LTAzLTI3ICBOaWNrIFJvYmVydHMgIDxuaWNrcm9iQHNuYXAubmV0Lm56PgogCiAJKiBnZGIubWkvbWktdmFyLWNoaWxkLWYuZXhwLCBnZGIubWkvYXJyYXkuZjogTmV3IGZpbGVzLgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb21tYW5kcy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbW1hbmRzLmV4cAppbmRleCBlYWJmODVlLi5lOTgxZjgxIDEwMDY0NAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbW1hbmRzLmV4cAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbW1hbmRzLmV4cApAQCAtMSw1ICsxLDUgQEAKICMgICBDb3B5cmlnaHQgMTk4OCwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwKLSMgICAyMDAxLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKICMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTU2Myw3ICs1NjMsNjAgQEAKIAl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHJ1biBmYWN0b3JpYWwgdW50aWwgdGVtcG9yYXJ5IGJyZWFrcG9pbnQiIH0KICAgICB9CiB9Ci0gIAorCisjIFRlc3QgdGhhdCBHREIgY2FuIGhhbmRsZSAkYXJnMCBvdXRzaWRlIG9mIHVzZXIgZnVuY3Rpb25zIHdpdGhvdXQKKyMgY3Jhc2hpbmcuCitwcm9jIHN0cmF5X2FyZzBfdGVzdCB7IH0geworICAgIGdkYl90ZXN0ICJwcmludCBcJGFyZzAiIFwKKwkiXFxcJFxbMC05XF0qID0gdm9pZCIgXAorCSJzdHJheV9hcmcwX3Rlc3QgIzEiCisKKyAgICBnZGJfdGVzdCAiaWYgMSA9PSAxXG5wcmludCBcJGFyZzBcbmVuZCIgXAorCSJcXFwkXFswLTlcXSogPSB2b2lkIiBcCisJInN0cmF5X2FyZzBfdGVzdCAjMiIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJGFyZzAgPSAxIiBcCisJIlxcXCRcWzAtOVxdKiA9IDEiIFwKKwkic3RyYXlfYXJnMF90ZXN0ICMzIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkYXJnMCIgXAorCSJcXFwkXFswLTlcXSogPSAxIiBcCisJInN0cmF5X2FyZzBfdGVzdCAjNCIKK30KKworIyBUZXN0IHRoYXQgR0RCIGNhbiBoYW5kbGUgYXJndW1lbnRzIHdoZW4gc291cmNpbmcgZmlsZXMgcmVjdXJzaXZlbHkuCisjIElmIHRoZSBhcmd1bWVudHMgYXJlIG92ZXJ3cml0dGVuIHdpdGggIyMjIyMjIyB0aGVuIHRoZSB0ZXN0IGhhcyBmYWlsZWQuCitwcm9jIHJlY3Vyc2l2ZV9zb3VyY2VfdGVzdCB7fSB7CisgICAgc2V0IGZkIFtvcGVuICJmaWxlMSIgd10KKyAgICBwdXRzICRmZCBcCit7c291cmNlIGZpbGUyCithYmNkZWYgcXdlcnR5fQorICAgIGNsb3NlICRmZAorCisgICAgc2V0IGZkIFtvcGVuICJmaWxlMiIgd10KKyAgICBwdXRzICRmZCBcCit7ZGVmaW5lIGFiY2RlZgorICBlY2hvIDE6IDw8PCRhcmcwPj4+XG4KKyAgc291cmNlIGZpbGUzCisgIGVjaG8gMjogPDw8JGFyZzA+Pj5cbgorZW5kfQorICAgIGNsb3NlICRmZAorCisgICAgc2V0IGZkIFtvcGVuICJmaWxlMyIgd10KKyAgICBwdXRzICRmZCBcCisiZWNobyBpbiBmaWxlM1xcbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisgICAgY2xvc2UgJGZkCisKKyAgICBnZGJfdGVzdCAic291cmNlIGZpbGUxIiBcCisJIjE6IDw8PHF3ZXJ0eT4+PlxbXHJcbl0raW4gZmlsZTNcW1xyXG5dKzI6IDw8PHF3ZXJ0eT4+PiIgXAorCSJyZWN1cnNpdmUgc291cmNlIHRlc3QiCisKKyAgICBmaWxlIGRlbGV0ZSBmaWxlMQorICAgIGZpbGUgZGVsZXRlIGZpbGUyCisgICAgZmlsZSBkZWxldGUgZmlsZTMKK30KKwogZ2RidmFyX3NpbXBsZV9pZl90ZXN0CiBnZGJ2YXJfc2ltcGxlX3doaWxlX3Rlc3QKIGdkYnZhcl9jb21wbGV4X2lmX3doaWxlX3Rlc3QKQEAgLTU3OSwzICs2MzIsNSBAQAogZGVwcmVjYXRlZF9jb21tYW5kX3Rlc3QKIGJwX2RlbGV0ZWRfaW5fY29tbWFuZF90ZXN0CiB0ZW1wb3JhcnlfYnJlYWtwb2ludF9jb21tYW5kcworc3RyYXlfYXJnMF90ZXN0CityZWN1cnNpdmVfc291cmNlX3Rlc3QKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZmxvYXQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9mbG9hdC5leHAKaW5kZXggYTgxNGQ1Ny4uMzFmOTg5MCAxMDA2NDQKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9mbG9hdC5leHAKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9mbG9hdC5leHAKQEAgLTgxLDYgKzgxLDggQEAKICAgICB9CiB9IGVsc2VpZiBbaXN0YXJnZXQgImhwcGEqLSoiXSB0aGVuIHsKICAgICBnZGJfdGVzdCAiaW5mbyBmbG9hdCIgImZyNC4qZnI0Ui4qZnIzMVIuKiIgImluZm8gZmxvYXQiCit9IGVsc2VpZiBbaXN0YXJnZXQgInNwYXJjKi0qLSoiXSB0aGVuIHsKKyAgICBnZGJfdGVzdCAiaW5mbyBmbG9hdCIgImYwLipmMS4qZjMxLipkMC4qZDMwLioiICJpbmZvIGZsb2F0IgogfSBlbHNlIHsKICAgICBnZGJfdGVzdCAiaW5mbyBmbG9hdCIgIk5vIGZsb2F0aW5nLnBvaW50IGluZm8gYXZhaWxhYmxlIGZvciB0aGlzIHByb2Nlc3Nvci4iICJpbmZvIGZsb2F0ICh1bmtub3duIHRhcmdldCkiCiB9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5taS9taS11bnRpbC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5taS9taS11bnRpbC5leHAKaW5kZXggZWI5MGQwZC4uZmY2ODZhZiAxMDA2NDQKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIubWkvbWktdW50aWwuZXhwCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLm1pL21pLXVudGlsLmV4cApAQCAtODEsNiArODEsOSBAQAogCS1yZSAiMTExXFxecnVubmluZ1xyXG4ke21pX2dkYl9wcm9tcHR9MTExXFwqc3RvcHBlZCxyZWFzb249XCJlbmQtc3RlcHBpbmctcmFuZ2VcIix0aHJlYWQtaWQ9XCJcWzAxXF1cIixmcmFtZT1ce2FkZHI9XCIkaGV4XCIsZnVuYz1cImZvb1wiLGFyZ3M9XFxcW1xcXF0sZmlsZT1cIi4qdW50aWwuY1wiLGZ1bGxuYW1lPVwiJHtmdWxsbmFtZV9zeW50YXh9JHtzcmNmaWxlfVwiLGxpbmU9XCIxMlwiXH1cclxuJG1pX2dkYl9wcm9tcHQkIiB7CiAJICAgIHBhc3MgInVudGlsIGFmdGVyIHdoaWxlIGxvb3AiCiAJfQorCS1yZSAiMTExXFxecnVubmluZ1xyXG4ke21pX2dkYl9wcm9tcHR9MTExXFwqc3RvcHBlZCxyZWFzb249XCJlbmQtc3RlcHBpbmctcmFuZ2VcIix0aHJlYWQtaWQ9XCJcWzAxXF1cIixmcmFtZT1ce2FkZHI9XCIkaGV4XCIsZnVuYz1cImZvb1wiLGFyZ3M9XFxcW1xcXF0sZmlsZT1cIi4qdW50aWwuY1wiLGZ1bGxuYW1lPVwiJHtmdWxsbmFtZV9zeW50YXh9JHtzcmNmaWxlfVwiLGxpbmU9XCI5XCJcfVxyXG4kbWlfZ2RiX3Byb21wdCQiIHsKKwkgICAga2ZhaWwgZ2RiLzIxMDQgInVudGlsIGFmdGVyIHdoaWxlIGxvb3AgKHdlbnQgYmFja3dhcmRzKSIKKwl9CiAJdGltZW91dCB7CiAJICAgIGZhaWwgInVudGlsIGFmdGVyIHdoaWxlIGxvb3AgKHRpbWVvdXQpIgogCX0KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLm1pL21pMi11bnRpbC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5taS9taTItdW50aWwuZXhwCmluZGV4IGY1ZDk0OTEuLjc2MGE0YTIgMTAwNjQ0Ci0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLm1pL21pMi11bnRpbC5leHAKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIubWkvbWkyLXVudGlsLmV4cApAQCAtODIsNiArODIsOSBAQAogCS1yZSAiMTExXFxecnVubmluZ1xyXG4ke21pX2dkYl9wcm9tcHR9MTExXFwqc3RvcHBlZCxyZWFzb249XCJlbmQtc3RlcHBpbmctcmFuZ2VcIix0aHJlYWQtaWQ9XCJcWzAxXF1cIixmcmFtZT1ce2FkZHI9XCIkaGV4XCIsZnVuYz1cImZvb1wiLGFyZ3M9XFxcW1xcXF0sZmlsZT1cIi4qdW50aWwuY1wiLGZ1bGxuYW1lPVwiJHtmdWxsbmFtZV9zeW50YXh9JHtzcmNmaWxlfVwiLGxpbmU9XCIxMlwiXH1cclxuJG1pX2dkYl9wcm9tcHQkIiB7CiAJICAgIHBhc3MgInVudGlsIGFmdGVyIHdoaWxlIGxvb3AiCiAJfQorCS1yZSAiMTExXFxecnVubmluZ1xyXG4ke21pX2dkYl9wcm9tcHR9MTExXFwqc3RvcHBlZCxyZWFzb249XCJlbmQtc3RlcHBpbmctcmFuZ2VcIix0aHJlYWQtaWQ9XCJcWzAxXF1cIixmcmFtZT1ce2FkZHI9XCIkaGV4XCIsZnVuYz1cImZvb1wiLGFyZ3M9XFxcW1xcXF0sZmlsZT1cIi4qdW50aWwuY1wiLGZ1bGxuYW1lPVwiJHtmdWxsbmFtZV9zeW50YXh9JHtzcmNmaWxlfVwiLGxpbmU9XCI5XCJcfVxyXG4kbWlfZ2RiX3Byb21wdCQiIHsKKwkgICAga2ZhaWwgZ2RiLzIxMDQgInVudGlsIGFmdGVyIHdoaWxlIGxvb3AgKHdlbnQgYmFja3dhcmRzKSIKKwl9CiAJdGltZW91dCB7CiAJICAgIGZhaWwgInVudGlsIGFmdGVyIHdoaWxlIGxvb3AgKHRpbWVvdXQpIgogCX0KZGlmZiAtLWdpdCBhL2dkYi90cmFjZXBvaW50LmMgYi9nZGIvdHJhY2Vwb2ludC5jCmluZGV4IDRiOTExNzIuLjg0ODRkYWYgMTAwNjQ0Ci0tLSBhL2dkYi90cmFjZXBvaW50LmMKKysrIGIvZ2RiL3RyYWNlcG9pbnQuYwpAQCAtMTk0LDEzICsxOTQsMTUgQEAKIAogLyogVXRpbGl0eTogd2FpdCBmb3IgcmVwbHkgZnJvbSBzdHViLCB3aGlsZSBhY2NlcHRpbmcgIk8iIHBhY2tldHMuICAqLwogc3RhdGljIGNoYXIgKgotcmVtb3RlX2dldF9ub2lzeV9yZXBseSAoY2hhciAqYnVmLAotCQkJbG9uZyBzaXplb2ZfYnVmKQorcmVtb3RlX2dldF9ub2lzeV9yZXBseSAoY2hhciAqKmJ1Zl9wLAorCQkJbG9uZyAqc2l6ZW9mX2J1ZikKIHsKICAgZG8JCQkJLyogTG9vcCBvbiByZXBseSBmcm9tIHJlbW90ZSBzdHViLiAgKi8KICAgICB7CisgICAgICBjaGFyICpidWY7CiAgICAgICBRVUlUOwkJCS8qIGFsbG93IHVzZXIgdG8gYmFpbCBvdXQgd2l0aCBeQyAqLwotICAgICAgZ2V0cGt0IChidWYsIHNpemVvZl9idWYsIDApOworICAgICAgZ2V0cGt0IChidWZfcCwgc2l6ZW9mX2J1ZiwgMCk7CisgICAgICBidWYgPSAqYnVmX3A7CiAgICAgICBpZiAoYnVmWzBdID09IDApCiAJZXJyb3IgKF8oIlRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgY29tbWFuZC4iKSk7CiAgICAgICBlbHNlIGlmIChidWZbMF0gPT0gJ0UnKQpAQCAtMTcwMCw3ICsxNzAyLDggQEAKICAgY29sbGVjdC0+bmV4dF9hZXhwcl9lbHQrKzsKIH0KIAotc3RhdGljIGNoYXIgdGFyZ2V0X2J1ZlsyMDQ4XTsKK3N0YXRpYyBjaGFyICp0YXJnZXRfYnVmOworc3RhdGljIGxvbmcgdGFyZ2V0X2J1Zl9zaXplOwogCiAvKiBTZXQgInRyYW5zcGFyZW50IiBtZW1vcnkgcmFuZ2VzCiAKQEAgLTE3NDIsNyArMTc0NSw3IEBACiAgIGlmIChhbnlzZWNzKQogICAgIHsKICAgICAgIHB1dHBrdCAodGFyZ2V0X2J1Zik7Ci0gICAgICBnZXRwa3QgKHRhcmdldF9idWYsIHNpemVvZiAodGFyZ2V0X2J1ZiksIDApOworICAgICAgZ2V0cGt0ICgmdGFyZ2V0X2J1ZiwgJnRhcmdldF9idWZfc2l6ZSwgMCk7CiAgICAgfQogfQogCkBAIC0xNzY4LDcgKzE3NzEsNyBAQAogICBpZiAodGFyZ2V0X2lzX3JlbW90ZSAoKSkKICAgICB7CiAgICAgICBwdXRwa3QgKCJRVGluaXQiKTsKLSAgICAgIHJlbW90ZV9nZXRfbm9pc3lfcmVwbHkgKHRhcmdldF9idWYsIHNpemVvZiAodGFyZ2V0X2J1ZikpOworICAgICAgcmVtb3RlX2dldF9ub2lzeV9yZXBseSAoJnRhcmdldF9idWYsICZ0YXJnZXRfYnVmX3NpemUpOwogICAgICAgaWYgKHN0cmNtcCAodGFyZ2V0X2J1ZiwgIk9LIikpCiAJZXJyb3IgKF8oIlRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgY29tbWFuZC4iKSk7CiAKQEAgLTE3ODUsNyArMTc4OCw3IEBACiAJaWYgKHQtPmFjdGlvbnMpCiAJICBzdHJjYXQgKGJ1ZiwgIi0iKTsKIAlwdXRwa3QgKGJ1Zik7Ci0JcmVtb3RlX2dldF9ub2lzeV9yZXBseSAodGFyZ2V0X2J1Ziwgc2l6ZW9mICh0YXJnZXRfYnVmKSk7CisJcmVtb3RlX2dldF9ub2lzeV9yZXBseSAoJnRhcmdldF9idWYsICZ0YXJnZXRfYnVmX3NpemUpOwogCWlmIChzdHJjbXAgKHRhcmdldF9idWYsICJPSyIpKQogCSAgZXJyb3IgKF8oIlRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRyYWNlcG9pbnRzLiIpKTsKIApAQCAtMTgwOSw4ICsxODEyLDggQEAKIAkJCSAgICAgKCh0ZHBfYWN0aW9uc1tuZHggKyAxXSB8fCBzdGVwcGluZ19hY3Rpb25zKQogCQkJICAgICAgPyAnLScgOiAwKSk7CiAJCSAgICBwdXRwa3QgKGJ1Zik7Ci0JCSAgICByZW1vdGVfZ2V0X25vaXN5X3JlcGx5ICh0YXJnZXRfYnVmLCAKLQkJCQkJICAgIHNpemVvZiAodGFyZ2V0X2J1ZikpOworCQkgICAgcmVtb3RlX2dldF9ub2lzeV9yZXBseSAoJnRhcmdldF9idWYsCisJCQkJCSAgICAmdGFyZ2V0X2J1Zl9zaXplKTsKIAkJICAgIGlmIChzdHJjbXAgKHRhcmdldF9idWYsICJPSyIpKQogCQkgICAgICBlcnJvciAoXygiRXJyb3Igb24gdGFyZ2V0IHdoaWxlIHNldHRpbmcgdHJhY2Vwb2ludHMuIikpOwogCQkgIH0KQEAgLTE4MjYsOCArMTgyOSw4IEBACiAJCQkgICAgIHN0ZXBwaW5nX2FjdGlvbnNbbmR4XSwKIAkJCSAgICAgKHN0ZXBwaW5nX2FjdGlvbnNbbmR4ICsgMV0gPyAiLSIgOiAiIikpOwogCQkgICAgcHV0cGt0IChidWYpOwotCQkgICAgcmVtb3RlX2dldF9ub2lzeV9yZXBseSAodGFyZ2V0X2J1ZiwgCi0JCQkJCSAgICBzaXplb2YgKHRhcmdldF9idWYpKTsKKwkJICAgIHJlbW90ZV9nZXRfbm9pc3lfcmVwbHkgKCZ0YXJnZXRfYnVmLAorCQkJCQkgICAgJnRhcmdldF9idWZfc2l6ZSk7CiAJCSAgICBpZiAoc3RyY21wICh0YXJnZXRfYnVmLCAiT0siKSkKIAkJICAgICAgZXJyb3IgKF8oIkVycm9yIG9uIHRhcmdldCB3aGlsZSBzZXR0aW5nIHRyYWNlcG9pbnRzLiIpKTsKIAkJICB9CkBAIC0xODQwLDcgKzE4NDMsNyBAQAogICAgICAgcmVtb3RlX3NldF90cmFuc3BhcmVudF9yYW5nZXMgKCk7CiAgICAgICAvKiBOb3cgaW5zZXJ0IHRyYXBzIGFuZCBiZWdpbiBjb2xsZWN0aW5nIGRhdGEuICAqLwogICAgICAgcHV0cGt0ICgiUVRTdGFydCIpOwotICAgICAgcmVtb3RlX2dldF9ub2lzeV9yZXBseSAodGFyZ2V0X2J1Ziwgc2l6ZW9mICh0YXJnZXRfYnVmKSk7CisgICAgICByZW1vdGVfZ2V0X25vaXN5X3JlcGx5ICgmdGFyZ2V0X2J1ZiwgJnRhcmdldF9idWZfc2l6ZSk7CiAgICAgICBpZiAoc3RyY21wICh0YXJnZXRfYnVmLCAiT0siKSkKIAllcnJvciAoXygiQm9ndXMgcmVwbHkgZnJvbSB0YXJnZXQ6ICVzIiksIHRhcmdldF9idWYpOwogICAgICAgc2V0X3RyYWNlZnJhbWVfbnVtICgtMSk7CS8qIEFsbCBvbGQgdHJhY2VmcmFtZXMgaW52YWxpZGF0ZWQuICAqLwpAQCAtMTg2Miw3ICsxODY1LDcgQEAKICAgaWYgKHRhcmdldF9pc19yZW1vdGUgKCkpCiAgICAgewogICAgICAgcHV0cGt0ICgiUVRTdG9wIik7Ci0gICAgICByZW1vdGVfZ2V0X25vaXN5X3JlcGx5ICh0YXJnZXRfYnVmLCBzaXplb2YgKHRhcmdldF9idWYpKTsKKyAgICAgIHJlbW90ZV9nZXRfbm9pc3lfcmVwbHkgKCZ0YXJnZXRfYnVmLCAmdGFyZ2V0X2J1Zl9zaXplKTsKICAgICAgIGlmIChzdHJjbXAgKHRhcmdldF9idWYsICJPSyIpKQogCWVycm9yIChfKCJCb2d1cyByZXBseSBmcm9tIHRhcmdldDogJXMiKSwgdGFyZ2V0X2J1Zik7CiAgICAgICB0cmFjZV9ydW5uaW5nX3AgPSAwOwpAQCAtMTg4Miw3ICsxODg1LDcgQEAKICAgaWYgKHRhcmdldF9pc19yZW1vdGUgKCkpCiAgICAgewogICAgICAgcHV0cGt0ICgicVRTdGF0dXMiKTsKLSAgICAgIHJlbW90ZV9nZXRfbm9pc3lfcmVwbHkgKHRhcmdldF9idWYsIHNpemVvZiAodGFyZ2V0X2J1ZikpOworICAgICAgcmVtb3RlX2dldF9ub2lzeV9yZXBseSAoJnRhcmdldF9idWYsICZ0YXJnZXRfYnVmX3NpemUpOwogCiAgICAgICBpZiAodGFyZ2V0X2J1ZlswXSAhPSAnVCcgfHwKIAkgICh0YXJnZXRfYnVmWzFdICE9ICcwJyAmJiB0YXJnZXRfYnVmWzFdICE9ICcxJykpCkBAIC0xODk3LDggKzE5MDAsOCBAQAogCiAvKiBXb3JrZXIgZnVuY3Rpb24gZm9yIHRoZSB2YXJpb3VzIGZsYXZvcnMgb2YgdGhlIHRmaW5kIGNvbW1hbmQuICAqLwogc3RhdGljIHZvaWQKLWZpbmlzaF90ZmluZF9jb21tYW5kIChjaGFyICptc2csCi0JCSAgICAgIGxvbmcgc2l6ZW9mX21zZywKK2ZpbmlzaF90ZmluZF9jb21tYW5kIChjaGFyICoqbXNnLAorCQkgICAgICBsb25nICpzaXplb2ZfbXNnLAogCQkgICAgICBpbnQgZnJvbV90dHkpCiB7CiAgIGludCB0YXJnZXRfZnJhbWVubyA9IC0xLCB0YXJnZXRfdHJhY2VwdCA9IC0xOwpAQCAtMTkwOSw3ICsxOTEyLDcgQEAKICAgb2xkX2ZyYW1lX2FkZHIgPSBnZXRfZnJhbWVfYmFzZSAoZ2V0X2N1cnJlbnRfZnJhbWUgKCkpOwogICBvbGRfZnVuYyA9IGZpbmRfcGNfZnVuY3Rpb24gKHJlYWRfcGMgKCkpOwogCi0gIHB1dHBrdCAobXNnKTsKKyAgcHV0cGt0ICgqbXNnKTsKICAgcmVwbHkgPSByZW1vdGVfZ2V0X25vaXN5X3JlcGx5IChtc2csIHNpemVvZl9tc2cpOwogCiAgIHdoaWxlIChyZXBseSAmJiAqcmVwbHkpCkBAIC0yMDU0LDcgKzIwNTcsNyBAQAogCWVycm9yIChfKCJpbnZhbGlkIGlucHV0ICglZCBpcyBsZXNzIHRoYW4gemVybykiKSwgZnJhbWVubyk7CiAKICAgICAgIHNwcmludGYgKHRhcmdldF9idWYsICJRVEZyYW1lOiV4IiwgZnJhbWVubyk7Ci0gICAgICBmaW5pc2hfdGZpbmRfY29tbWFuZCAodGFyZ2V0X2J1Ziwgc2l6ZW9mICh0YXJnZXRfYnVmKSwgZnJvbV90dHkpOworICAgICAgZmluaXNoX3RmaW5kX2NvbW1hbmQgKCZ0YXJnZXRfYnVmLCAmdGFyZ2V0X2J1Zl9zaXplLCBmcm9tX3R0eSk7CiAgICAgfQogICBlbHNlCiAgICAgZXJyb3IgKF8oIlRyYWNlIGNhbiBvbmx5IGJlIHJ1biBvbiByZW1vdGUgdGFyZ2V0cy4iKSk7CkBAIC0yMDk3LDcgKzIxMDAsNyBAQAogCiAgICAgICBzcHJpbnRmX3ZtYSAodG1wLCBwYyk7CiAgICAgICBzcHJpbnRmICh0YXJnZXRfYnVmLCAiUVRGcmFtZTpwYzolcyIsIHRtcCk7Ci0gICAgICBmaW5pc2hfdGZpbmRfY29tbWFuZCAodGFyZ2V0X2J1Ziwgc2l6ZW9mICh0YXJnZXRfYnVmKSwgZnJvbV90dHkpOworICAgICAgZmluaXNoX3RmaW5kX2NvbW1hbmQgKCZ0YXJnZXRfYnVmLCAmdGFyZ2V0X2J1Zl9zaXplLCBmcm9tX3R0eSk7CiAgICAgfQogICBlbHNlCiAgICAgZXJyb3IgKF8oIlRyYWNlIGNhbiBvbmx5IGJlIHJ1biBvbiByZW1vdGUgdGFyZ2V0cy4iKSk7CkBAIC0yMTIyLDcgKzIxMjUsNyBAQAogCXRkcCA9IHBhcnNlX2FuZF9ldmFsX2xvbmcgKGFyZ3MpOwogCiAgICAgICBzcHJpbnRmICh0YXJnZXRfYnVmLCAiUVRGcmFtZTp0ZHA6JXgiLCB0ZHApOwotICAgICAgZmluaXNoX3RmaW5kX2NvbW1hbmQgKHRhcmdldF9idWYsIHNpemVvZiAodGFyZ2V0X2J1ZiksIGZyb21fdHR5KTsKKyAgICAgIGZpbmlzaF90ZmluZF9jb21tYW5kICgmdGFyZ2V0X2J1ZiwgJnRhcmdldF9idWZfc2l6ZSwgZnJvbV90dHkpOwogICAgIH0KICAgZWxzZQogICAgIGVycm9yIChfKCJUcmFjZSBjYW4gb25seSBiZSBydW4gb24gcmVtb3RlIHRhcmdldHMuIikpOwpAQCAtMjIyMCw3ICsyMjIzLDcgQEAKICAgICAgIGVsc2UKIAlzcHJpbnRmICh0YXJnZXRfYnVmLCAiUVRGcmFtZTpvdXRzaWRlOiVzOiVzIiwgCiAJCSBzdGFydHBjX3N0ciwgZW5kcGNfc3RyKTsKLSAgICAgIGZpbmlzaF90ZmluZF9jb21tYW5kICh0YXJnZXRfYnVmLCBzaXplb2YgKHRhcmdldF9idWYpLCAKKyAgICAgIGZpbmlzaF90ZmluZF9jb21tYW5kICgmdGFyZ2V0X2J1ZiwgJnRhcmdldF9idWZfc2l6ZSwKIAkJCSAgICBmcm9tX3R0eSk7CiAgICAgICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKICAgICB9CkBAIC0yMjYxLDcgKzIyNjQsNyBAQAogICAgICAgc3ByaW50Zl92bWEgKHN0YXJ0X3N0ciwgc3RhcnQpOwogICAgICAgc3ByaW50Zl92bWEgKHN0b3Bfc3RyLCBzdG9wKTsKICAgICAgIHNwcmludGYgKHRhcmdldF9idWYsICJRVEZyYW1lOnJhbmdlOiVzOiVzIiwgc3RhcnRfc3RyLCBzdG9wX3N0cik7Ci0gICAgICBmaW5pc2hfdGZpbmRfY29tbWFuZCAodGFyZ2V0X2J1Ziwgc2l6ZW9mICh0YXJnZXRfYnVmKSwgZnJvbV90dHkpOworICAgICAgZmluaXNoX3RmaW5kX2NvbW1hbmQgKCZ0YXJnZXRfYnVmLCAmdGFyZ2V0X2J1Zl9zaXplLCBmcm9tX3R0eSk7CiAgICAgfQogICBlbHNlCiAgICAgZXJyb3IgKF8oIlRyYWNlIGNhbiBvbmx5IGJlIHJ1biBvbiByZW1vdGUgdGFyZ2V0cy4iKSk7CkBAIC0yMzAwLDcgKzIzMDMsNyBAQAogICAgICAgc3ByaW50Zl92bWEgKHN0YXJ0X3N0ciwgc3RhcnQpOwogICAgICAgc3ByaW50Zl92bWEgKHN0b3Bfc3RyLCBzdG9wKTsKICAgICAgIHNwcmludGYgKHRhcmdldF9idWYsICJRVEZyYW1lOm91dHNpZGU6JXM6JXMiLCBzdGFydF9zdHIsIHN0b3Bfc3RyKTsKLSAgICAgIGZpbmlzaF90ZmluZF9jb21tYW5kICh0YXJnZXRfYnVmLCBzaXplb2YgKHRhcmdldF9idWYpLCBmcm9tX3R0eSk7CisgICAgICBmaW5pc2hfdGZpbmRfY29tbWFuZCAoJnRhcmdldF9idWYsICZ0YXJnZXRfYnVmX3NpemUsIGZyb21fdHR5KTsKICAgICB9CiAgIGVsc2UKICAgICBlcnJvciAoXygiVHJhY2UgY2FuIG9ubHkgYmUgcnVuIG9uIHJlbW90ZSB0YXJnZXRzLiIpKTsKQEAgLTI4NjcsNCArMjg3MCw3IEBACiAgIGFkZF9jb21fYWxpYXMgKCJ0ciIsICJ0cmFjZSIsIGNsYXNzX2FsaWFzLCAxKTsKICAgYWRkX2NvbV9hbGlhcyAoInRyYSIsICJ0cmFjZSIsIGNsYXNzX2FsaWFzLCAxKTsKICAgYWRkX2NvbV9hbGlhcyAoInRyYWMiLCAidHJhY2UiLCBjbGFzc19hbGlhcywgMSk7CisKKyAgdGFyZ2V0X2J1Zl9zaXplID0gMjA0ODsKKyAgdGFyZ2V0X2J1ZiA9IHhtYWxsb2MgKHRhcmdldF9idWZfc2l6ZSk7CiB9CmRpZmYgLS1naXQgYS9nZGIvdmFsdWUuYyBiL2dkYi92YWx1ZS5jCmluZGV4IDJlMzA0ODUuLjc3YjkyZjYgMTAwNjQ0Ci0tLSBhL2dkYi92YWx1ZS5jCisrKyBiL2dkYi92YWx1ZS5jCkBAIC03NTUsNiArNzU1LDcgQEAKICAgdmFyID0gKHN0cnVjdCBpbnRlcm5hbHZhciAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBpbnRlcm5hbHZhcikpOwogICB2YXItPm5hbWUgPSBjb25jYXQgKG5hbWUsIChjaGFyICopTlVMTCk7CiAgIHZhci0+dmFsdWUgPSBhbGxvY2F0ZV92YWx1ZSAoYnVpbHRpbl90eXBlX3ZvaWQpOworICB2YXItPmVuZGlhbiA9IFRBUkdFVF9CWVRFX09SREVSOwogICByZWxlYXNlX3ZhbHVlICh2YXItPnZhbHVlKTsKICAgdmFyLT5uZXh0ID0gaW50ZXJuYWx2YXJzOwogICBpbnRlcm5hbHZhcnMgPSB2YXI7CkBAIC03NjUsMTIgKzc2Niw0NiBAQAogdmFsdWVfb2ZfaW50ZXJuYWx2YXIgKHN0cnVjdCBpbnRlcm5hbHZhciAqdmFyKQogewogICBzdHJ1Y3QgdmFsdWUgKnZhbDsKKyAgaW50IGksIGo7CisgIGdkYl9ieXRlIHRlbXA7CiAKICAgdmFsID0gdmFsdWVfY29weSAodmFyLT52YWx1ZSk7CiAgIGlmICh2YWx1ZV9sYXp5ICh2YWwpKQogICAgIHZhbHVlX2ZldGNoX2xhenkgKHZhbCk7CiAgIFZBTFVFX0xWQUwgKHZhbCkgPSBsdmFsX2ludGVybmFsdmFyOwogICBWQUxVRV9JTlRFUk5BTFZBUiAodmFsKSA9IHZhcjsKKworICAvKiBWYWx1ZXMgYXJlIGFsd2F5cyBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGJ5dGUgb3JkZXIuICBXaGVuIGNvbm5lY3RlZCB0byBhCisgICAgIHRhcmdldCB0aGlzIHdpbGwgbW9zdCBsaWtlbHkgYWx3YXlzIGJlIGNvcnJlY3QsIHNvIHRoZXJlJ3Mgbm9ybWFsbHkgbm8KKyAgICAgbmVlZCB0byB3b3JyeSBhYm91dCBpdC4KKworICAgICBIb3dldmVyLCBpbnRlcm5hbCB2YXJpYWJsZXMgY2FuIGJlIHNldCB1cCBiZWZvcmUgdGhlIHRhcmdldCBlbmRpYW4gaXMKKyAgICAga25vd24gYW5kIHNvIG1heSBiZWNvbWUgb3V0IG9mIGRhdGUuICBGaXggaXQgdXAgYmVmb3JlIGFueWJvZHkgc2Vlcy4KKworICAgICBJbnRlcm5hbCB2YXJpYWJsZXMgdXN1YWxseSBob2xkIHNpbXBsZSBzY2FsYXIgdmFsdWVzLCBhbmQgd2UgY2FuCisgICAgIGNvcnJlY3QgdGhvc2UuICBNb3JlIGNvbXBsZXggdmFsdWVzIChlLmcuIHN0cnVjdHVyZXMgYW5kIGZsb2F0aW5nCisgICAgIHBvaW50IHR5cGVzKSBhcmUgbGVmdCBhbG9uZSwgYmVjYXVzZSB0aGV5IHdvdWxkIGJlIHRvbyBjb21wbGljYXRlZAorICAgICB0byBjb3JyZWN0LiAgKi8KKworICBpZiAodmFyLT5lbmRpYW4gIT0gVEFSR0VUX0JZVEVfT1JERVIpCisgICAgeworICAgICAgZ2RiX2J5dGUgKmFycmF5ID0gdmFsdWVfY29udGVudHNfcmF3ICh2YWwpOworICAgICAgc3RydWN0IHR5cGUgKnR5cGUgPSBjaGVja190eXBlZGVmICh2YWx1ZV9lbmNsb3NpbmdfdHlwZSAodmFsKSk7CisgICAgICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpCisJeworCWNhc2UgVFlQRV9DT0RFX0lOVDoKKwljYXNlIFRZUEVfQ09ERV9QVFI6CisJICAvKiBSZXZlcnNlIHRoZSBieXRlcy4gICovCisJICBmb3IgKGkgPSAwLCBqID0gVFlQRV9MRU5HVEggKHR5cGUpIC0gMTsgaSA8IGo7IGkrKywgai0tKQorCSAgICB7CisJICAgICAgdGVtcCA9IGFycmF5W2pdOworCSAgICAgIGFycmF5W2pdID0gYXJyYXlbaV07CisJICAgICAgYXJyYXlbaV0gPSB0ZW1wOworCSAgICB9CisJICBicmVhazsKKwl9CisgICAgfQorCiAgIHJldHVybiB2YWw7CiB9CiAKQEAgLTgwOSw2ICs4NDQsNyBAQAogICAgICBsb25nLiAgKi8KICAgeGZyZWUgKHZhci0+dmFsdWUpOwogICB2YXItPnZhbHVlID0gbmV3dmFsOworICB2YXItPmVuZGlhbiA9IFRBUkdFVF9CWVRFX09SREVSOwogICByZWxlYXNlX3ZhbHVlIChuZXd2YWwpOwogICAvKiBFbmQgY29kZSB3aGljaCBtdXN0IG5vdCBjYWxsIGVycm9yKCkuICAqLwogfQpAQCAtODc3LDcgKzkxMyw4IEBACiAJICB2YXJzZWVuID0gMTsKIAl9CiAgICAgICBwcmludGZfZmlsdGVyZWQgKCgiJCVzID0gIiksIHZhci0+bmFtZSk7Ci0gICAgICB2YWx1ZV9wcmludCAodmFyLT52YWx1ZSwgZ2RiX3N0ZG91dCwgMCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKKyAgICAgIHZhbHVlX3ByaW50ICh2YWx1ZV9vZl9pbnRlcm5hbHZhciAodmFyKSwgZ2RiX3N0ZG91dCwKKwkJICAgMCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKICAgICAgIHByaW50Zl9maWx0ZXJlZCAoKCJcbiIpKTsKICAgICB9CiAgIGlmICghdmFyc2VlbikKZGlmZiAtLWdpdCBhL2dkYi92YWx1ZS5oIGIvZ2RiL3ZhbHVlLmgKaW5kZXggZTE5NzIzNS4uYTg3OGVjNCAxMDA2NDQKLS0tIGEvZ2RiL3ZhbHVlLmgKKysrIGIvZ2RiL3ZhbHVlLmgKQEAgLTI0NSw2ICsyNDUsNyBAQAogICBzdHJ1Y3QgaW50ZXJuYWx2YXIgKm5leHQ7CiAgIGNoYXIgKm5hbWU7CiAgIHN0cnVjdCB2YWx1ZSAqdmFsdWU7CisgIGludCBlbmRpYW47CiB9OwogCiAMCmRpZmYgLS1naXQgYS9nZGIvdmVyc2lvbi5pbiBiL2dkYi92ZXJzaW9uLmluCmluZGV4IDA0YmEzNTguLjcwZjI3Y2QgMTAwNjQ0Ci0tLSBhL2dkYi92ZXJzaW9uLmluCisrKyBiL2dkYi92ZXJzaW9uLmluCkBAIC0xICsxIEBACi02LjQuNTAuMjAwNjAzMzAtY3ZzCis2LjQuNTAuMjAwNjA0MjAtY3ZzCmRpZmYgLS1naXQgYS9nZGIvd2luMzItbmF0LmMgYi9nZGIvd2luMzItbmF0LmMKaW5kZXggNDI0ODg1OC4uYWJiZjRhMyAxMDA2NDQKLS0tIGEvZ2RiL3dpbjMyLW5hdC5jCisrKyBiL2dkYi93aW4zMi1uYXQuYwpAQCAtMzU0LDYgKzM1NCw3IEBACiAKICAgaWYgKGN1cnJlbnRfdGhyZWFkLT5yZWxvYWRfY29udGV4dCkKICAgICB7CisjaWZkZWYgX19DT1BZX0NPTlRFWFRfU0laRQogICAgICAgaWYgKGhhdmVfc2F2ZWRfY29udGV4dCkKIAl7CiAJICAvKiBMaWUgYWJvdXQgd2hlcmUgdGhlIHByb2dyYW0gYWN0dWFsbHkgaXMgc3RvcHBlZCBzaW5jZSBjeWd3aW4gaGFzIGluZm9ybWVkIHVzIHRoYXQKQEAgLTM2Myw2ICszNjQsNyBAQAogCSAgaGF2ZV9zYXZlZF9jb250ZXh0ID0gMDsKIAl9CiAgICAgICBlbHNlCisjZW5kaWYKIAl7CiAJICB0aHJlYWRfaW5mbyAqdGggPSBjdXJyZW50X3RocmVhZDsKIAkgIHRoLT5jb250ZXh0LkNvbnRleHRGbGFncyA9IENPTlRFWFRfREVCVUdHRVJfRFI7CkBAIC05MjgsNiArOTMwLDcgQEAKICAgICAgIGlmIChzdHJuY21wIChzLCAiY1lnIiwgMykgIT0gMCkKIAl3YXJuaW5nICgoIiVzIiksIHMpOwogICAgIH0KKyNpZmRlZiBfX0NPUFlfQ09OVEVYVF9TSVpFCiAgIGVsc2UKICAgICB7CiAgICAgICAvKiBHb3QgYSBjeWd3aW4gc2lnbmFsIG1hcmtlci4gIEEgY3lnd2luIHNpZ25hbCBpcyBmb2xsb3dlZCBieSB0aGUgc2lnbmFsIG51bWJlcgpAQCAtOTU1LDYgKzk1OCw3IEBACiAJICBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQgPSByZXR2YWw7CiAJfQogICAgIH0KKyNlbmRpZgogCiAgIGlmIChzKQogICAgIHhmcmVlIChzKTsKQEAgLTIzNDEsNiArMjM0NSwxOCBAQAogICAgIHJlZ2NhY2hlX3Jhd19zdXBwbHkgKGN1cnJlbnRfcmVnY2FjaGUsIHIsIGNvcmVfcmVnX3NlY3QgKyBtYXBwaW5nc1tyXSk7CiB9CiAKK3N0YXRpYyBpbnQKK29wZW5fc3ltYm9sX2ZpbGVfb2JqZWN0ICh2b2lkICpmcm9tX3R0eXApCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpbl9keW5zeW1fcmVzb2x2ZV9jb2RlIChDT1JFX0FERFIgcGMpCit7CisgIHJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZAogaW5pdF93aW4zMl9vcHMgKHZvaWQpCiB7CkBAIC0yMzg4LDggKzI0MDQsOCBAQAogICB3aW4zMl9zb19vcHMuc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2sgPSB3aW4zMl9zb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vazsKICAgd2luMzJfc29fb3BzLnNwZWNpYWxfc3ltYm9sX2hhbmRsaW5nID0gd2luMzJfc3BlY2lhbF9zeW1ib2xfaGFuZGxpbmc7CiAgIHdpbjMyX3NvX29wcy5jdXJyZW50X3NvcyA9IHdpbjMyX2N1cnJlbnRfc29zOwotICB3aW4zMl9zb19vcHMub3Blbl9zeW1ib2xfZmlsZV9vYmplY3QgPSBOVUxMOwotICB3aW4zMl9zb19vcHMuaW5fZHluc3ltX3Jlc29sdmVfY29kZSA9IE5VTEw7CisgIHdpbjMyX3NvX29wcy5vcGVuX3N5bWJvbF9maWxlX29iamVjdCA9IG9wZW5fc3ltYm9sX2ZpbGVfb2JqZWN0OworICB3aW4zMl9zb19vcHMuaW5fZHluc3ltX3Jlc29sdmVfY29kZSA9IGluX2R5bnN5bV9yZXNvbHZlX2NvZGU7CiAKICAgLyogRklYTUU6IERvbid0IGRvIHRoaXMgaGVyZS4gICpfZ2RiYXJjaF9pbml0KCkgc2hvdWxkIHNldCBzb19vcHMuICovCiAgIGN1cnJlbnRfdGFyZ2V0X3NvX29wcyA9ICZ3aW4zMl9zb19vcHM7CmRpZmYgLS1naXQgYS9nZGIvd2luY2UuYyBiL2dkYi93aW5jZS5jCmluZGV4IDU2ZjRiOTUuLjg2YmZhZjYgMTAwNjQ0Ci0tLSBhL2dkYi93aW5jZS5jCisrKyBiL2dkYi93aW5jZS5jCkBAIC0xNDYsNyArMTQ2LDYgQEAKICAgICBpbnQgc3VzcGVuZF9jb3VudDsKICAgICBpbnQgc3RlcHBlZDsJCS8qIFRydWUgaWYgc3RlcHBlZC4gICovCiAgICAgQ09SRV9BRERSIHN0ZXBfcGM7Ci0gICAgdW5zaWduZWQgbG9uZyBzdGVwX3ByZXY7CiAgICAgQ09OVEVYVCBjb250ZXh0OwogICB9CiB0aHJlYWRfaW5mbzsKQEAgLTgzNCw3ICs4MzMsNyBAQAogewogICBpZiAodGgtPnN0ZXBwZWQpCiAgICAgewotICAgICAgbWVtb3J5X3JlbW92ZV9icmVha3BvaW50ICh0aC0+c3RlcF9wYywgKHZvaWQgKikgJnRoLT5zdGVwX3ByZXYpOworICAgICAgcmVtb3ZlX3NpbmdsZV9zdGVwX2JyZWFrcG9pbnRzICgpOwogICAgICAgdGgtPnN0ZXBwZWQgPSAwOwogICAgIH0KIH0KQEAgLTg1Nyw4ICs4NTYsNyBAQAogICB0aC0+c3RlcHBlZCA9IDE7CiAgIHBjID0gcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKTsKICAgdGgtPnN0ZXBfcGMgPSBtaXBzX25leHRfcGMgKHBjKTsKLSAgdGgtPnN0ZXBfcHJldiA9IDA7Ci0gIG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAodGgtPnN0ZXBfcGMsICh2b2lkICopICZ0aC0+c3RlcF9wcmV2KTsKKyAgaW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQgKHRoLT5zdGVwX3BjKTsKICAgcmV0dXJuOwogfQogI2VsaWYgU0h4CkBAIC05NzEsNyArOTY5LDcgQEAKIHsKICAgaWYgKHRoLT5zdGVwcGVkKQogICAgIHsKLSAgICAgIG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAodGgtPnN0ZXBfcGMsICh2b2lkICopICZ0aC0+c3RlcF9wcmV2KTsKKyAgICAgIHJlbW92ZV9zaW5nbGVfc3RlcF9icmVha3BvaW50cyAoKTsKICAgICAgIHRoLT5zdGVwcGVkID0gMDsKICAgICB9CiAgIHJldHVybjsKQEAgLTk5Niw4ICs5OTQsNyBAQAogCiAgIHRoLT5zdGVwcGVkID0gMTsKICAgdGgtPnN0ZXBfcGMgPSBzaF9nZXRfbmV4dF9wYyAoJnRoLT5jb250ZXh0KTsKLSAgdGgtPnN0ZXBfcHJldiA9IDA7Ci0gIG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAodGgtPnN0ZXBfcGMsICh2b2lkICopICZ0aC0+c3RlcF9wcmV2KTsKKyAgaW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQgKHRoLT5zdGVwX3BjKTsKICAgcmV0dXJuOwogfQogI2VsaWYgZGVmaW5lZCAoQVJNKQpAQCAtMTAyNCw3ICsxMDIxLDcgQEAKIHsKICAgaWYgKHRoLT5zdGVwcGVkKQogICAgIHsKLSAgICAgIG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAodGgtPnN0ZXBfcGMsICh2b2lkICopICZ0aC0+c3RlcF9wcmV2KTsKKyAgICAgIHJlbW92ZV9zaW5nbGVfc3RlcF9icmVha3BvaW50cyAoKTsKICAgICAgIHRoLT5zdGVwcGVkID0gMDsKICAgICB9CiB9CkBAIC0xMDQ3LDggKzEwNDQsNyBAQAogICB0aC0+c3RlcHBlZCA9IDE7CiAgIHBjID0gcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKTsKICAgdGgtPnN0ZXBfcGMgPSBhcm1fZ2V0X25leHRfcGMgKHBjKTsKLSAgdGgtPnN0ZXBfcHJldiA9IDA7Ci0gIG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludCAodGgtPnN0ZXBfcGMsICh2b2lkICopICZ0aC0+c3RlcF9wcmV2KTsKKyAgaW5zZXJ0X3NpbmdsZV9zdGVwX2JyZWFrcG9pbnQgKHRoLT5zdGVwX3BjKTsKICAgcmV0dXJuOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL0NoYW5nZUxvZyBiL2luY2x1ZGUvQ2hhbmdlTG9nCmluZGV4IDRhZjU5M2YuLjBhMzc4N2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvQ2hhbmdlTG9nCisrKyBiL2luY2x1ZGUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTIgQEAKKzIwMDYtMDQtMTEgIEppbSBCbGFuZHkgIDxqaW1iQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIGxpYmliZXJ0eS5oIChwZXhfaW5wdXRfZmlsZSwgcGV4X2lucHV0X3BpcGUpOiBOZXcgZGVjbGFyYXRpb25zLgorCisyMDA2LTA0LTA2ICBILkouIEx1ICA8aG9uZ2ppdS5sdUBpbnRlbC5jb20+CisKKwkqIGJmZGxpbmsuaCAoYmZkX2xpbmtfaW5mbyk6IFJlcGxhY2UgbmVlZF9yZWxheF9maW5hbGl6ZSB3aXRoCisJcmVsYXhfcGFzcy4KKwogMjAwNi0wMy0yNSAgQmVybmQgU2NobWlkdCAgPGJlcm5kLnNjaG1pZHRAYW5hbG9nLmNvbT4KIAogCSogZWxmL2JmaW4uaCAoUl9CRklOX0dPVDE3TTQsIFJfQkZJTl9HT1RISSwgUl9CRklOX0dPVExPLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iZmRsaW5rLmggYi9pbmNsdWRlL2JmZGxpbmsuaAppbmRleCAzYzk3OGU4Li5mNGI3YWE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2JmZGxpbmsuaAorKysgYi9pbmNsdWRlL2JmZGxpbmsuaApAQCAtMzAxLDkgKzMwMSw2IEBACiAgIC8qIFRSVUUgaWYgZ2xvYmFsIHN5bWJvbHMgaW4gZGlzY2FyZGVkIHNlY3Rpb25zIHNob3VsZCBiZSBzdHJpcHBlZC4gICovCiAgIHVuc2lnbmVkIGludCBzdHJpcF9kaXNjYXJkZWQ6IDE7CiAKLSAgLyogVFJVRSBpZiB0aGUgZmluYWwgcmVsYXggcGFzcyBpcyBuZWVkZWQuICAqLwotICB1bnNpZ25lZCBpbnQgbmVlZF9yZWxheF9maW5hbGl6ZTogMTsKLQogICAvKiBUUlVFIGlmIGdlbmVyYXRpbmcgYSBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlLiAgKi8KICAgdW5zaWduZWQgaW50IHBpZTogMTsKIApAQCAtMzk4LDYgKzM5NSwxMiBAQAogICAgICB1bmxvYWRlZC4gICovCiAgIGNvbnN0IGNoYXIgKmZpbmlfZnVuY3Rpb247CiAKKyAgLyogTnVtYmVyIG9mIHJlbGF4YXRpb24gcGFzc2VzLiAgVXN1YWxseSBvbmx5IG9uZSByZWxheGF0aW9uIHBhc3MKKyAgICAgaXMgbmVlZGVkLiAgQnV0IGEgYmFja2VuZCBjYW4gaGF2ZSBhcyBtYW55IHJlbGF4YXRpb24gcGFzc2VzIGFzCisgICAgIG5lY2Vzc2FyeS4gIER1cmluZyBiZmRfcmVsYXhfc2VjdGlvbiBjYWxsLCBpdCBpcyBzZXQgdG8gdGhlCisgICAgIGN1cnJlbnQgcGFzcywgc3RhcnRpbmcgZnJvbSAwLiAgKi8KKyAgaW50IHJlbGF4X3Bhc3M7CisKICAgLyogTm9uLXplcm8gaWYgYXV0by1pbXBvcnQgdGh1bmtzIGZvciBEQVRBIGl0ZW1zIGluIHBlaTM4NiBETExzCiAgICAgIHNob3VsZCBiZSBnZW5lcmF0ZWQvbGlua2VkIGFnYWluc3QuICBTZXQgdG8gMSBpZiB0aGlzIGZlYXR1cmUKICAgICAgaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIsIC0xIGlmIGVuYWJsZWQgYnkgZGVmYXVsdC4gICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYmliZXJ0eS5oIGIvaW5jbHVkZS9saWJpYmVydHkuaAppbmRleCBjMjY0Y2IyLi42YmQzMThlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpYmliZXJ0eS5oCisrKyBiL2luY2x1ZGUvbGliaWJlcnR5LmgKQEAgLTQ0OCw2ICs0NDgsNDcgQEAKIAkJCSAgICBjb25zdCBjaGFyICpvdXRuYW1lLCBjb25zdCBjaGFyICplcnJuYW1lLAogCQkJICAgIGludCAqZXJyKTsKIAorLyogUmV0dXJuIGEgYEZJTEUnIHBvaW50ZXIgRlAgZm9yIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiB0aGUgZmlyc3QKKyAgIHByb2dyYW0gaW4gdGhlIHBpcGVsaW5lOyBGUCBpcyBvcGVuZWQgZm9yIHdyaXRpbmcuICBZb3UgbXVzdCBoYXZlCisgICBwYXNzZWQgYFBFWF9VU0VfUElQRVMnIHRvIHRoZSBgcGV4X2luaXQnIGNhbGwgdGhhdCByZXR1cm5lZCBPQkouCisgICBZb3UgbXVzdCBjbG9zZSBGUCB5b3Vyc2VsZiB3aXRoIGBmY2xvc2UnIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICBwaXBlbGluZSdzIGlucHV0IGlzIGNvbXBsZXRlLgorCisgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHVuZGVybHlpbmcgRlAgaXMgbWFya2VkIG5vdCB0byBiZSBpbmhlcml0ZWQgYnkKKyAgIGNoaWxkIHByb2Nlc3Nlcy4KKworICAgVGhpcyBjYWxsIGlzIG5vdCBzdXBwb3J0ZWQgb24gc3lzdGVtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBwaXBlczsKKyAgIGl0IHJldHVybnMgd2l0aCBhbiBlcnJvci4gIChXZSBjb3VsZCBpbXBsZW1lbnQgaXQgYnkgd3JpdGluZyBhCisgICB0ZW1wb3JhcnkgZmlsZSwgYnV0IHRoZW4geW91IHdvdWxkIG5lZWQgdG8gd3JpdGUgYWxsIHlvdXIgZGF0YSBhbmQKKyAgIGNsb3NlIEZQIGJlZm9yZSB5b3VyIGZpcnN0IGNhbGwgdG8gYHBleF9ydW4nIC0tIGFuZCB0aGF0IHdvdWxkbid0CisgICB3b3JrIG9uIHN5c3RlbXMgdGhhdCBkbyBzdXBwb3J0IHBpcGVzOiB0aGUgcGlwZSB3b3VsZCBmaWxsIHVwLCBhbmQKKyAgIHlvdSB3b3VsZCBibG9jay4gIFNvIHRoZXJlIGlzbid0IGFueSBlYXN5IHdheSB0byBjb25jZWFsIHRoZQorICAgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIHR5cGVzIG9mIHN5c3RlbXMuKQorCisgICBJZiB5b3UgY2FsbCBib3RoIGBwZXhfd3JpdGVfaW5wdXQnIGFuZCBgcGV4X3JlYWRfb3V0cHV0JywgYmUKKyAgIGNhcmVmdWwgdG8gYXZvaWQgZGVhZGxvY2suICBJZiB0aGUgb3V0cHV0IHBpcGUgZmlsbHMgdXAsIHNvIHRoYXQKKyAgIGVhY2ggcHJvZ3JhbSBpbiB0aGUgcGlwZWxpbmUgaXMgd2FpdGluZyBmb3IgdGhlIG5leHQgdG8gcmVhZCBtb3JlCisgICBkYXRhLCBhbmQgeW91IGZpbGwgdGhlIGlucHV0IHBpcGUgYnkgd3JpdGluZyBtb3JlIGRhdGEgdG8gRlAsIHRoZW4KKyAgIHRoZXJlIGlzIG5vIHdheSB0byBtYWtlIHByb2dyZXNzOiB0aGUgb25seSBwcm9jZXNzIHRoYXQgY291bGQgcmVhZAorICAgZGF0YSBmcm9tIHRoZSBvdXRwdXQgcGlwZSBpcyB5b3UsIGJ1dCB5b3UgYXJlIGJsb2NrZWQgb24gdGhlIGlucHV0CisgICBwaXBlLiAgKi8KKworZXh0ZXJuIEZJTEUgKnBleF93cml0ZV9pbnB1dCAoc3RydWN0IHBleF9vYmogKm9iaiwgaW50IGJpbmFyeSk7CisKKy8qIFJldHVybiBhIHN0cmVhbSBmb3IgYSB0ZW1wb3JhcnkgZmlsZSB0byBwYXNzIHRvIHRoZSBmaXJzdCBwcm9ncmFtCisgICBpbiB0aGUgcGlwZWxpbmUgYXMgaW5wdXQuICBUaGUgZmlsZSBuYW1lIGlzIGNob3NlbiBhcyBmb3IgcGV4X3J1bi4KKyAgIHBleF9ydW4gY2xvc2VzIHRoZSBmaWxlIGF1dG9tYXRpY2FsbHk7IGRvbid0IGNsb3NlIGl0IHlvdXJzZWxmLiAgKi8KKworZXh0ZXJuIEZJTEUgKnBleF9pbnB1dF9maWxlIChzdHJ1Y3QgcGV4X29iaiAqb2JqLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluX25hbWUpOworCisvKiBSZXR1cm4gYSBzdHJlYW0gZm9yIGEgcGlwZSBjb25uZWN0ZWQgdG8gdGhlIHN0YW5kYXJkIGlucHV0IG9mIHRoZQorICAgZmlyc3QgcHJvZ3JhbSBpbiB0aGUgcGlwZWxpbmUuICBZb3UgbXVzdCBoYXZlIHBhc3NlZAorICAgYFBFWF9VU0VfUElQRVMnIHRvIGBwZXhfaW5pdCcuICBDbG9zZSB0aGUgcmV0dXJuZWQgc3RyZWFtCisgICB5b3Vyc2VsZi4gICovCisKK2V4dGVybiBGSUxFICpwZXhfaW5wdXRfcGlwZSAoc3RydWN0IHBleF9vYmogKm9iaiwgaW50IGJpbmFyeSk7CisKIC8qIFJlYWQgdGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgbGFzdCBwcm9ncmFtIHRvIGJlIGV4ZWN1dGVkLgogICAgcGV4X3J1biBjYW4gbm90IGJlIGNhbGxlZCBhZnRlciB0aGlzLiAgQklOQVJZIHNob3VsZCBiZSBub24temVybyBpZgogICAgdGhlIGZpbGUgc2hvdWxkIGJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZTsgdGhpcyBpcyBpZ25vcmVkIG9uIFVuaXguCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9DaGFuZ2VMb2cgYi9pbmNsdWRlL29wY29kZS9DaGFuZ2VMb2cKaW5kZXggOTBiZjIzZi4uYWQ0NDExYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nCisrKyBiL2luY2x1ZGUvb3Bjb2RlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDcgQEAKKzIwMDYtMDQtMDcgIEpvZXJnIFd1bnNjaCA8ai5nbnVAdXJpYWguaGVlcC5zYXguZGU+CisKKwkqIGF2ci5oIChBVlJfSVNBX1BXTXgpOiBOZXcuCisKIDIwMDYtMDMtMjggIE5hdGhhbiBTaWR3ZWxsICA8bmF0aGFuQGNvZGVzb3VyY2VyeS5jb20+CiAKIAkqIG02OGsuaCAoY3B1X202OGssIGNwdV9jZiwgY3B1X202ODAwMCwgY3B1X202ODAwOCwgY3B1X202ODAxMCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2F2ci5oIGIvaW5jbHVkZS9vcGNvZGUvYXZyLmgKaW5kZXggYjdhODBiMC4uNTViYjE2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYXZyLmgKKysrIGIvaW5jbHVkZS9vcGNvZGUvYXZyLmgKQEAgLTEsNiArMSw2IEBACiAvKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBBdG1lbCBBVlIgbWljcm8gY29udHJvbGxlcnMuCiAKLSAgIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDQsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICBDb250cmlidXRlZCBieSBEZW5pcyBDaGVydHlrb3YgPGRlbmlzY0BvdmVydGEucnU+CiAgICAKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xNyw3ICsxNyw3IEBACiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KIAotI2RlZmluZSBBVlJfSVNBXzEyMDAgIDB4MDAwMSAvKiBpbiB0aGUgYmVnaW5uaW5nIHRoZXJlIHdhcyAuLi4gKi8KKyNkZWZpbmUgQVZSX0lTQV8xMjAwICAweDAwMDEgLyogSW4gdGhlIGJlZ2lubmluZyB0aGVyZSB3YXMgLi4uICAqLwogI2RlZmluZSBBVlJfSVNBX0xQTSAgIDB4MDAwMiAvKiBkZXZpY2UgaGFzIExQTSAqLwogI2RlZmluZSBBVlJfSVNBX0xQTVggIDB4MDAwNCAvKiBkZXZpY2UgaGFzIExQTSBSZCxaWytdICovCiAjZGVmaW5lIEFWUl9JU0FfU1JBTSAgMHgwMDA4IC8qIGRldmljZSBoYXMgU1JBTSAoTEQsIFNULCBQVVNILCBQT1AsIC4uLikgKi8KQEAgLTMyLDE4ICszMiwxOSBAQAogI2RlZmluZSBBVlJfSVNBX01PVlcgIDB4MTAwMCAvKiBkZXZpY2UgaGFzIE1PVlcgKi8KIAogI2RlZmluZSBBVlJfSVNBX1RJTlkxIChBVlJfSVNBXzEyMDAgfCBBVlJfSVNBX0xQTSkKLSNkZWZpbmUgQVZSX0lTQV8yeHh4IChBVlJfSVNBX1RJTlkxIHwgQVZSX0lTQV9TUkFNKQorI2RlZmluZSBBVlJfSVNBX1BXTXggIChBVlJfSVNBX004ICAgfCBBVlJfSVNBX0JSSykKKyNkZWZpbmUgQVZSX0lTQV8yeHh4ICAoQVZSX0lTQV9USU5ZMSB8IEFWUl9JU0FfU1JBTSkKICNkZWZpbmUgQVZSX0lTQV9USU5ZMiAoQVZSX0lTQV8yeHh4IHwgQVZSX0lTQV9NT1ZXIHwgQVZSX0lTQV9MUE1YIHwgXAotICAgICAgICAgICAgICAgICAgICAgICBBVlJfSVNBX1NQTSB8IEFWUl9JU0FfQlJLKQotI2RlZmluZSBBVlJfSVNBX004ICAgKEFWUl9JU0FfMnh4eCB8IEFWUl9JU0FfTVVMIHwgQVZSX0lTQV9NT1ZXIHwgXAotICAgICAgICAgICAgICAgICAgICAgIEFWUl9JU0FfTFBNWCB8IEFWUl9JU0FfU1BNKQotI2RlZmluZSBBVlJfSVNBX002MDMgKEFWUl9JU0FfMnh4eCB8IEFWUl9JU0FfTUVHQSkKLSNkZWZpbmUgQVZSX0lTQV9NMTAzIChBVlJfSVNBX002MDMgfCBBVlJfSVNBX0VMUE0pCi0jZGVmaW5lIEFWUl9JU0FfTTE2MSAoQVZSX0lTQV9NNjAzIHwgQVZSX0lTQV9NVUwgfCBBVlJfSVNBX01PVlcgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgQVZSX0lTQV9MUE1YIHwgQVZSX0lTQV9TUE0pCi0jZGVmaW5lIEFWUl9JU0FfOTRLICAoQVZSX0lTQV9NNjAzIHwgQVZSX0lTQV9NVUwgfCBBVlJfSVNBX01PVlcgfCBBVlJfSVNBX0xQTVgpCi0jZGVmaW5lIEFWUl9JU0FfTTMyMyAoQVZSX0lTQV9NMTYxIHwgQVZSX0lTQV9CUkspCi0jZGVmaW5lIEFWUl9JU0FfTTEyOCAoQVZSX0lTQV9NMzIzIHwgQVZSX0lTQV9FTFBNIHwgQVZSX0lTQV9FTFBNWCkKKyAgICAgICAgICAgICAgICAgICAgICAgQVZSX0lTQV9TUE0gIHwgQVZSX0lTQV9CUkspCisjZGVmaW5lIEFWUl9JU0FfTTggICAgKEFWUl9JU0FfMnh4eCB8IEFWUl9JU0FfTVVMIHwgQVZSX0lTQV9NT1ZXIHwgXAorICAgICAgICAgICAgICAgICAgICAgICBBVlJfSVNBX0xQTVggfCBBVlJfSVNBX1NQTSkKKyNkZWZpbmUgQVZSX0lTQV9NNjAzICAoQVZSX0lTQV8yeHh4IHwgQVZSX0lTQV9NRUdBKQorI2RlZmluZSBBVlJfSVNBX00xMDMgIChBVlJfSVNBX002MDMgfCBBVlJfSVNBX0VMUE0pCisjZGVmaW5lIEFWUl9JU0FfTTE2MSAgKEFWUl9JU0FfTTYwMyB8IEFWUl9JU0FfTVVMIHwgQVZSX0lTQV9NT1ZXIHwgXAorICAgICAgICAgICAgICAgICAgICAgICBBVlJfSVNBX0xQTVggfCBBVlJfSVNBX1NQTSkKKyNkZWZpbmUgQVZSX0lTQV85NEsgICAoQVZSX0lTQV9NNjAzIHwgQVZSX0lTQV9NVUwgfCBBVlJfSVNBX01PVlcgfCBBVlJfSVNBX0xQTVgpCisjZGVmaW5lIEFWUl9JU0FfTTMyMyAgKEFWUl9JU0FfTTE2MSB8IEFWUl9JU0FfQlJLKQorI2RlZmluZSBBVlJfSVNBX00xMjggIChBVlJfSVNBX00zMjMgfCBBVlJfSVNBX0VMUE0gfCBBVlJfSVNBX0VMUE1YKQogCiAjZGVmaW5lIEFWUl9JU0FfQUxMICAgMHhGRkZGCiAKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9DaGFuZ2VMb2cgYi9saWJpYmVydHkvQ2hhbmdlTG9nCmluZGV4IDUwMDdhMTcuLmZiMzI4ZGEgMTAwNjQ0Ci0tLSBhL2xpYmliZXJ0eS9DaGFuZ2VMb2cKKysrIGIvbGliaWJlcnR5L0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ3IEBACisyMDA2LTAzLTI5ICBKaW0gQmxhbmR5ICA8amltYkBjb2Rlc291cmNlcnkuY29tPgorCisgCSogcGV4LWNvbW1vbi5jIChwZXhfaW5wdXRfZmlsZSwgcGV4X2lucHV0X3BpcGUpOiBOZXcgZnVuY3Rpb25zLgorCShwZXhfaW5pdF9jb21tb24pOiBJbml0aWFsaXplIG9iai0+aW5wdXRfZmlsZS4KKwkocGV4X3J1bik6IENsb3NlIGFueSBmaWxlIG9wZW5lZCBieSBwZXhfaW5wdXRfZmlsZS4KKyAJKiBwZXhlY3V0ZS50eGggKHBleF9pbnB1dF9maWxlLCBwZXhfaW5wdXRfcGlwZSk6IE5ldyBkb2NzLgorIAkqIHBleC1jb21tb24uaCAoc3RydWN0IHBleF9vYmopOiBOZXcgZmllbGQgaW5wdXRfZmlsZS4KKwkoc3RydWN0IHBleF9mdW5jcyk6IE5ldyBmdW5jdGlvbiBwdHIgZmRvcGVudy4KKyAJKiBwZXgtdW5peC5jIChwZXhfdW5peF9mZG9wZW53KTogTmV3IGZ1bmN0aW9uLgorIAkoZnVuY3MpOiBMaXN0IGl0IGFzIG91ciBmZG9wZW53IGZ1bmN0aW9uLgorIAkqIHBleC13aW4zMi5jIChwZXhfd2luMzJfZmRvcGVudyk6IE5ldyBmdW5jdGlvbi4KKyAJKGZ1bmNzKTogTGlzdCBpdCBhcyBvdXIgZmRvcGVudyBmdW5jdGlvbi4KKyAJKiBwZXgtZGpncHAuYyAoZnVuY3MpOiBMZWF2ZSBmZG9wZW53IG51bGwuCisgCSogcGV4LW1zZG9zIChmdW5jcyk6IFNhbWUuCisgCSogZnVuY3Rpb25zLnRleGk6IFJlZ2VuZXJhdGVkLgorCisyMDA2LTA0LTEwICBKaW0gQmxhbmR5ICA8amltYkBjb2Rlc291cmNlcnkuY29tPgorCisJKiBwZXgtY29tbW9uLmMgKHRlbXBfZmlsZSk6IE5ldyBmdW5jdGlvbiwgY29udGFpbmluZyBndXRzIG9mCisJcGV4LXN0eWxlIHRlbXBvcmFyeSBmaWxlIG5hbWUgZ2VuZXJhdGlvbi4KKwkocGV4X3J1bik6IFVzZSBpdC4KKworMjAwNi0wNC0wNiAgQ2FybG9zIE8nRG9uZWxsICA8Y2FybG9zQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBBZGQgaW5zdGFsbC1odG1sLCBpbnN0YWxsLWh0bWwtYW0sIGFuZAorCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgdGFyZ2V0cy4gRGVmaW5lIG1rZGlyX3AgYW5kIAorCU5PUk1BTF9JTlNUQUxMLiAKKwkqIGNvbmZpZ3VyZS5hYzogQUNfU1VCU1QgZGF0YXJvb3RkaXIsIGRvY2RpciwgaHRtbGRpci4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogQWRkIGluc3RhbGwtaHRtbCBhbmQgaHRtbCB0YXJnZXRzLgorCisyMDA2LTAzLTMxICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgorCisJKiBwZXgtd2luMzIuYyAoPGVycm5vLmg+KTogSW5jbHVkZS4KKwkoZml4X2FyZ3YpOiBSZW1vdmUuCisJKGFyZ3ZfdG9fY21kbGluZSk6IE5ldyBmdW5jdGlvbi4KKwkoc3RkX3N1ZmZpeGVzKTogTmV3IHZhcmlhYmxlLgorCShub19zdWZmaXhlcyk6IExpa2V3aXNlLgorCShmaW5kX2V4ZWN1dGFibGUpOiBOZXcgZnVuY3Rpb24uCisJKHdpbjMyX3NwYXduKTogTGlrZXdpc2UuCisJKHNwYXduX3NjcmlwdCk6IFVzZSB3aW4zMl9zcGF3biBpbnN0ZWFkIG9mIF9zcGF3bnZbcF0uCisJKHBleF93aW4zMl9leGVjX2NoaWxkKTogUmVwbGFjZSBNU1ZDUlQgY2FsbHMgd2l0aCBXaW4zMiBBUEkgY2FsbHMuCisJKHBleF93aW4zMl93YWl0KTogTGlrZXdpc2UuCisKIDIwMDYtMDMtMjQgIEppbSBCbGFuZHkgIDxqaW1iQGNvZGVzb3VyY2VyeS5jb20+CiAKIAkqIHBleC1jb21tb24uYyAocGV4X3J1bik6IFNpbXBsaWZ5IG91dHB1dCBuYW1lIGhhbmRsaW5nLgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L01ha2VmaWxlLmluIGIvbGliaWJlcnR5L01ha2VmaWxlLmluCmluZGV4IGRjZDVlYmQuLjk1YTgyNzggMTAwNjQ0Ci0tLSBhL2xpYmliZXJ0eS9NYWtlZmlsZS5pbgorKysgYi9saWJpYmVydHkvTWFrZWZpbGUuaW4KQEAgLTEsNiArMSw2IEBACiAjCiAjIE1ha2VmaWxlCi0jICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MS05OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQorIyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEtOTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKICMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgpAQCAtMjQ1LDcgKzI0NSw2MiBAQAogaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tc3ViZGlyCiBjbGVhbi1pbmZvOiBjbGVhbi1pbmZvLXN1YmRpcgogZHZpOiBsaWJpYmVydHkuZHZpIGR2aS1zdWJkaXIKLWh0bWw6IGxpYmliZXJ0eS5odG1sCisKKyMgaHRtbCwgaW5zdGFsbC1odG1sIHRhcmdldHMKK0hUTUxTID0gbGliaWJlcnR5Lmh0bWwKKworaHRtbDogJChIVE1MUykKKworLlBIT05ZOiBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKKworTk9STUFMX0lOU1RBTEwgPSA6Citta2Rpcl9wID0gbWtkaXIgLXAgLS0KKyAKK2h0bWxfX3N0cmlwX2RpciA9IGBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlICBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1odG1sLWFtOiAkKEhUTUxTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoaHRtbGRpcikiIHx8ICQobWtkaXJfcCkgIiQoREVTVERJUikkKGh0bWxkaXIpIgorCUBsaXN0PSckKEhUTUxTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIiB8fCB0ZXN0IC1kICIkJHAiOyB0aGVuIGQ9IiI7IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBmPSQoaHRtbF9fc3RyaXBfZGlyKSBcCisJICBpZiB0ZXN0IC1kICIkJGQkJHAiOyB0aGVuIFwKKwkgICAgZWNobyAiICQobWtkaXJfcCkgJyQoREVTVERJUikkKGh0bWxkaXIpLyQkZiciOyBcCisJICAgICQobWtkaXJfcCkgIiQoREVTVERJUikkKGh0bWxkaXIpLyQkZiIgfHwgZXhpdCAxOyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZCQkcCcvKiAnJChERVNURElSKSQoaHRtbGRpcikvJCRmJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICIkJGQkJHAiLyogIiQoREVTVERJUikkKGh0bWxkaXIpLyQkZiI7IFwKKwkgIGVsc2UgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGQkJHAnICckKERFU1RESVIpJChodG1sZGlyKS8kJGYnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZCQkcCIgIiQoREVTVERJUikkKGh0bWxkaXIpLyQkZiI7IFwKKwkgIGZpOyBcCisJZG9uZQorCitpbnN0YWxsLWh0bWwtcmVjdXJzaXZlOgorCUBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCiAKIFRFWElTUkMgPSBcCiAJJChzcmNkaXIpL2xpYmliZXJ0eS50ZXhpIFwKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWd1cmUgYi9saWJpYmVydHkvY29uZmlndXJlCmluZGV4IDU5NjMzZDUuLmVkNzQyM2EgMTAwNzU1Ci0tLSBhL2xpYmliZXJ0eS9jb25maWd1cmUKKysrIGIvbGliaWJlcnR5L2NvbmZpZ3VyZQpAQCAtMzA5LDcgKzMwOSw3IEBACiAjIGluY2x1ZGUgPHVuaXN0ZC5oPgogI2VuZGlmIgogCi1hY19zdWJzdF92YXJzPSdTSEVMTCBQQVRIX1NFUEFSQVRPUiBQQUNLQUdFX05BTUUgUEFDS0FHRV9UQVJOQU1FIFBBQ0tBR0VfVkVSU0lPTiBQQUNLQUdFX1NUUklORyBQQUNLQUdFX0JVR1JFUE9SVCBleGVjX3ByZWZpeCBwcmVmaXggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGxpYmRpciBpbmNsdWRlZGlyIG9sZGluY2x1ZGVkaXIgaW5mb2RpciBtYW5kaXIgYnVpbGRfYWxpYXMgaG9zdF9hbGlhcyB0YXJnZXRfYWxpYXMgREVGUyBFQ0hPX0MgRUNIT19OIEVDSE9fVCBMSUJTIGxpYmliZXJ0eV90b3BkaXIgTUFJTlQgTk9UTUFJTlQgTUFLRUlORk8gQlVJTERfSU5GTyBQRVJMIEhBVkVfUEVSTCBidWlsZCBidWlsZF9jcHUgYnVpbGRfdmVuZG9yIGJ1aWxkX29zIGhvc3QgaG9zdF9jcHUgaG9zdF92ZW5kb3IgaG9zdF9vcyBBUiBhY19jdF9BUiBSQU5MSUIgYWNfY3RfUkFOTElCIENDIENGTEFHUyBMREZMQUdTIENQUEZMQUdTIGFjX2N0X0NDIEVYRUVYVCBPQkpFWFQgQ1BQIGFjX2xpYmliZXJ0eV93YXJuX2NmbGFncyBOT19NSU5VU19DX01JTlVTX08gT1VUUFVUX09QVElPTiBJTlNUQUxMX1BST0dSQU0gSU5TVEFMTF9TQ1JJUFQgSU5TVEFMTF9EQVRBIEVHUkVQIExJQk9CSlMgQ0hFQ0sgdGFyZ2V0X2hlYWRlcl9kaXIgcGV4ZWN1dGUgSU5TVEFMTF9ERVNUIExUTElCT0JKUycKK2FjX3N1YnN0X3ZhcnM9J1NIRUxMIFBBVEhfU0VQQVJBVE9SIFBBQ0tBR0VfTkFNRSBQQUNLQUdFX1RBUk5BTUUgUEFDS0FHRV9WRVJTSU9OIFBBQ0tBR0VfU1RSSU5HIFBBQ0tBR0VfQlVHUkVQT1JUIGV4ZWNfcHJlZml4IHByZWZpeCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpciBidWlsZF9hbGlhcyBob3N0X2FsaWFzIHRhcmdldF9hbGlhcyBERUZTIEVDSE9fQyBFQ0hPX04gRUNIT19UIExJQlMgbGliaWJlcnR5X3RvcGRpciBNQUlOVCBOT1RNQUlOVCBNQUtFSU5GTyBCVUlMRF9JTkZPIFBFUkwgSEFWRV9QRVJMIGJ1aWxkIGJ1aWxkX2NwdSBidWlsZF92ZW5kb3IgYnVpbGRfb3MgaG9zdCBob3N0X2NwdSBob3N0X3ZlbmRvciBob3N0X29zIEFSIGFjX2N0X0FSIFJBTkxJQiBhY19jdF9SQU5MSUIgQ0MgQ0ZMQUdTIExERkxBR1MgQ1BQRkxBR1MgYWNfY3RfQ0MgRVhFRVhUIE9CSkVYVCBDUFAgYWNfbGliaWJlcnR5X3dhcm5fY2ZsYWdzIE5PX01JTlVTX0NfTUlOVVNfTyBPVVRQVVRfT1BUSU9OIElOU1RBTExfUFJPR1JBTSBJTlNUQUxMX1NDUklQVCBJTlNUQUxMX0RBVEEgRUdSRVAgTElCT0JKUyBDSEVDSyB0YXJnZXRfaGVhZGVyX2RpciBwZXhlY3V0ZSBJTlNUQUxMX0RFU1QgZGF0YXJvb3RkaXIgZG9jZGlyIGh0bWxkaXIgTFRMSUJPQkpTJwogYWNfc3Vic3RfZmlsZXM9J2hvc3RfbWFrZWZpbGVfZnJhZycKIAogIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgpAQCAtODY3Nyw2ICs4Njc3LDEwIEBACiBkb25lCiBMSUJPQkpTPSIkTCIKIAorCisKKworCiAjIFdlIG5lZWQgbXVsdGlsaWIgc3VwcG9ydCwgYnV0IG9ubHkgaWYgY29uZmlndXJpbmcgZm9yIHRoZSB0YXJnZXQuCiAgICAgICAgICAgICAgICAgICAgIGFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSB0ZXN0c3VpdGUvTWFrZWZpbGUiCiAKQEAgLTkzNTQsNiArOTM1OCw5IEBACiBzLEB0YXJnZXRfaGVhZGVyX2RpckAsJHRhcmdldF9oZWFkZXJfZGlyLDt0IHQKIHMsQHBleGVjdXRlQCwkcGV4ZWN1dGUsO3QgdAogcyxASU5TVEFMTF9ERVNUQCwkSU5TVEFMTF9ERVNULDt0IHQKK3MsQGRhdGFyb290ZGlyQCwkZGF0YXJvb3RkaXIsO3QgdAorcyxAZG9jZGlyQCwkZG9jZGlyLDt0IHQKK3MsQGh0bWxkaXJALCRodG1sZGlyLDt0IHQKIHMsQExUTElCT0JKU0AsJExUTElCT0JKUyw7dCB0CiAvQGhvc3RfbWFrZWZpbGVfZnJhZ0AvciAkaG9zdF9tYWtlZmlsZV9mcmFnCiBzLEBob3N0X21ha2VmaWxlX2ZyYWdALCw7dCB0CmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlndXJlLmFjIGIvbGliaWJlcnR5L2NvbmZpZ3VyZS5hYwppbmRleCBhNTc2ODVhLi43NmNmM2Q1IDEwMDY0NAotLS0gYS9saWJpYmVydHkvY29uZmlndXJlLmFjCisrKyBiL2xpYmliZXJ0eS9jb25maWd1cmUuYWMKQEAgLTYzOSw2ICs2MzksMTEgQEAKIGRvbmUKIExJQk9CSlM9IiRMIgogCitkbmwgUmVxdWlyZWQgYnkgaHRtbCBhbmQgaW5zdGFsbC1odG1sCitBQ19TVUJTVChkYXRhcm9vdGRpcikKK0FDX1NVQlNUKGRvY2RpcikKK0FDX1NVQlNUKGh0bWxkaXIpCisKICMgV2UgbmVlZCBtdWx0aWxpYiBzdXBwb3J0LCBidXQgb25seSBpZiBjb25maWd1cmluZyBmb3IgdGhlIHRhcmdldC4KIEFDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGUgdGVzdHN1aXRlL01ha2VmaWxlXSkKIEFDX0NPTkZJR19DT01NQU5EUyhbZGVmYXVsdF0sCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZnVuY3Rpb25zLnRleGkgYi9saWJpYmVydHkvZnVuY3Rpb25zLnRleGkKaW5kZXggYTA5ZTIwNy4uZmE5MmQ3MCAxMDA2NDQKLS0tIGEvbGliaWJlcnR5L2Z1bmN0aW9ucy50ZXhpCisrKyBiL2xpYmliZXJ0eS9mdW5jdGlvbnMudGV4aQpAQCAtNjY4LDE0ICs2NjgsMTQgQEAKIAogQGVuZCBkZWZ0eXBlZm4KIAotQGMgcGV4ZWN1dGUudHhoOjE2OQorQGMgcGV4ZWN1dGUudHhoOjIzMQogQGRlZnR5cGVmbiBFeHRlbnNpb24gdm9pZCBwZXhfZnJlZSAoc3RydWN0IHBleF9vYmogQHZhcntvYmp9KQogCiBDbGVhbiB1cCBhbmQgZnJlZSBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggQHZhcntvYmp9LgogCiBAZW5kIGRlZnR5cGVmbgogCi1AYyBwZXhlY3V0ZS50eGg6MTQ0CitAYyBwZXhlY3V0ZS50eGg6MjA2CiBAZGVmdHlwZWZuIEV4dGVuc2lvbiBpbnQgcGV4X2dldF9zdGF0dXMgKHN0cnVjdCBwZXhfb2JqICpAdmFye29ian0sIGludCBAdmFye2NvdW50fSwgaW50ICpAdmFye3ZlY3Rvcn0pCiAKIFJldHVybnMgdGhlIGV4aXQgc3RhdHVzIG9mIGFsbCBwcm9ncmFtcyBydW4gdXNpbmcgQHZhcntvYmp9LgpAQCAtNjg1LDcgKzY4NSw3IEBACiAKIEBlbmQgZGVmdHlwZWZuCiAKLUBjIHBleGVjdXRlLnR4aDoxNTMKK0BjIHBleGVjdXRlLnR4aDoyMTUKIEBkZWZ0eXBlZm4gRXh0ZW5zaW9uIGludCBwZXhfZ2V0X3RpbWVzIChzdHJ1Y3QgcGV4X29iaiAqQHZhcntvYmp9LCBpbnQgQHZhcntjb3VudH0sIHN0cnVjdCBwZXhfdGltZSAqQHZhcnt2ZWN0b3J9KQogCiBSZXR1cm5zIHRoZSBwcm9jZXNzIGV4ZWN1dGlvbiB0aW1lcyBvZiBhbGwgcHJvZ3JhbXMgcnVuIHVzaW5nCkBAIC03MDIsNyArNzAyLDcgQEAKIAogQGVuZCBkZWZ0eXBlZm4KIAotQGMgcGV4ZWN1dGUudHhoOjEKK0BjIHBleGVjdXRlLnR4aDoyCiBAZGVmdHlwZWZuIEV4dGVuc2lvbiB7c3RydWN0IHBleF9vYmogKn0gcGV4X2luaXQgKGludCBAdmFye2ZsYWdzfSwgY29uc3QgY2hhciAqQHZhcntwbmFtZX0sIGNvbnN0IGNoYXIgKkB2YXJ7dGVtcGJhc2V9KQogCiBQcmVwYXJlIHRvIGV4ZWN1dGUgb25lIG9yIG1vcmUgcHJvZ3JhbXMsIHdpdGggc3RhbmRhcmQgb3V0cHV0IG9mIGVhY2gKQEAgLTczNCw3ICs3MzQsNzAgQEAKIAogQGVuZCBkZWZ0eXBlZm4KIAotQGMgcGV4ZWN1dGUudHhoOjE3NQorQGMgcGV4ZWN1dGUudHhoOjEzMworQGRlZnR5cGVmbiBFeHRlbnNpb24ge0ZJTEUgKn0gcGV4X2lucHV0X2ZpbGUgKHN0cnVjdCBwZXhfb2JqICpAdmFye29ian0sIGludCBAdmFye2ZsYWdzfSwgY29uc3QgY2hhciAqQHZhcntpbl9uYW1lfSkKKworUmV0dXJuIGEgc3RyZWFtIGZvciBhIHRlbXBvcmFyeSBmaWxlIHRvIHBhc3MgdG8gdGhlIGZpcnN0IHByb2dyYW0gaW4KK3RoZSBwaXBlbGluZSBhcyBpbnB1dC4KKworVGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgaXMgY2hvc2VuIGFjY29yZGluZyB0byB0aGUgc2FtZSBydWxlcworQGNvZGV7cGV4X3J1bn0gdXNlcyB0byBjaG9vc2Ugb3V0cHV0IGZpbGUgbmFtZXMsIGJhc2VkIG9uCitAdmFye2luX25hbWV9LCBAdmFye29ian0gYW5kIHRoZSBAY29kZXtQRVhfU1VGRklYfSBiaXQgaW4gQHZhcntmbGFnc30uCisKK0Rvbid0IGNhbGwgQGNvZGV7ZmNsb3NlfSBvbiB0aGUgcmV0dXJuZWQgc3RyZWFtOyB0aGUgZmlyc3QgY2FsbCB0bworQGNvZGV7cGV4X3J1bn0gY2xvc2VzIGl0IGF1dG9tYXRpY2FsbHkuCisKK0lmIEB2YXJ7ZmxhZ3N9IGluY2x1ZGVzIEBjb2Rle1BFWF9CSU5BUllfT1VUUFVUfSwgb3BlbiB0aGUgc3RyZWFtIGluCitiaW5hcnkgbW9kZTsgb3RoZXJ3aXNlLCBvcGVuIGl0IGluIHRoZSBkZWZhdWx0IG1vZGUuICBJbmNsdWRpbmcKK0Bjb2Rle1BFWF9CSU5BUllfT1VUUFVUfSBpbiBAdmFye2ZsYWdzfSBoYXMgbm8gZWZmZWN0IG9uIFVuaXguCitAZW5kIGRlZnR5cGVmbgorCitAYyBwZXhlY3V0ZS50eGg6MTUwCitAZGVmdHlwZWZuIEV4dGVuc2lvbiB7RklMRSAqfSBwZXhfaW5wdXRfcGlwZSAoc3RydWN0IHBleF9vYmogKkB2YXJ7b2JqfSwgaW50IEB2YXJ7YmluYXJ5fSkKKworUmV0dXJuIGEgc3RyZWFtIEB2YXJ7ZnB9IGZvciBhIHBpcGUgY29ubmVjdGVkIHRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZgordGhlIGZpcnN0IHByb2dyYW0gaW4gdGhlIHBpcGVsaW5lOyBAdmFye2ZwfSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcuCitZb3UgbXVzdCBoYXZlIHBhc3NlZCBAY29kZXtQRVhfVVNFX1BJUEVTfSB0byB0aGUgQGNvZGV7cGV4X2luaXR9IGNhbGwKK3RoYXQgcmV0dXJuZWQgQHZhcntvYmp9LgorCitZb3UgbXVzdCBjbG9zZSBAdmFye2ZwfSB1c2luZyBAY29kZXtmY2xvc2V9IHlvdXJzZWxmIHdoZW4geW91IGhhdmUKK2ZpbmlzaGVkIHdyaXRpbmcgZGF0YSB0byB0aGUgcGlwZWxpbmUuCisKK1RoZSBmaWxlIGRlc2NyaXB0b3IgdW5kZXJseWluZyBAdmFye2ZwfSBpcyBtYXJrZWQgbm90IHRvIGJlIGluaGVyaXRlZAorYnkgY2hpbGQgcHJvY2Vzc2VzLgorCitPbiBzeXN0ZW1zIHRoYXQgZG8gbm90IHN1cHBvcnQgcGlwZXMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworQGNvZGV7TlVMTH0sIGFuZCBzZXRzIEBjb2Rle2Vycm5vfSB0byBAY29kZXtFSU5WQUx9LiAgSWYgeW91IHdvdWxkCitsaWtlIHRvIHdyaXRlIGNvZGUgdGhhdCBpcyBwb3J0YWJsZSB0byBhbGwgc3lzdGVtcyB0aGUgQGNvZGV7cGV4fQorZnVuY3Rpb25zIHN1cHBvcnQsIGNvbnNpZGVyIHVzaW5nIEBjb2Rle3BleF9pbnB1dF9maWxlfSBpbnN0ZWFkLgorCitUaGVyZSBhcmUgdHdvIG9wcG9ydHVuaXRpZXMgZm9yIGRlYWRsb2NrIHVzaW5nCitAY29kZXtwZXhfaW5wdXRfcGlwZX06CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitNb3N0IHN5c3RlbXMnIHBpcGVzIGNhbiBidWZmZXIgb25seSBhIGZpeGVkIGFtb3VudCBvZiBkYXRhOyBhIHByb2Nlc3MKK3RoYXQgd3JpdGVzIHRvIGEgZnVsbCBwaXBlIGJsb2Nrcy4gIFRodXMsIGlmIHlvdSB3cml0ZSB0byBAZmlsZXtmcH0KK2JlZm9yZSBzdGFydGluZyB0aGUgZmlyc3QgcHJvY2VzcywgeW91IHJ1biB0aGUgcmlzayBvZiBibG9ja2luZyB3aGVuCit0aGVyZSBpcyBubyBjaGlsZCBwcm9jZXNzIHlldCB0byByZWFkIHRoZSBkYXRhIGFuZCBhbGxvdyB5b3UgdG8KK2NvbnRpbnVlLiAgQGNvZGV7cGV4X2lucHV0X3BpcGV9IG1ha2VzIG5vIHByb21pc2VzIGFib3V0IHRoZQorc2l6ZSBvZiB0aGUgcGlwZSdzIGJ1ZmZlciwgc28gaWYgeW91IG5lZWQgdG8gd3JpdGUgYW55IGRhdGEgYXQgYWxsCitiZWZvcmUgc3RhcnRpbmcgdGhlIGZpcnN0IHByb2Nlc3MgaW4gdGhlIHBpcGVsaW5lLCBjb25zaWRlciB1c2luZworQGNvZGV7cGV4X2lucHV0X2ZpbGV9IGluc3RlYWQuCisKK0BpdGVtCitVc2luZyBAY29kZXtwZXhfaW5wdXRfcGlwZX0gYW5kIEBjb2Rle3BleF9yZWFkX291dHB1dH0gdG9nZXRoZXIKK21heSBhbHNvIGNhdXNlIGRlYWRsb2NrLiAgSWYgdGhlIG91dHB1dCBwaXBlIGZpbGxzIHVwLCBzbyB0aGF0IGVhY2gKK3Byb2dyYW0gaW4gdGhlIHBpcGVsaW5lIGlzIHdhaXRpbmcgZm9yIHRoZSBuZXh0IHRvIHJlYWQgbW9yZSBkYXRhLCBhbmQKK3lvdSBmaWxsIHRoZSBpbnB1dCBwaXBlIGJ5IHdyaXRpbmcgbW9yZSBkYXRhIHRvIEB2YXJ7ZnB9LCB0aGVuIHRoZXJlCitpcyBubyB3YXkgdG8gbWFrZSBwcm9ncmVzczogdGhlIG9ubHkgcHJvY2VzcyB0aGF0IGNvdWxkIHJlYWQgZGF0YSBmcm9tCit0aGUgb3V0cHV0IHBpcGUgaXMgeW91LCBidXQgeW91IGFyZSBibG9ja2VkIG9uIHRoZSBpbnB1dCBwaXBlLgorCitAZW5kIGl0ZW1pemUKKworQGVuZCBkZWZ0eXBlZm4KKworQGMgcGV4ZWN1dGUudHhoOjIzNwogQGRlZnR5cGVmbiBFeHRlbnNpb24ge2NvbnN0IGNoYXIgKn0gcGV4X29uZSAoaW50IEB2YXJ7ZmxhZ3N9LCBjb25zdCBjaGFyICpAdmFye2V4ZWN1dGFibGV9LCBjaGFyICogY29uc3QgKkB2YXJ7YXJndn0sIGNvbnN0IGNoYXIgKkB2YXJ7cG5hbWV9LCBjb25zdCBjaGFyICpAdmFye291dG5hbWV9LCBjb25zdCBjaGFyICpAdmFye2Vycm5hbWV9LCBpbnQgKkB2YXJ7c3RhdHVzfSwgaW50ICpAdmFye2Vycn0pCiAKIEFuIGludGVyZmFjZSB0byBwZXJtaXQgdGhlIGVhc3kgZXhlY3V0aW9uIG9mIGEKQEAgLTc0Nyw3ICs4MTAsNyBAQAogCiBAZW5kIGRlZnR5cGVmbgogCi1AYyBwZXhlY3V0ZS50eGg6MTMyCitAYyBwZXhlY3V0ZS50eGg6MTk0CiBAZGVmdHlwZWZuIEV4dGVuc2lvbiB7RklMRSAqfSBwZXhfcmVhZF9vdXRwdXQgKHN0cnVjdCBwZXhfb2JqICpAdmFye29ian0sIGludCBAdmFye2JpbmFyeX0pCiAKIFJldHVybnMgYSBAY29kZXtGSUxFfSBwb2ludGVyIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJlYWQgdGhlIHN0YW5kYXJkCkBAIC03NjAsNyArODIzLDcgQEAKIAogQGVuZCBkZWZ0eXBlZm4KIAotQGMgcGV4ZWN1dGUudHhoOjMyCitAYyBwZXhlY3V0ZS50eGg6MzMKIEBkZWZ0eXBlZm4gRXh0ZW5zaW9uIHtjb25zdCBjaGFyICp9IHBleF9ydW4gKHN0cnVjdCBwZXhfb2JqICpAdmFye29ian0sIGludCBAdmFye2ZsYWdzfSwgY29uc3QgY2hhciAqQHZhcntleGVjdXRhYmxlfSwgY2hhciAqIGNvbnN0ICpAdmFye2FyZ3Z9LCBjb25zdCBjaGFyICpAdmFye291dG5hbWV9LCBjb25zdCBjaGFyICpAdmFye2Vycm5hbWV9LCBpbnQgKkB2YXJ7ZXJyfSkKIAogRXhlY3V0ZSBvbmUgcHJvZ3JhbSBpbiBhIHBpcGVsaW5lLiAgT24gc3VjY2VzcyB0aGlzIHJldHVybnMKQEAgLTg2MSw3ICs5MjQsNyBAQAogCiBAZW5kIGRlZnR5cGVmbgogCi1AYyBwZXhlY3V0ZS50eGg6MTg3CitAYyBwZXhlY3V0ZS50eGg6MjQ5CiBAZGVmdHlwZWZuIEV4dGVuc2lvbiBpbnQgcGV4ZWN1dGUgKGNvbnN0IGNoYXIgKkB2YXJ7cHJvZ3JhbX0sIGNoYXIgKiBjb25zdCAqQHZhcnthcmd2fSwgY29uc3QgY2hhciAqQHZhcnt0aGlzX3BuYW1lfSwgY29uc3QgY2hhciAqQHZhcnt0ZW1wX2Jhc2V9LCBjaGFyICoqQHZhcntlcnJtc2dfZm10fSwgY2hhciAqKkB2YXJ7ZXJybXNnX2FyZ30sIGludCBmbGFncykKIAogVGhpcyBpcyB0aGUgb2xkIGludGVyZmFjZSB0byBleGVjdXRlIG9uZSBvciBtb3JlIHByb2dyYW1zLiAgSXQgaXMKQEAgLTg4OSw3ICs5NTIsNyBAQAogCiBAZW5kIGRlZnR5cGVmbgogCi1AYyBwZXhlY3V0ZS50eGg6MTk1CitAYyBwZXhlY3V0ZS50eGg6MjU3CiBAZGVmdHlwZWZuIEV4dGVuc2lvbiBpbnQgcHdhaXQgKGludCBAdmFye3BpZH0sIGludCAqQHZhcntzdGF0dXN9LCBpbnQgQHZhcntmbGFnc30pCiAKIEFub3RoZXIgcGFydCBvZiB0aGUgb2xkIGV4ZWN1dGlvbiBpbnRlcmZhY2UuCmRpZmYgLS1naXQgYS9saWJpYmVydHkvcGV4LWNvbW1vbi5jIGIvbGliaWJlcnR5L3BleC1jb21tb24uYwppbmRleCBkYjg0MmFlLi5lYmU4YzQzIDEwMDY0NAotLS0gYS9saWJpYmVydHkvcGV4LWNvbW1vbi5jCisrKyBiL2xpYmliZXJ0eS9wZXgtY29tbW9uLmMKQEAgLTY3LDYgKzY3LDcgQEAKICAgb2JqLT5zdGF0dXMgPSBOVUxMOwogICBvYmotPnRpbWUgPSBOVUxMOwogICBvYmotPm51bWJlcl93YWl0ZWQgPSAwOworICBvYmotPmlucHV0X2ZpbGUgPSBOVUxMOwogICBvYmotPnJlYWRfb3V0cHV0ID0gTlVMTDsKICAgb2JqLT5yZW1vdmVfY291bnQgPSAwOwogICBvYmotPnJlbW92ZSA9IE5VTEw7CkBAIC05MSw2ICs5Miw1NiBAQAogICBvYmotPnJlbW92ZVtvYmotPnJlbW92ZV9jb3VudCAtIDFdID0gYWRkOwogfQogCisvKiBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIG5hbWUgYmFzZWQgb24gT0JKLCBGTEFHUywgYW5kIE5BTUUuCisgICBSZXR1cm4gTlVMTCBpZiB3ZSB3ZXJlIHVuYWJsZSB0byByZXNlcnZlIGEgdGVtcG9yYXJ5IGZpbGVuYW1lLgorCisgICBJZiBub24tTlVMTCwgdGhlIHJlc3VsdCBpcyBlaXRoZXIgYWxsb2NhdGVkIHdpdGggbWFsbG9jLCBvciB0aGUKKyAgIHNhbWUgcG9pbnRlciBhcyBOQU1FLiAgKi8KK3N0YXRpYyBjaGFyICoKK3RlbXBfZmlsZSAoc3RydWN0IHBleF9vYmogKm9iaiwgaW50IGZsYWdzLCBjaGFyICpuYW1lKQoreworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChvYmotPnRlbXBiYXNlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBuYW1lID0gbWFrZV90ZW1wX2ZpbGUgKE5VTEwpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgbGVuID0gc3RybGVuIChvYmotPnRlbXBiYXNlKTsKKyAgICAgICAgICBpbnQgb3V0OworCisgICAgICAgICAgaWYgKGxlbiA+PSA2CisgICAgICAgICAgICAgICYmIHN0cmNtcCAob2JqLT50ZW1wYmFzZSArIGxlbiAtIDYsICJYWFhYWFgiKSA9PSAwKQorICAgICAgICAgICAgbmFtZSA9IHhzdHJkdXAgKG9iai0+dGVtcGJhc2UpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5hbWUgPSBjb25jYXQgKG9iai0+dGVtcGJhc2UsICJYWFhYWFgiLCBOVUxMKTsKKworICAgICAgICAgIG91dCA9IG1rc3RlbXBzIChuYW1lLCAwKTsKKyAgICAgICAgICBpZiAob3V0IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnJlZSAobmFtZSk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogVGhpcyBpc24ndCBvYmotPmZ1bmNzLT5jbG9zZSBiZWNhdXNlIHdlIGdvdCB0aGUKKyAgICAgICAgICAgICBkZXNjcmlwdG9yIGZyb20gbWtzdGVtcHMsIG5vdCBmcm9tIGEgZnVuY3Rpb24gaW4KKyAgICAgICAgICAgICBvYmotPmZ1bmNzLiAgQ2FsbGluZyBjbG9zZSBoZXJlIGlzIGp1c3QgbGlrZSB3aGF0CisgICAgICAgICAgICAgbWFrZV90ZW1wX2ZpbGUgZG9lcy4gICovCisgICAgICAgICAgY2xvc2UgKG91dCk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKChmbGFncyAmIFBFWF9TVUZGSVgpICE9IDApCisgICAgeworICAgICAgaWYgKG9iai0+dGVtcGJhc2UgPT0gTlVMTCkKKyAgICAgICAgbmFtZSA9IG1ha2VfdGVtcF9maWxlIChuYW1lKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbmFtZSA9IGNvbmNhdCAob2JqLT50ZW1wYmFzZSwgbmFtZSwgTlVMTCk7CisgICAgfQorCisgIHJldHVybiBuYW1lOworfQorCiAvKiBSdW4gYSBwcm9ncmFtLiAgKi8KIAogY29uc3QgY2hhciAqCkBAIC0xMTEsNiArMTYyLDE3IEBACiAgIG91dG5hbWUgPSAoY2hhciAqKSBvcmlnX291dG5hbWU7CiAgIG91dG5hbWVfYWxsb2NhdGVkID0gMDsKIAorICAvKiBJZiB0aGUgdXNlciBjYWxsZWQgcGV4X2lucHV0X2ZpbGUsIGNsb3NlIHRoZSBmaWxlIG5vdy4gICovCisgIGlmIChvYmotPmlucHV0X2ZpbGUpCisgICAgeworICAgICAgaWYgKGZjbG9zZSAob2JqLT5pbnB1dF9maWxlKSA9PSBFT0YpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJtc2cgPSAiY2xvc2luZyBwaXBlbGluZSBpbnB1dCBmaWxlIjsKKyAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgIH0KKyAgICAgIG9iai0+aW5wdXRfZmlsZSA9IE5VTEw7CisgICAgfQorCiAgIC8qIFNldCBJTi4gICovCiAKICAgaWYgKG9iai0+bmV4dF9pbnB1dF9uYW1lICE9IE5VTEwpCkBAIC0xNjEsNDkgKzIyMywxNiBAQAogICAgIH0KICAgZWxzZSBpZiAoKG9iai0+ZmxhZ3MgJiBQRVhfVVNFX1BJUEVTKSA9PSAwKQogICAgIHsKLSAgICAgIGlmIChvdXRuYW1lID09IE5VTEwpCi0JewotCSAgaWYgKG9iai0+dGVtcGJhc2UgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG91dG5hbWUgPSBtYWtlX3RlbXBfZmlsZSAoTlVMTCk7Ci0JICAgICAgb3V0bmFtZV9hbGxvY2F0ZWQgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gc3RybGVuIChvYmotPnRlbXBiYXNlKTsKKyAgICAgIG91dG5hbWUgPSB0ZW1wX2ZpbGUgKG9iaiwgZmxhZ3MsIG91dG5hbWUpOworICAgICAgaWYgKCEgb3V0bmFtZSkKKyAgICAgICAgeworICAgICAgICAgICplcnIgPSAwOworICAgICAgICAgIGVycm1zZyA9ICJjb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlIjsKKyAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgIH0KIAotCSAgICAgIGlmIChsZW4gPj0gNgotCQkgICYmIHN0cmNtcCAob2JqLT50ZW1wYmFzZSArIGxlbiAtIDYsICJYWFhYWFgiKSA9PSAwKQotCQlvdXRuYW1lID0geHN0cmR1cCAob2JqLT50ZW1wYmFzZSk7Ci0JICAgICAgZWxzZQotCQlvdXRuYW1lID0gY29uY2F0IChvYmotPnRlbXBiYXNlLCAiWFhYWFhYIiwgTlVMTCk7Ci0KLQkgICAgICBvdXRuYW1lX2FsbG9jYXRlZCA9IDE7Ci0KLQkgICAgICBvdXQgPSBta3N0ZW1wcyAob3V0bmFtZSwgMCk7Ci0JICAgICAgaWYgKG91dCA8IDApCi0JCXsKLQkJICAqZXJyID0gMDsKLQkJICBlcnJtc2cgPSAiY291bGQgbm90IGNyZWF0ZSB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGUiOwotCQkgIGdvdG8gZXJyb3JfZXhpdDsKLQkJfQotCi0JICAgICAgLyogVGhpcyBpc24ndCBvYmotPmZ1bmNzLT5jbG9zZSBiZWNhdXNlIHdlIGdvdCB0aGUKLQkJIGRlc2NyaXB0b3IgZnJvbSBta3N0ZW1wcywgbm90IGZyb20gYSBmdW5jdGlvbiBpbgotCQkgb2JqLT5mdW5jcy4gIENhbGxpbmcgY2xvc2UgaGVyZSBpcyBqdXN0IGxpa2Ugd2hhdAotCQkgbWFrZV90ZW1wX2ZpbGUgZG9lcy4gICovCi0JICAgICAgY2xvc2UgKG91dCk7Ci0JICAgICAgb3V0ID0gLTE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgoZmxhZ3MgJiBQRVhfU1VGRklYKSAhPSAwKQotCXsKLQkgIGlmIChvYmotPnRlbXBiYXNlID09IE5VTEwpCi0JICAgIG91dG5hbWUgPSBtYWtlX3RlbXBfZmlsZSAob3V0bmFtZSk7Ci0JICBlbHNlCi0JICAgIG91dG5hbWUgPSBjb25jYXQgKG9iai0+dGVtcGJhc2UsIG91dG5hbWUsIE5VTEwpOwotCSAgb3V0bmFtZV9hbGxvY2F0ZWQgPSAxOwotCX0KKyAgICAgIGlmIChvdXRuYW1lICE9IG9yaWdfb3V0bmFtZSkKKyAgICAgICAgb3V0bmFtZV9hbGxvY2F0ZWQgPSAxOwogCiAgICAgICBpZiAoKG9iai0+ZmxhZ3MgJiBQRVhfU0FWRV9URU1QUykgPT0gMCkKIAl7CkBAIC0yOTAsNiArMzE5LDg3IEBACiAgIHJldHVybiBlcnJtc2c7CiB9CiAKKy8qIFJldHVybiBhIEZJTEUgcG9pbnRlciBmb3IgYSB0ZW1wb3JhcnkgZmlsZSB0byBmaWxsIHdpdGggaW5wdXQgZm9yCisgICB0aGUgcGlwZWxpbmUuICAqLworRklMRSAqCitwZXhfaW5wdXRfZmlsZSAoc3RydWN0IHBleF9vYmogKm9iaiwgaW50IGZsYWdzLCBjb25zdCBjaGFyICppbl9uYW1lKQoreworICBjaGFyICpuYW1lID0gKGNoYXIgKikgaW5fbmFtZTsKKyAgRklMRSAqZjsKKworICAvKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgcGlwZWxpbmUgc3RhZ2UgaXMgcnVuLCBhbmQKKyAgICAgdGhlcmUgbXVzdCBub3QgaGF2ZSBiZWVuIGFueSBvdGhlciBpbnB1dCBzZWxlY3RlZC4gICovCisgIGlmIChvYmotPmNvdW50ICE9IDAKKyAgICAgIHx8IChvYmotPm5leHRfaW5wdXQgPj0gMCAmJiBvYmotPm5leHRfaW5wdXQgIT0gU1RESU5fRklMRV9OTykKKyAgICAgIHx8IG9iai0+bmV4dF9pbnB1dF9uYW1lKQorICAgIHsKKyAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIG5hbWUgPSB0ZW1wX2ZpbGUgKG9iaiwgZmxhZ3MsIG5hbWUpOworICBpZiAoISBuYW1lKQorICAgIHJldHVybiBOVUxMOworCisgIGYgPSBmb3BlbiAobmFtZSwgKGZsYWdzICYgUEVYX0JJTkFSWV9PVVRQVVQpID8gIndiIiA6ICJ3Iik7CisgIGlmICghIGYpCisgICAgeworICAgICAgZnJlZSAobmFtZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgb2JqLT5pbnB1dF9maWxlID0gZjsKKyAgb2JqLT5uZXh0X2lucHV0X25hbWUgPSBuYW1lOworICBvYmotPm5leHRfaW5wdXRfbmFtZV9hbGxvY2F0ZWQgPSAobmFtZSAhPSBpbl9uYW1lKTsKKworICByZXR1cm4gZjsKK30KKworLyogUmV0dXJuIGEgc3RyZWFtIGZvciBhIHBpcGUgY29ubmVjdGVkIHRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiB0aGUKKyAgIGZpcnN0IHN0YWdlIG9mIHRoZSBwaXBlbGluZS4gICovCitGSUxFICoKK3BleF9pbnB1dF9waXBlIChzdHJ1Y3QgcGV4X29iaiAqb2JqLCBpbnQgYmluYXJ5KQoreworICBpbnQgcFsyXTsKKyAgRklMRSAqZjsKKworICAvKiBZb3UgbXVzdCBjYWxsIHBleF9pbnB1dF9waXBlIGJlZm9yZSB0aGUgZmlyc3QgcGV4X3J1biBvciBwZXhfb25lLiAgKi8KKyAgaWYgKG9iai0+Y291bnQgPiAwKQorICAgIGdvdG8gdXNhZ2VfZXJyb3I7CisKKyAgLyogWW91IG11c3QgYmUgdXNpbmcgcGlwZXMuICBJbXBsZW1lbnRhdGlvbnMgdGhhdCBkb24ndCBzdXBwb3J0CisgICAgIHBpcGVzIGNsZWFyIHRoaXMgZmxhZyBiZWZvcmUgY2FsbGluZyBwZXhfaW5pdF9jb21tb24uICAqLworICBpZiAoISAob2JqLT5mbGFncyAmIFBFWF9VU0VfUElQRVMpKQorICAgIGdvdG8gdXNhZ2VfZXJyb3I7CisKKyAgLyogSWYgd2UgaGF2ZSBzb21laG93IGFscmVhZHkgc2VsZWN0ZWQgb3RoZXIgaW5wdXQsIHRoYXQncyBhCisgICAgIG1pc3Rha2UuICAqLworICBpZiAoKG9iai0+bmV4dF9pbnB1dCA+PSAwICYmIG9iai0+bmV4dF9pbnB1dCAhPSBTVERJTl9GSUxFX05PKQorICAgICAgfHwgb2JqLT5uZXh0X2lucHV0X25hbWUpCisgICAgZ290byB1c2FnZV9lcnJvcjsKKworICBpZiAob2JqLT5mdW5jcy0+cGlwZSAob2JqLCBwLCBiaW5hcnkgIT0gMCkgPCAwKQorICAgIHJldHVybiBOVUxMOworCisgIGYgPSBvYmotPmZ1bmNzLT5mZG9wZW53IChvYmosIHBbV1JJVEVfUE9SVF0sIGJpbmFyeSAhPSAwKTsKKyAgaWYgKCEgZikKKyAgICB7CisgICAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKyAgICAgIG9iai0+ZnVuY3MtPmNsb3NlIChvYmosIHBbUkVBRF9QT1JUXSk7CisgICAgICBvYmotPmZ1bmNzLT5jbG9zZSAob2JqLCBwW1dSSVRFX1BPUlRdKTsKKyAgICAgIGVycm5vID0gc2F2ZWRfZXJybm87CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgb2JqLT5uZXh0X2lucHV0ID0gcFtSRUFEX1BPUlRdOworCisgIHJldHVybiBmOworCisgdXNhZ2VfZXJyb3I6CisgIGVycm5vID0gRUlOVkFMOworICByZXR1cm4gTlVMTDsKK30KKwogLyogUmV0dXJuIGEgRklMRSBwb2ludGVyIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBsYXN0IHByb2dyYW0KICAgIGV4ZWN1dGVkLiAgKi8KIApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3BleC1jb21tb24uaCBiL2xpYmliZXJ0eS9wZXgtY29tbW9uLmgKaW5kZXggYjcwYjM4ZC4uOGRlZDEzOCAxMDA2NDQKLS0tIGEvbGliaWJlcnR5L3BleC1jb21tb24uaAorKysgYi9saWJpYmVydHkvcGV4LWNvbW1vbi5oCkBAIC02OSw2ICs2OSw4IEBACiAgIHN0cnVjdCBwZXhfdGltZSAqdGltZTsKICAgLyogTnVtYmVyIG9mIGNoaWxkcmVuIHdlIGhhdmUgYWxyZWFkeSB3YWl0ZWQgZm9yLiAgKi8KICAgaW50IG51bWJlcl93YWl0ZWQ7CisgIC8qIEZJTEUgY3JlYXRlZCBieSBwZXhfaW5wdXRfZmlsZS4gICovCisgIEZJTEUgKmlucHV0X2ZpbGU7CiAgIC8qIEZJTEUgY3JlYXRlZCBieSBwZXhfcmVhZF9vdXRwdXQuICAqLwogICBGSUxFICpyZWFkX291dHB1dDsKICAgLyogTnVtYmVyIG9mIHRlbXBvcmFyeSBmaWxlcyB0byByZW1vdmUuICAqLwpAQCAtMTIxLDYgKzEyMywxMSBAQAogICAgICBQRVhfVVNFX1BJUEVTIGlzIHNldCkuICBJZiBCSU5BUlkgaXMgbm9uLXplcm8sIG9wZW4gaW4gYmluYXJ5CiAgICAgIG1vZGUuICBSZXR1cm4gcG9pbnRlciBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yLiAgKi8KICAgRklMRSAqICgqZmRvcGVucikgKHN0cnVjdCBwZXhfb2JqICosIGludCAvKiBmZCAqLywgaW50IC8qIGJpbmFyeSAqLyk7CisgIC8qIEdldCBhIEZJTEUgcG9pbnRlciB0byB3cml0ZSB0byB0aGUgZmlsZSBkZXNjcmlwdG9yIEZEIChvbmx5CisgICAgIGNhbGxlZCBpZiBQRVhfVVNFX1BJUEVTIGlzIHNldCkuICBJZiBCSU5BUlkgaXMgbm9uLXplcm8sIG9wZW4gaW4KKyAgICAgYmluYXJ5IG1vZGUuICBBcnJhbmdlIGZvciBGRCBub3QgdG8gYmUgaW5oZXJpdGVkIGJ5IHRoZSBjaGlsZAorICAgICBwcm9jZXNzZXMuICBSZXR1cm4gcG9pbnRlciBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yLiAgKi8KKyAgRklMRSAqICgqZmRvcGVudykgKHN0cnVjdCBwZXhfb2JqICosIGludCAvKiBmZCAqLywgaW50IC8qIGJpbmFyeSAqLyk7CiAgIC8qIEZyZWUgYW55IHN5c3RlbSBkZXBlbmRlbnQgZGF0YSBhc3NvY2lhdGVkIHdpdGggT0JKLiAgTWF5IGJlCiAgICAgIE5VTEwgaWYgdGhlcmUgaXMgbm90aGluZyB0byBkby4gICovCiAgIHZvaWQgKCpjbGVhbnVwKSAoc3RydWN0IHBleF9vYmogKik7CmRpZmYgLS1naXQgYS9saWJpYmVydHkvcGV4LWRqZ3BwLmMgYi9saWJpYmVydHkvcGV4LWRqZ3BwLmMKaW5kZXggNmU1OGUzZi4uMTdmYmYyYyAxMDA2NDQKLS0tIGEvbGliaWJlcnR5L3BleC1kamdwcC5jCisrKyBiL2xpYmliZXJ0eS9wZXgtZGpncHAuYwpAQCAtNjIsNiArNjIsNyBAQAogICBwZXhfZGpncHBfd2FpdCwKICAgTlVMTCwgLyogcGlwZSAqLwogICBOVUxMLCAvKiBmZG9wZW5yICovCisgIE5VTEwsIC8qIGZkb3BlbncgKi8KICAgTlVMTCAgLyogY2xlYW51cCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3BleC1tc2Rvcy5jIGIvbGliaWJlcnR5L3BleC1tc2Rvcy5jCmluZGV4IDIyNTYxMTcuLmRiMjIzMzcgMTAwNjQ0Ci0tLSBhL2xpYmliZXJ0eS9wZXgtbXNkb3MuYworKysgYi9saWJpYmVydHkvcGV4LW1zZG9zLmMKQEAgLTczLDYgKzczLDcgQEAKICAgcGV4X21zZG9zX3dhaXQsCiAgIE5VTEwsIC8qIHBpcGUgKi8KICAgTlVMTCwgLyogZmRvcGVuciAqLworICBOVUxMLCAvKiBmZG9wZW53ICovCiAgIHBleF9tc2Rvc19jbGVhbnVwCiB9OwogCmRpZmYgLS1naXQgYS9saWJpYmVydHkvcGV4LXVuaXguYyBiL2xpYmliZXJ0eS9wZXgtdW5peC5jCmluZGV4IDM1YTU0NWMuLmM5MmE0MjkgMTAwNjQ0Ci0tLSBhL2xpYmliZXJ0eS9wZXgtdW5peC5jCisrKyBiL2xpYmliZXJ0eS9wZXgtdW5peC5jCkBAIC0yNzcsNiArMjc3LDcgQEAKIAkJCSAgaW50LCBjb25zdCBjaGFyICoqLCBpbnQgKik7CiBzdGF0aWMgaW50IHBleF91bml4X3BpcGUgKHN0cnVjdCBwZXhfb2JqICosIGludCAqLCBpbnQpOwogc3RhdGljIEZJTEUgKnBleF91bml4X2Zkb3BlbnIgKHN0cnVjdCBwZXhfb2JqICosIGludCwgaW50KTsKK3N0YXRpYyBGSUxFICpwZXhfdW5peF9mZG9wZW53IChzdHJ1Y3QgcGV4X29iaiAqLCBpbnQsIGludCk7CiBzdGF0aWMgdm9pZCBwZXhfdW5peF9jbGVhbnVwIChzdHJ1Y3QgcGV4X29iaiAqKTsKIAogLyogVGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHdlIHBhc3MgdG8gdGhlIGNvbW1vbiByb3V0aW5lcy4gICovCkBAIC0yOTAsNiArMjkxLDcgQEAKICAgcGV4X3VuaXhfd2FpdCwKICAgcGV4X3VuaXhfcGlwZSwKICAgcGV4X3VuaXhfZmRvcGVuciwKKyAgcGV4X3VuaXhfZmRvcGVudywKICAgcGV4X3VuaXhfY2xlYW51cAogfTsKIApAQCAtNDk1LDYgKzQ5NywxNSBAQAogICByZXR1cm4gZmRvcGVuIChmZCwgInIiKTsKIH0KIAorc3RhdGljIEZJTEUgKgorcGV4X3VuaXhfZmRvcGVudyAoc3RydWN0IHBleF9vYmogKm9iaiBBVFRSSUJVVEVfVU5VU0VELCBpbnQgZmQsCisJCSAgaW50IGJpbmFyeSBBVFRSSUJVVEVfVU5VU0VEKQoreworICBpZiAoZmNudGwgKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA8IDApCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBmZG9wZW4gKGZkLCAidyIpOworfQorCiBzdGF0aWMgdm9pZAogcGV4X3VuaXhfY2xlYW51cCAoc3RydWN0IHBleF9vYmogKm9iaiBBVFRSSUJVVEVfVU5VU0VEKQogewpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3BleC13aW4zMi5jIGIvbGliaWJlcnR5L3BleC13aW4zMi5jCmluZGV4IGVkNDVlNWIuLjA0NmYzOTMgMTAwNjQ0Ci0tLSBhL2xpYmliZXJ0eS9wZXgtd2luMzIuYworKysgYi9saWJpYmVydHkvcGV4LXdpbjMyLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KIAogLyogbWluZ3czMiBoZWFkZXJzIG1heSBub3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcuICAqLwogCkBAIC03MiwxMTUgKzczLDYgQEAKICAgcmV0dXJuOwogfQogCi0vKiBUaGlzIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgdGhlIE1pY3Jvc29mdCBDIHNwYXduIGZ1bmN0aW9ucycgcHJvcGVuc2l0eQotICAgdG8gcmVtb3ZlIHRoZSBvdXRlcm1vc3Qgc2V0IG9mIGRvdWJsZSBxdW90ZXMgZnJvbSBhbGwgYXJndW1lbnRzLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCAqCi1maXhfYXJndiAoY2hhciAqIGNvbnN0ICphcmd2ZWMpCi17Ci0gIGNoYXIgKiphcmd2OwotICBpbnQgaTsKLSAgY2hhciAqY29tbWFuZDA7Ci0KLSAgLyogU2VlIHdoZXRoZXIgd2UgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBmb3IgKGNvbW1hbmQwID0gYXJndmVjWzBdOyAqY29tbWFuZDAgIT0gJ1wwJzsgY29tbWFuZDArKykKLSAgICBpZiAoKmNvbW1hbmQwID09ICcvJykKLSAgICAgIGJyZWFrOwotICBpZiAoKmNvbW1hbmQwID09ICdcMCcpCi0gICAgewotICAgICAgZm9yIChpID0gMTsgYXJndmVjW2ldICE9IE5VTEw7IGkrKykKLQlpZiAoc3RycGJyayAoYXJndmVjW2ldLCAiXCIgXHQiKSAhPSBOVUxMKQotCSAgYnJlYWs7Ci0KLSAgICAgIGlmIChhcmd2ZWNbaV0gPT0gTlVMTCkKLQlyZXR1cm4gKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBhcmd2ZWM7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGFyZ3ZlY1tpXSAhPSBOVUxMOyBpKyspCi0gICAgOwotICBhcmd2ID0gWE5FV1ZFQyAoY2hhciAqLCBpICsgMik7Ci0KLSAgYXJndisrOwkvKiBMZWF2ZSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGFyZ3YKLQkJICAgZm9yIHBvdGVudGlhbCAjISBoYW5kbGluZyAqLwotCi0gIGZvciAoaSA9IDA7IGFyZ3ZlY1tpXSAhPSBOVUxMOyBpKyspCi0gICAgYXJndltpXSA9IHhzdHJkdXAgKGFyZ3ZlY1tpXSk7Ci0gIGFyZ3ZbaV0gPSBOVUxMOwotCi0gIGJhY2tzbGFzaGlmeSAoYXJndlswXSk7Ci0KLSAgZm9yIChpID0gMTsgYXJndltpXSAhPSAwOyBpKyspCi0gICAgewotICAgICAgaW50IGxlbiwgajsKLSAgICAgIGNoYXIgKnRlbXAsICpuZXd0ZW1wOwotCi0gICAgICB0ZW1wID0gYXJndltpXTsKLSAgICAgIGxlbiA9IHN0cmxlbiAodGVtcCk7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodGVtcFtqXSA9PSAnIicpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5ld3RlbXAgPSBYTkVXVkVDIChjaGFyLCBsZW4gKyAyKTsKLSAgICAgICAgICAgICAgc3RybmNweSAobmV3dGVtcCwgdGVtcCwgaik7Ci0gICAgICAgICAgICAgIG5ld3RlbXAgW2pdID0gJ1xcJzsKLSAgICAgICAgICAgICAgc3RybmNweSAoJm5ld3RlbXAgW2orMV0sICZ0ZW1wIFtqXSwgbGVuLWopOwotICAgICAgICAgICAgICBuZXd0ZW1wIFtsZW4rMV0gPSAwOwotICAgICAgICAgICAgICB0ZW1wID0gbmV3dGVtcDsKLSAgICAgICAgICAgICAgbGVuKys7Ci0gICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICBpZiAoYXJndltpXSAhPSB0ZW1wKQotCXsKLQkgIGZyZWUgKGFyZ3ZbaV0pOwotCSAgYXJndltpXSA9IHRlbXA7Ci0JfQotICAgIH0KLQotICBmb3IgKGkgPSAwOyBhcmd2W2ldICE9IDA7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RycGJyayAoYXJndltpXSwgIiBcdCIpKQotICAgICAgICB7Ci0JICBpbnQgbGVuLCB0cmFpbGluZ19iYWNrc2xhc2g7Ci0JICBjaGFyICp0ZW1wOwotCi0JICBsZW4gPSBzdHJsZW4gKGFyZ3ZbaV0pOwotCSAgdHJhaWxpbmdfYmFja3NsYXNoID0gMDsKLQotCSAgLyogVGhlcmUgaXMgYW4gYWRkZWQgY29tcGxpY2F0aW9uIHdoZW4gYW4gYXJnIHdpdGggZW1iZWRkZWQgd2hpdGUKLQkgICAgIHNwYWNlIGVuZHMgaW4gYSBiYWNrc2xhc2ggKHN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2YgLWlwcmVmaXggYXJnCi0JICAgICBwYXNzZWQgdG8gY3BwKS4gVGhlIHJlc3VsdGluZyBxdW90ZWQgc3RyaW5ncyBnZXRzIG1pc2ludGVycHJldGVkCi0JICAgICBieSB0aGUgY29tbWFuZCBpbnRlcnByZXRlciAtLSBpdCB0aGlua3MgdGhhdCB0aGUgZW5kaW5nIHF1b3RlCi0JICAgICBpcyBlc2NhcGVkIGJ5IHRoZSB0cmFpbGluZyBiYWNrc2xhc2ggYW5kIHRoaW5ncyBnZXQgY29uZnVzZWQuCi0JICAgICBXZSBoYW5kbGUgdGhpcyBjYXNlIGJ5IGVzY2FwaW5nIHRoZSB0cmFpbGluZyBiYWNrc2xhc2gsIHByb3ZpZGVkCi0JICAgICBpdCB3YXMgbm90IGVzY2FwZWQgaW4gdGhlIGZpcnN0IHBsYWNlLiAgKi8KLQkgIGlmIChsZW4gPiAxCi0JICAgICAgJiYgYXJndltpXVtsZW4tMV0gPT0gJ1xcJwotCSAgICAgICYmIGFyZ3ZbaV1bbGVuLTJdICE9ICdcXCcpCi0JICAgIHsKLQkgICAgICB0cmFpbGluZ19iYWNrc2xhc2ggPSAxOwotCSAgICAgICsrbGVuOwkJCS8qIHRvIGVzY2FwZSB0aGUgZmluYWwgYmFja3NsYXNoLiAqLwotCSAgICB9Ci0KLQkgIGxlbiArPSAyOwkJCS8qIGFuZCBmb3IgdGhlIGVuY2xvc2luZyBxdW90ZXMuICovCi0KLQkgIHRlbXAgPSBYTkVXVkVDIChjaGFyLCBsZW4gKyAxKTsKLQkgIHRlbXBbMF0gPSAnIic7Ci0JICBzdHJjcHkgKHRlbXAgKyAxLCBhcmd2W2ldKTsKLQkgIGlmICh0cmFpbGluZ19iYWNrc2xhc2gpCi0JICAgIHRlbXBbbGVuIC0gMl0gPSAnXFwnOwotCSAgdGVtcFtsZW4gLSAxXSA9ICciJzsKLQkgIHRlbXBbbGVuXSA9ICdcMCc7Ci0KLQkgIGZyZWUgKGFyZ3ZbaV0pOwotCSAgYXJndltpXSA9IHRlbXA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBhcmd2OwotfQotCiBzdGF0aWMgaW50IHBleF93aW4zMl9vcGVuX3JlYWQgKHN0cnVjdCBwZXhfb2JqICosIGNvbnN0IGNoYXIgKiwgaW50KTsKIHN0YXRpYyBpbnQgcGV4X3dpbjMyX29wZW5fd3JpdGUgKHN0cnVjdCBwZXhfb2JqICosIGNvbnN0IGNoYXIgKiwgaW50KTsKIHN0YXRpYyBsb25nIHBleF93aW4zMl9leGVjX2NoaWxkIChzdHJ1Y3QgcGV4X29iaiAqLCBpbnQsIGNvbnN0IGNoYXIgKiwKQEAgLTE5MSw2ICs4Myw3IEBACiAJCQkgICBzdHJ1Y3QgcGV4X3RpbWUgKiwgaW50LCBjb25zdCBjaGFyICoqLCBpbnQgKik7CiBzdGF0aWMgaW50IHBleF93aW4zMl9waXBlIChzdHJ1Y3QgcGV4X29iaiAqLCBpbnQgKiwgaW50KTsKIHN0YXRpYyBGSUxFICpwZXhfd2luMzJfZmRvcGVuciAoc3RydWN0IHBleF9vYmogKiwgaW50LCBpbnQpOworc3RhdGljIEZJTEUgKnBleF93aW4zMl9mZG9wZW53IChzdHJ1Y3QgcGV4X29iaiAqLCBpbnQsIGludCk7CiAKIC8qIFRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB3ZSBwYXNzIHRvIHRoZSBjb21tb24gcm91dGluZXMuICAqLwogCkBAIC0yMDMsNiArOTYsNyBAQAogICBwZXhfd2luMzJfd2FpdCwKICAgcGV4X3dpbjMyX3BpcGUsCiAgIHBleF93aW4zMl9mZG9wZW5yLAorICBwZXhfd2luMzJfZmRvcGVudywKICAgTlVMTCAvKiBjbGVhbnVwICovCiB9OwogCkBAIC00MjIsOCArMzE2LDIyNSBAQAogfQogI2VuZGlmCiAKKy8qIFJldHVybiBhIFdpbmRvd3MgY29tbWFuZC1saW5lIGZyb20gQVJHVi4gIEl0IGlzIHRoZSBjYWxsZXIncworICAgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUgc3RyaW5nIHJldHVybmVkLiAgKi8KKworc3RhdGljIGNoYXIgKgorYXJndl90b19jbWRsaW5lIChjaGFyICpjb25zdCAqYXJndikKK3sKKyAgY2hhciAqY21kbGluZTsKKyAgY2hhciAqcDsKKyAgc2l6ZV90IGNtZGxpbmVfbGVuOworICBpbnQgaSwgaiwgazsKKworICBjbWRsaW5lX2xlbiA9IDA7CisgIGZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykKKyAgICB7CisgICAgICAvKiBXZSBxdW90ZSBldmVyeSBsYXN0IGFyZ3VtZW50LiAgVGhpcyBzaW1wbGlmaWVzIHRoZSBwcm9ibGVtOworCSB3ZSBuZWVkIG9ubHkgZXNjYXBlIGVtYmVkZGVkIGRvdWJsZS1xdW90ZXMgYW5kIGltbWVkaWF0ZWx5CisJIHByZWNlZWRpbmcgYmFja3NsYXNoIGNoYXJhY3RlcnMuICBBIHNlcXVlbmNlIG9mIGJhY2tzbGFjaCBjaGFyYWN0ZXJzCisJIHRoYXQgaXMgbm90IGZvbGx3ZWQgYnkgYSBkb3VibGUgcXVvdGUgY2hhcmFjdGVyIHdpbGwgbm90IGJlCisJIGVzY2FwZWQuICAqLworICAgICAgZm9yIChqID0gMDsgYXJndltpXVtqXTsgaisrKQorCXsKKwkgIGlmIChhcmd2W2ldW2pdID09ICciJykKKwkgICAgeworCSAgICAgIC8qIEVzY2FwZSBwcmVjZWVkaW5nIGJhY2tzbGFzaGVzLiAgKi8KKwkgICAgICBmb3IgKGsgPSBqIC0gMTsgayA+PSAwICYmIGFyZ3ZbaV1ba10gPT0gJ1xcJzsgay0tKQorCQljbWRsaW5lX2xlbisrOworCSAgICAgIC8qIEVzY2FwZSB0aGUgcW90ZSBjaGFyYWN0ZXIuICAqLworCSAgICAgIGNtZGxpbmVfbGVuKys7CisJICAgIH0KKwl9CisgICAgICAvKiBUcmFpbGluZyBiYWNrc2xhc2hlcyBhbHNvIG5lZWQgdG8gYmUgZXNjYXBlZCBiZWNhdXNlIHRoZXkgd2lsbCBiZQorICAgICAgICAgZm9sbG93ZWQgYnkgdGhlIHRlcm1pbmF0aW5nIHF1b3RlLiAgKi8KKyAgICAgIGZvciAoayA9IGogLSAxOyBrID49IDAgJiYgYXJndltpXVtrXSA9PSAnXFwnOyBrLS0pCisJY21kbGluZV9sZW4rKzsKKyAgICAgIGNtZGxpbmVfbGVuICs9IGo7CisgICAgICBjbWRsaW5lX2xlbiArPSAzOyAgLyogZm9yIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHF1b3RlcyBhbmQgc3BhY2UgKi8KKyAgICB9CisgIGNtZGxpbmUgPSB4bWFsbG9jIChjbWRsaW5lX2xlbik7CisgIHAgPSBjbWRsaW5lOworICBmb3IgKGkgPSAwOyBhcmd2W2ldOyBpKyspCisgICAgeworICAgICAgKnArKyA9ICciJzsKKyAgICAgIGZvciAoaiA9IDA7IGFyZ3ZbaV1bal07IGorKykKKwl7CisJICBpZiAoYXJndltpXVtqXSA9PSAnIicpCisJICAgIHsKKwkgICAgICBmb3IgKGsgPSBqIC0gMTsgayA+PSAwICYmIGFyZ3ZbaV1ba10gPT0gJ1xcJzsgay0tKQorCQkqcCsrID0gJ1xcJzsKKwkgICAgICAqcCsrID0gJ1xcJzsKKwkgICAgfQorCSAgKnArKyA9IGFyZ3ZbaV1bal07CisJfQorICAgICAgZm9yIChrID0gaiAtIDE7IGsgPj0gMCAmJiBhcmd2W2ldW2tdID09ICdcXCc7IGstLSkKKwkqcCsrID0gJ1xcJzsKKyAgICAgICpwKysgPSAnIic7CisgICAgICAqcCsrID0gJyAnOworICAgIH0KKyAgcFstMV0gPSAnXDAnOworICByZXR1cm4gY21kbGluZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0CitzdGRfc3VmZml4ZXNbXSA9IHsKKyAgIi5jb20iLAorICAiLmV4ZSIsCisgICIuYmF0IiwKKyAgIi5jbWQiLAorICAwCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0Citub19zdWZmaXhlc1tdID0geworICAiIiwKKyAgMAorfTsKKworLyogUmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIFBST0dSQU0uICBJZiBTRUFSQ0ggaXMgdHJ1ZSwgbG9vayBmb3IKKyAgIFBST0dSQU0gaW4gZWFjaCBkaXJlY3RvcnkgaW4gUEFUSC4gICovCisKK3N0YXRpYyBjaGFyICoKK2ZpbmRfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcHJvZ3JhbSwgQk9PTCBzZWFyY2gpCit7CisgIGNoYXIgKmZ1bGxfZXhlY3V0YWJsZTsKKyAgY2hhciAqZTsKKyAgc2l6ZV90IGZlX2xlbjsKKyAgY29uc3QgY2hhciAqcGF0aCA9IDA7CisgIGNvbnN0IGNoYXIgKmNvbnN0ICpleHQ7CisgIGNvbnN0IGNoYXIgKnAsICpxOworICBzaXplX3QgcHJvZ2xlbiA9IHN0cmxlbiAocHJvZ3JhbSk7CisgIGludCBoYXNfZXh0ZW5zaW9uID0gISFzdHJjaHIgKHByb2dyYW0sICcuJyk7CisgIGludCBoYXNfc2xhc2ggPSAoc3RyY2hyIChwcm9ncmFtLCAnLycpIHx8IHN0cmNociAocHJvZ3JhbSwgJ1xcJykpOworICBIQU5ETEUgaDsKKworICBpZiAoaGFzX3NsYXNoKQorICAgIHNlYXJjaCA9IEZBTFNFOworCisgIGlmIChzZWFyY2gpCisgICAgcGF0aCA9IGdldGVudiAoIlBBVEgiKTsKKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSAiIjsKKworICBmZV9sZW4gPSAwOworICBmb3IgKHAgPSBwYXRoOyAqcDsgcCA9IHEpCisgICAgeworICAgICAgcSA9IHA7CisgICAgICB3aGlsZSAoKnEgIT0gJzsnICYmICpxICE9ICdcMCcpCisJcSsrOworICAgICAgaWYgKChzaXplX3QpKHEgLSBwKSA+IGZlX2xlbikKKwlmZV9sZW4gPSBxIC0gcDsKKyAgICAgIGlmICgqcSA9PSAnOycpCisJcSsrOworICAgIH0KKyAgZmVfbGVuID0gZmVfbGVuICsgMSArIHByb2dsZW4gKyAoaGFzX2V4dGVuc2lvbiA/IDEgOiA1KTsKKyAgZnVsbF9leGVjdXRhYmxlID0geG1hbGxvYyAoZmVfbGVuKTsKKworICBwID0gcGF0aDsKKyAgZG8KKyAgICB7CisgICAgICBxID0gcDsKKyAgICAgIHdoaWxlICgqcSAhPSAnOycgJiYgKnEgIT0gJ1wwJykKKwlxKys7CisKKyAgICAgIGUgPSBmdWxsX2V4ZWN1dGFibGU7CisgICAgICBtZW1jcHkgKGUsIHAsIHEgLSBwKTsKKyAgICAgIGUgKz0gKHEgLSBwKTsKKyAgICAgIGlmIChxIC0gcCkKKwkqZSsrID0gJ1xcJzsKKyAgICAgIHN0cmNweSAoZSwgcHJvZ3JhbSk7CisKKyAgICAgIGlmICgqcSA9PSAnOycpCisJcSsrOworCisgICAgICBmb3IgKGUgPSBmdWxsX2V4ZWN1dGFibGU7ICplOyBlKyspCisJaWYgKCplID09ICcvJykKKwkgICplID0gJ1xcJzsKKworICAgICAgLyogQXQgdGhpcyBwb2ludCwgZSBwb2ludHMgdG8gdGhlIHRlcm1pbmF0aW5nIE5VTCBjaGFyYWN0ZXIgZm9yCisgICAgICAgICBmdWxsX2V4ZWN1dGFibGUuICAqLworICAgICAgZm9yIChleHQgPSBoYXNfZXh0ZW5zaW9uID8gbm9fc3VmZml4ZXMgOiBzdGRfc3VmZml4ZXM7ICpleHQ7IGV4dCsrKQorCXsKKwkgIC8qIFJlbW92ZSBhbnkgY3VycmVudCBleHRlbnNpb24uICAqLworCSAgKmUgPSAnXDAnOworCSAgLyogQWRkIHRoZSBuZXcgb25lLiAgKi8KKwkgIHN0cmNhdCAoZnVsbF9leGVjdXRhYmxlLCAqZXh0KTsKKworCSAgLyogQXR0ZW1wdCB0byBvcGVuIHRoaXMgZmlsZS4gICovCisJICBoID0gQ3JlYXRlRmlsZSAoZnVsbF9leGVjdXRhYmxlLCBHRU5FUklDX1JFQUQsCisJCQkgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsCisJCQkgIDAsIE9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgMCk7CisJICBpZiAoaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkgICAgZ290byBmb3VuZDsKKwl9CisgICAgICBwID0gcTsKKyAgICB9CisgIHdoaWxlICgqcCk7CisgIGZyZWUgKGZ1bGxfZXhlY3V0YWJsZSk7CisgIHJldHVybiAwOworCisgZm91bmQ6CisgIENsb3NlSGFuZGxlIChoKTsKKyAgcmV0dXJuIGZ1bGxfZXhlY3V0YWJsZTsKK30KKworLyogTG93LWxldmVsIHByb2Nlc3MgY3JlYXRpb24gZnVuY3Rpb24uICAqLworCiBzdGF0aWMgbG9uZwotc3Bhd25fc2NyaXB0IChjb25zdCBjaGFyICpleGVjdXRhYmxlLCBjb25zdCBjaGFyICogY29uc3QgKiBhcmd2KQord2luMzJfc3Bhd24gKGNvbnN0IGNoYXIgKmV4ZWN1dGFibGUsCisJICAgICBCT09MIHNlYXJjaCwKKwkgICAgIGNoYXIgKmNvbnN0ICphcmd2LAorCSAgICAgRFdPUkQgZHdDcmVhdGlvbkZsYWdzLAorCSAgICAgTFBTVEFSVFVQSU5GTyBzaSwKKwkgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBwaSkKK3sKKyAgY2hhciAqZnVsbF9leGVjdXRhYmxlOworICBjaGFyICpjbWRsaW5lOworCisgIGZ1bGxfZXhlY3V0YWJsZSA9IE5VTEw7CisgIGNtZGxpbmUgPSBOVUxMOworCisgIGZ1bGxfZXhlY3V0YWJsZSA9IGZpbmRfZXhlY3V0YWJsZSAoZXhlY3V0YWJsZSwgc2VhcmNoKTsKKyAgaWYgKCFmdWxsX2V4ZWN1dGFibGUpCisgICAgZ290byBlcnJvcjsKKyAgY21kbGluZSA9IGFyZ3ZfdG9fY21kbGluZSAoYXJndik7CisgIGlmICghY21kbGluZSkKKyAgICBnb3RvIGVycm9yOworICAgIAorICAvKiBDcmVhdGUgdGhlIGNoaWxkIHByb2Nlc3MuICAqLyAgCisgIGlmICghQ3JlYXRlUHJvY2VzcyAoZnVsbF9leGVjdXRhYmxlLCBjbWRsaW5lLCAKKwkJICAgICAgLypscFByb2Nlc3NBdHRyaWJ1dGVzPSovTlVMTCwKKwkJICAgICAgLypscFRocmVhZEF0dHJpYnV0ZXM9Ki9OVUxMLAorCQkgICAgICAvKmJJbmhlcml0SGFuZGxlcz0qL1RSVUUsCisJCSAgICAgIGR3Q3JlYXRpb25GbGFncywKKwkJICAgICAgLypscEVudmlyb25tZW50PSovTlVMTCwKKwkJICAgICAgLypscEN1cnJlbnREaXJlY3Rvcnk9Ki9OVUxMLAorCQkgICAgICBzaSwKKwkJICAgICAgcGkpKQorICAgIHsKKyAgICAgIGZyZWUgKGZ1bGxfZXhlY3V0YWJsZSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIC8qIENsZWFuIHVwLiAgKi8KKyAgQ2xvc2VIYW5kbGUgKHBpLT5oVGhyZWFkKTsKKyAgZnJlZSAoZnVsbF9leGVjdXRhYmxlKTsKKworICByZXR1cm4gKGxvbmcpIHBpLT5oUHJvY2VzczsKKworIGVycm9yOgorICBpZiAoY21kbGluZSkKKyAgICBmcmVlIChjbWRsaW5lKTsKKyAgaWYgKGZ1bGxfZXhlY3V0YWJsZSkKKyAgICBmcmVlIChmdWxsX2V4ZWN1dGFibGUpOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBsb25nCitzcGF3bl9zY3JpcHQgKGNvbnN0IGNoYXIgKmV4ZWN1dGFibGUsIGNoYXIgKmNvbnN0ICphcmd2LAorCSAgICAgIERXT1JEIGR3Q3JlYXRpb25GbGFncywKKwkgICAgICBMUFNUQVJUVVBJTkZPIHNpLAorCSAgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBwaSkKIHsKICAgaW50IHBpZCA9IC0xOwogICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwpAQCAtNDU1LDE3ICs1NjYsMjEgQEAKIAkgICAgICBleGVjdXRhYmxlID0gc3RycmNociAoZXhlY3V0YWJsZTEsICdcXCcpICsgMTsKIAkgICAgICBpZiAoIWV4ZWN1dGFibGUpCiAJCWV4ZWN1dGFibGUgPSBleGVjdXRhYmxlMTsKLQkgICAgICBwaWQgPSBfc3Bhd252cCAoX1BfTk9XQUlULCBleGVjdXRhYmxlLCBhcmd2KTsKKwkgICAgICBwaWQgPSB3aW4zMl9zcGF3biAoZXhlY3V0YWJsZSwgVFJVRSwgYXJndiwgCisJCQkJIGR3Q3JlYXRpb25GbGFncywgc2ksIHBpKTsKICNlbHNlCiAJICAgICAgaWYgKHN0cmNociAoZXhlY3V0YWJsZTEsICdcXCcpID09IE5VTEwpCi0JCXBpZCA9IF9zcGF3bnZwIChfUF9OT1dBSVQsIGV4ZWN1dGFibGUxLCBhcmd2KTsKKwkJcGlkID0gd2luMzJfc3Bhd24gKGV4ZWN1dGFibGUxLCBUUlVFLCBhcmd2LCAKKwkJCQkgICBkd0NyZWF0aW9uRmxhZ3MsIHNpLCBwaSk7CiAJICAgICAgZWxzZSBpZiAoZXhlY3V0YWJsZTFbMF0gIT0gJ1xcJykKLQkJcGlkID0gX3NwYXdudiAoX1BfTk9XQUlULCBleGVjdXRhYmxlMSwgYXJndik7CisJCXBpZCA9IHdpbjMyX3NwYXduIChleGVjdXRhYmxlMSwgRkFMU0UsIGFyZ3YsIAorCQkJCSAgIGR3Q3JlYXRpb25GbGFncywgc2ksIHBpKTsKIAkgICAgICBlbHNlCiAJCXsKIAkJICBjb25zdCBjaGFyICpuZXdleCA9IG1pbmd3X3Jvb3RpZnkgKGV4ZWN1dGFibGUxKTsKIAkJICAqYXZoZXJlID0gbmV3ZXg7Ci0JCSAgcGlkID0gX3NwYXdudiAoX1BfTk9XQUlULCBuZXdleCwgYXJndik7CisJCSAgcGlkID0gd2luMzJfc3Bhd24gKG5ld2V4LCBGQUxTRSwgYXJndiwgCisJCQkJICAgICBkd0NyZWF0aW9uRmxhZ3MsIHNpLCBwaSk7CiAJCSAgaWYgKGV4ZWN1dGFibGUxICE9IG5ld2V4KQogCQkgICAgZnJlZSAoKGNoYXIgKikgbmV3ZXgpOwogCQkgIGlmIChwaWQgPCAwKQpAQCAtNDc0LDcgKzU4OSw4IEBACiAJCSAgICAgIGlmIChuZXdleCAhPSBleGVjdXRhYmxlMSkKIAkJCXsKIAkJCSAgKmF2aGVyZSA9IG5ld2V4OwotCQkJICBwaWQgPSBfc3Bhd252IChfUF9OT1dBSVQsIG5ld2V4LCBhcmd2KTsKKwkJCSAgcGlkID0gd2luMzJfc3Bhd24gKG5ld2V4LCBGQUxTRSwgYXJndiwgCisJCQkJCSAgICAgZHdDcmVhdGlvbkZsYWdzLCBzaSwgcGkpOwogCQkJICBmcmVlICgoY2hhciAqKSBuZXdleCk7CiAJCQl9CiAJCSAgICB9CkBAIC00OTYsMTQ5ICs2MTIsOTUgQEAKIAkJICAgICAgaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyZGVzLCBjb25zdCBjaGFyICoqZXJybXNnLAogCQkgICAgICBpbnQgKmVycikKIHsKLSAgaW50IG9yZ19pbiwgb3JnX291dCwgb3JnX2VycmRlczsKICAgbG9uZyBwaWQ7Ci0gIGNvbnN0IGNoYXIgKiBjb25zdCAqIG5ld2FyZ3Y7CisgIEhBTkRMRSBzdGRpbl9oYW5kbGU7CisgIEhBTkRMRSBzdGRvdXRfaGFuZGxlOworICBIQU5ETEUgc3RkZXJyX2hhbmRsZTsKKyAgRFdPUkQgZHdDcmVhdGlvbkZsYWdzOworICBPU1ZFUlNJT05JTkZPIHZlcnNpb25faW5mbzsKKyAgU1RBUlRVUElORk8gc2k7CisgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7CiAKLSAgb3JnX2luID0gLTE7Ci0gIG9yZ19vdXQgPSAtMTsKLSAgb3JnX2VycmRlcyA9IC0xOworICBzdGRpbl9oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgc3Rkb3V0X2hhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBzdGRlcnJfaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiAKLSAgaWYgKGluICE9IFNURElOX0ZJTEVfTk8pCisgIHN0ZGluX2hhbmRsZSA9IChIQU5ETEUpIF9nZXRfb3NmaGFuZGxlIChpbik7CisgIHN0ZG91dF9oYW5kbGUgPSAoSEFORExFKSBfZ2V0X29zZmhhbmRsZSAob3V0KTsKKyAgaWYgKCEoZmxhZ3MgJiBQRVhfU1RERVJSX1RPX1NURE9VVCkpCisgICAgc3RkZXJyX2hhbmRsZSA9IChIQU5ETEUpIF9nZXRfb3NmaGFuZGxlIChlcnJkZXMpOworICBlbHNlCisgICAgc3RkZXJyX2hhbmRsZSA9IHN0ZG91dF9oYW5kbGU7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSB2ZXJzaW9uIG9mIFdpbmRvd3Mgd2UgYXJlIHJ1bm5pbmcgb24uICAqLworICB2ZXJzaW9uX2luZm8uZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZiAodmVyc2lvbl9pbmZvKTsgCisgIEdldFZlcnNpb25FeCAoJnZlcnNpb25faW5mbyk7CisgIGlmICh2ZXJzaW9uX2luZm8uZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTKQorICAgIC8qIE9uIFdpbmRvd3MgOTUvOTgvTUUgdGhlIENSRUFURV9OT19XSU5ET1cgZmxhZyBpcyBub3QKKyAgICAgICBzdXBwb3J0ZWQsIHNvIHdlIGNhbm5vdCBhdm9pZCBjcmVhdGluZyBhIGNvbnNvbGUgd2luZG93LiAgKi8KKyAgICBkd0NyZWF0aW9uRmxhZ3MgPSAwOworICBlbHNlCiAgICAgewotICAgICAgb3JnX2luID0gX2R1cCAoU1RESU5fRklMRV9OTyk7Ci0gICAgICBpZiAob3JnX2luIDwgMCkKKyAgICAgIEhBTkRMRSBjb25vdXRfaGFuZGxlOworCisgICAgICAvKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhbiBhc3NvY2lhdGVkIGNvbnNvbGUuICAqLworICAgICAgY29ub3V0X2hhbmRsZSA9IENyZWF0ZUZpbGUoIkNPTk9VVCQiLCAKKwkJCQkgR0VORVJJQ19XUklURSwKKwkJCQkgRklMRV9TSEFSRV9XUklURSwKKwkJCQkgLypscFNlY3VyaXR5QXR0cmlidXRlcz0qL05VTEwsCisJCQkJIE9QRU5fRVhJU1RJTkcsCisJCQkJIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKKwkJCQkgLypoVGVtcGxhdGVGaWxlPSovTlVMTCk7CisgICAgICBpZiAoY29ub3V0X2hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkvKiBUaGVyZSBpcyBubyBjb25zb2xlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2Nlc3MuICBTaW5jZQorCSAgIHRoZSBjaGlsZCBpcyBhIGNvbnNvbGUgcHJvY2VzcywgdGhlIE9TIHdvdWxkIG5vcm1hbGx5CisJICAgY3JlYXRlIGEgbmV3IGNvbnNvbGUgV2luZG93IGZvciB0aGUgY2hpbGQuICBTaW5jZSB3ZSdsbCBiZQorCSAgIHJlZGlyZWN0aW5nIHRoZSBjaGlsZCdzIHN0YW5kYXJkIHN0cmVhbXMsIHdlIGRvIG5vdCBuZWVkCisJICAgdGhlIGNvbnNvbGUgd2luZG93LiAgKi8gCisJZHdDcmVhdGlvbkZsYWdzID0gQ1JFQVRFX05PX1dJTkRPVzsKKyAgICAgIGVsc2UgCiAJewotCSAgKmVyciA9IGVycm5vOwotCSAgKmVycm1zZyA9ICJfZHVwIjsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpZiAoX2R1cDIgKGluLCBTVERJTl9GSUxFX05PKSA8IDApCi0JewotCSAgKmVyciA9IGVycm5vOwotCSAgKmVycm1zZyA9ICJfZHVwMiI7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaWYgKF9jbG9zZSAoaW4pIDwgMCkKLQl7Ci0JICAqZXJyID0gZXJybm87Ci0JICAqZXJybXNnID0gIl9jbG9zZSI7Ci0JICByZXR1cm4gLTE7CisJICAvKiBUaGVyZSBpcyBhIGNvbnNvbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLCBzbyB0aGUgT1MKKwkgICAgIHdpbGwgbm90IGNyZWF0ZSBhIG5ldyBjb25zb2xlLiAgQW5kLCBpZiB3ZSB1c2UKKwkgICAgIENSRUFURV9OT19XSU5ET1cgaW4gdGhpcyBzaXR1YXRpb24sIHRoZSBjaGlsZCB3aWxsIGhhdmUKKwkgICAgIG5vIGFzc29jaWF0ZWQgY29uc29sZS4gIFRoZXJlZm9yZSwgaWYgdGhlIGNoaWxkJ3MKKwkgICAgIHN0YW5kYXJkIHN0cmVhbXMgYXJlIGNvbm5lY3RlZCB0byB0aGUgY29uc29sZSwgdGhlIG91dHB1dAorCSAgICAgd2lsbCBiZSBkaXNjYXJkZWQuICAqLworCSAgQ2xvc2VIYW5kbGUoY29ub3V0X2hhbmRsZSk7CisJICBkd0NyZWF0aW9uRmxhZ3MgPSAwOwogCX0KICAgICB9CiAKLSAgaWYgKG91dCAhPSBTVERPVVRfRklMRV9OTykKLSAgICB7Ci0gICAgICBvcmdfb3V0ID0gX2R1cCAoU1RET1VUX0ZJTEVfTk8pOwotICAgICAgaWYgKG9yZ19vdXQgPCAwKQotCXsKLQkgICplcnIgPSBlcnJubzsKLQkgICplcnJtc2cgPSAiX2R1cCI7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaWYgKF9kdXAyIChvdXQsIFNURE9VVF9GSUxFX05PKSA8IDApCi0JewotCSAgKmVyciA9IGVycm5vOwotCSAgKmVycm1zZyA9ICJfZHVwMiI7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaWYgKF9jbG9zZSAob3V0KSA8IDApCi0JewotCSAgKmVyciA9IGVycm5vOwotCSAgKmVycm1zZyA9ICJfY2xvc2UiOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9CisgIC8qIFNpbmNlIHRoZSBjaGlsZCB3aWxsIGJlIGEgY29uc29sZSBwcm9jZXNzLCBpdCB3aWxsLCBieSBkZWZhdWx0LAorICAgICBjb25uZWN0IHN0YW5kYXJkIGlucHV0L291dHB1dCB0byBpdHMgY29uc29sZS4gIEhvd2V2ZXIsIHdlIHdhbnQKKyAgICAgdGhlIGNoaWxkIHRvIHVzZSB0aGUgaGFuZGxlcyBzcGVjaWZpY2FsbHkgZGVzaWduYXRlZCBhYm92ZS4gIEluCisgICAgIGFkZGl0aW9uLCBpZiB0aGVyZSBpcyBubyBjb25zb2xlIChzdWNoIGFzIHdoZW4gd2UgYXJlIHJ1bm5pbmcgaW4KKyAgICAgYSBDeWd3aW4gWCB3aW5kb3cpLCB0aGVuIHdlIG11c3QgcmVkaXJlY3QgdGhlIGNoaWxkJ3MKKyAgICAgaW5wdXQvb3V0cHV0LCBhcyB0aGVyZSBpcyBubyBjb25zb2xlIGZvciB0aGUgY2hpbGQgdG8gdXNlLiAgKi8KKyAgbWVtc2V0ICgmc2ksIDAsIHNpemVvZiAoc2kpKTsKKyAgc2kuY2IgPSBzaXplb2YgKHNpKTsKKyAgc2kuZHdGbGFncyA9IFNUQVJURl9VU0VTVERIQU5ETEVTOworICBzaS5oU3RkSW5wdXQgPSBzdGRpbl9oYW5kbGU7CisgIHNpLmhTdGRPdXRwdXQgPSBzdGRvdXRfaGFuZGxlOworICBzaS5oU3RkRXJyb3IgPSBzdGRlcnJfaGFuZGxlOwogCi0gIGlmIChlcnJkZXMgIT0gU1RERVJSX0ZJTEVfTk8KLSAgICAgIHx8IChmbGFncyAmIFBFWF9TVERFUlJfVE9fU1RET1VUKSAhPSAwKQotICAgIHsKLSAgICAgIG9yZ19lcnJkZXMgPSBfZHVwIChTVERFUlJfRklMRV9OTyk7Ci0gICAgICBpZiAob3JnX2VycmRlcyA8IDApCi0JewotCSAgKmVyciA9IGVycm5vOwotCSAgKmVycm1zZyA9ICJfZHVwIjsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpZiAoX2R1cDIgKChmbGFncyAmIFBFWF9TVERFUlJfVE9fU1RET1VUKSAhPSAwID8gU1RET1VUX0ZJTEVfTk8gOiBlcnJkZXMsCi0JCSBTVERFUlJfRklMRV9OTykgPCAwKQotCXsKLQkgICplcnIgPSBlcnJubzsKLQkgICplcnJtc2cgPSAiX2R1cDIiOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGlmIChlcnJkZXMgIT0gU1RERVJSX0ZJTEVfTk8pCi0JewotCSAgaWYgKF9jbG9zZSAoZXJyZGVzKSA8IDApCi0JICAgIHsKLQkgICAgICAqZXJyID0gZXJybm87Ci0JICAgICAgKmVycm1zZyA9ICJfY2xvc2UiOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgbmV3YXJndiA9IGZpeF9hcmd2IChhcmd2KTsKLSAgcGlkID0gKCgoZmxhZ3MgJiBQRVhfU0VBUkNIKSAhPSAwID8gX3NwYXdudnAgOiBfc3Bhd252KQotCSAoX1BfTk9XQUlULCBleGVjdXRhYmxlLCBuZXdhcmd2KSk7Ci0KKyAgLyogQ3JlYXRlIHRoZSBjaGlsZCBwcm9jZXNzLiAgKi8gIAorICBwaWQgPSB3aW4zMl9zcGF3biAoZXhlY3V0YWJsZSwgKGZsYWdzICYgUEVYX1NFQVJDSCkgIT0gMCwKKwkJICAgICBhcmd2LCBkd0NyZWF0aW9uRmxhZ3MsICZzaSwgJnBpKTsKICAgaWYgKHBpZCA9PSAtMSkKLSAgICBwaWQgPSBzcGF3bl9zY3JpcHQgKGV4ZWN1dGFibGUsIG5ld2FyZ3YpOwotCisgICAgcGlkID0gc3Bhd25fc2NyaXB0IChleGVjdXRhYmxlLCBhcmd2LCBkd0NyZWF0aW9uRmxhZ3MsICZzaSwgJnBpKTsKICAgaWYgKHBpZCA9PSAtMSkKICAgICB7Ci0gICAgICAqZXJyID0gZXJybm87Ci0gICAgICAqZXJybXNnID0gKChmbGFncyAmIFBFWF9TRUFSQ0gpICE9IDApID8gIl9zcGF3bnZwIiA6ICJfc3Bhd252IjsKKyAgICAgICplcnIgPSBFTk9FTlQ7CisgICAgICAqZXJybXNnID0gIkNyZWF0ZVByb2Nlc3MiOwogICAgIH0KIAotICBpZiAoaW4gIT0gU1RESU5fRklMRV9OTykKLSAgICB7Ci0gICAgICBpZiAoX2R1cDIgKG9yZ19pbiwgU1RESU5fRklMRV9OTykgPCAwKQotCXsKLQkgICplcnIgPSBlcnJubzsKLQkgICplcnJtc2cgPSAiX2R1cDIiOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGlmIChfY2xvc2UgKG9yZ19pbikgPCAwKQotCXsKLQkgICplcnIgPSBlcnJubzsKLQkgICplcnJtc2cgPSAiX2Nsb3NlIjsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIGlmIChvdXQgIT0gU1RET1VUX0ZJTEVfTk8pCi0gICAgewotICAgICAgaWYgKF9kdXAyIChvcmdfb3V0LCBTVERPVVRfRklMRV9OTykgPCAwKQotCXsKLQkgICplcnIgPSBlcnJubzsKLQkgICplcnJtc2cgPSAiX2R1cDIiOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGlmIChfY2xvc2UgKG9yZ19vdXQpIDwgMCkKLQl7Ci0JICAqZXJyID0gZXJybm87Ci0JICAqZXJybXNnID0gIl9jbG9zZSI7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICBpZiAoZXJyZGVzICE9IFNUREVSUl9GSUxFX05PCi0gICAgICB8fCAoZmxhZ3MgJiBQRVhfU1RERVJSX1RPX1NURE9VVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoX2R1cDIgKG9yZ19lcnJkZXMsIFNUREVSUl9GSUxFX05PKSA8IDApCi0JewotCSAgKmVyciA9IGVycm5vOwotCSAgKmVycm1zZyA9ICJfZHVwMiI7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaWYgKF9jbG9zZSAob3JnX2VycmRlcykgPCAwKQotCXsKLQkgICplcnIgPSBlcnJubzsKLQkgICplcnJtc2cgPSAiX2Nsb3NlIjsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQorICAvKiBDbG9zZSB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvciBoYW5kbGVzIGluIHRoZQorICAgICBwYXJlbnQuICAqLyAKKyAgaWYgKG91dCAhPSBTVERPVVRfRklMRU5PKQorICAgIG9iai0+ZnVuY3MtPmNsb3NlIChvYmosIG91dCk7CisgIGlmIChlcnJkZXMgIT0gU1RERVJSX0ZJTEVOTykKKyAgICBvYmotPmZ1bmNzLT5jbG9zZSAob2JqLCBlcnJkZXMpOwogCiAgIHJldHVybiBwaWQ7CiB9CkBAIC02NTYsMzAgKzcxOCwzNCBAQAogCQlpbnQgKnN0YXR1cywgc3RydWN0IHBleF90aW1lICp0aW1lLCBpbnQgZG9uZSBBVFRSSUJVVEVfVU5VU0VELAogCQljb25zdCBjaGFyICoqZXJybXNnLCBpbnQgKmVycikKIHsKLSAgaW50IHRlcm1zdGF0OworICBEV09SRCB0ZXJtc3RhdDsKKyAgSEFORExFIGg7CiAKICAgaWYgKHRpbWUgIT0gTlVMTCkKICAgICBtZW1zZXQgKHRpbWUsIDAsIHNpemVvZiAqdGltZSk7CiAKKyAgaCA9IChIQU5ETEUpIHBpZDsKKwogICAvKiBGSVhNRTogSWYgZG9uZSBpcyBub24temVybywgd2Ugc2hvdWxkIHByb2JhYmx5IHRyeSB0byBraWxsIHRoZQogICAgICBwcm9jZXNzLiAgKi8KLQotICBpZiAoX2N3YWl0ICgmdGVybXN0YXQsIHBpZCwgV0FJVF9DSElMRCkgPCAwKQorICBpZiAoV2FpdEZvclNpbmdsZU9iamVjdCAoaCwgSU5GSU5JVEUpICE9IFdBSVRfT0JKRUNUXzApCiAgICAgewotICAgICAgKmVyciA9IGVycm5vOwotICAgICAgKmVycm1zZyA9ICJfY3dhaXQiOworICAgICAgQ2xvc2VIYW5kbGUgKGgpOworICAgICAgKmVyciA9IEVDSElMRDsKKyAgICAgICplcnJtc2cgPSAiV2FpdEZvclNpbmdsZU9iamVjdCI7CiAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gIC8qIGN3YWl0IHJldHVybnMgdGhlIGNoaWxkIHByb2Nlc3MgZXhpdCBjb2RlIGluIHRlcm1zdGF0LiAgQSB2YWx1ZQotICAgICBvZiAzIGluZGljYXRlcyB0aGF0IHRoZSBjaGlsZCBjYXVnaHQgYSBzaWduYWwsIGJ1dCBub3Qgd2hpY2ggb25lLgotICAgICBTaW5jZSBvbmx5IFNJR0FCUlQsIFNJR0ZQRSBhbmQgU0lHSU5UIGRvIGFueXRoaW5nLCB3ZSByZXBvcnQKLSAgICAgU0lHQUJSVC4gICovCi0KKyAgR2V0RXhpdENvZGVQcm9jZXNzIChoLCAmdGVybXN0YXQpOworICBDbG9zZUhhbmRsZSAoaCk7CisgCisgIC8qIEEgdmFsdWUgb2YgMyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hpbGQgY2F1Z2h0IGEgc2lnbmFsLCBidXQgbm90CisgICAgIHdoaWNoIG9uZS4gIFNpbmNlIG9ubHkgU0lHQUJSVCwgU0lHRlBFIGFuZCBTSUdJTlQgZG8gYW55dGhpbmcsIHdlCisgICAgIHJlcG9ydCBTSUdBQlJULiAgKi8KICAgaWYgKHRlcm1zdGF0ID09IDMpCiAgICAgKnN0YXR1cyA9IFNJR0FCUlQ7CiAgIGVsc2UKLSAgICAqc3RhdHVzID0gKCh0ZXJtc3RhdCAmIDB4ZmYpIDw8IDgpOworICAgICpzdGF0dXMgPSAodGVybXN0YXQgJiAweGZmKSA8PCA4OwogCiAgIHJldHVybiAwOwogfQpAQCAtNzAyLDYgKzc2OCwxOCBAQAogICByZXR1cm4gZmRvcGVuIChmZCwgYmluYXJ5ID8gInJiIiA6ICJyIik7CiB9CiAKK3N0YXRpYyBGSUxFICoKK3BleF93aW4zMl9mZG9wZW53IChzdHJ1Y3QgcGV4X29iaiAqb2JqIEFUVFJJQlVURV9VTlVTRUQsIGludCBmZCwKKwkJICAgaW50IGJpbmFyeSkKK3sKKyAgSEFORExFIGggPSAoSEFORExFKSBfZ2V0X29zZmhhbmRsZSAoZmQpOworICBpZiAoaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCEgU2V0SGFuZGxlSW5mb3JtYXRpb24gKGgsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gZmRvcGVuIChmZCwgYmluYXJ5ID8gIndiIiA6ICJ3Iik7Cit9CisKICNpZmRlZiBNQUlOCiAjaW5jbHVkZSA8c3RkaW8uaD4KIApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3BleGVjdXRlLnR4aCBiL2xpYmliZXJ0eS9wZXhlY3V0ZS50eGgKaW5kZXggNDYxZmYzMy4uN2Q0NTU3NiAxMDA2NDQKLS0tIGEvbGliaWJlcnR5L3BleGVjdXRlLnR4aAorKysgYi9saWJpYmVydHkvcGV4ZWN1dGUudHhoCkBAIC0xLDMgKzEsNCBAQAorQGMgLSotIG1vZGU6IHRleGluZm8gLSotCiBAZGVmdHlwZWZuIEV4dGVuc2lvbiB7c3RydWN0IHBleF9vYmogKn0gcGV4X2luaXQgKGludCBAdmFye2ZsYWdzfSwgY29uc3QgY2hhciAqQHZhcntwbmFtZX0sIGNvbnN0IGNoYXIgKkB2YXJ7dGVtcGJhc2V9KQogCiBQcmVwYXJlIHRvIGV4ZWN1dGUgb25lIG9yIG1vcmUgcHJvZ3JhbXMsIHdpdGggc3RhbmRhcmQgb3V0cHV0IG9mIGVhY2gKQEAgLTEyOSw2ICsxMzAsNjcgQEAKIAogQGVuZCBkZWZ0eXBlZm4KIAorQGRlZnR5cGVmbiBFeHRlbnNpb24ge0ZJTEUgKn0gcGV4X2lucHV0X2ZpbGUgKHN0cnVjdCBwZXhfb2JqICpAdmFye29ian0sIGludCBAdmFye2ZsYWdzfSwgY29uc3QgY2hhciAqQHZhcntpbl9uYW1lfSkKKworUmV0dXJuIGEgc3RyZWFtIGZvciBhIHRlbXBvcmFyeSBmaWxlIHRvIHBhc3MgdG8gdGhlIGZpcnN0IHByb2dyYW0gaW4KK3RoZSBwaXBlbGluZSBhcyBpbnB1dC4KKworVGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgaXMgY2hvc2VuIGFjY29yZGluZyB0byB0aGUgc2FtZSBydWxlcworQGNvZGV7cGV4X3J1bn0gdXNlcyB0byBjaG9vc2Ugb3V0cHV0IGZpbGUgbmFtZXMsIGJhc2VkIG9uCitAdmFye2luX25hbWV9LCBAdmFye29ian0gYW5kIHRoZSBAY29kZXtQRVhfU1VGRklYfSBiaXQgaW4gQHZhcntmbGFnc30uCisKK0Rvbid0IGNhbGwgQGNvZGV7ZmNsb3NlfSBvbiB0aGUgcmV0dXJuZWQgc3RyZWFtOyB0aGUgZmlyc3QgY2FsbCB0bworQGNvZGV7cGV4X3J1bn0gY2xvc2VzIGl0IGF1dG9tYXRpY2FsbHkuCisKK0lmIEB2YXJ7ZmxhZ3N9IGluY2x1ZGVzIEBjb2Rle1BFWF9CSU5BUllfT1VUUFVUfSwgb3BlbiB0aGUgc3RyZWFtIGluCitiaW5hcnkgbW9kZTsgb3RoZXJ3aXNlLCBvcGVuIGl0IGluIHRoZSBkZWZhdWx0IG1vZGUuICBJbmNsdWRpbmcKK0Bjb2Rle1BFWF9CSU5BUllfT1VUUFVUfSBpbiBAdmFye2ZsYWdzfSBoYXMgbm8gZWZmZWN0IG9uIFVuaXguCitAZW5kIGRlZnR5cGVmbgorCitAZGVmdHlwZWZuIEV4dGVuc2lvbiB7RklMRSAqfSBwZXhfaW5wdXRfcGlwZSAoc3RydWN0IHBleF9vYmogKkB2YXJ7b2JqfSwgaW50IEB2YXJ7YmluYXJ5fSkKKworUmV0dXJuIGEgc3RyZWFtIEB2YXJ7ZnB9IGZvciBhIHBpcGUgY29ubmVjdGVkIHRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZgordGhlIGZpcnN0IHByb2dyYW0gaW4gdGhlIHBpcGVsaW5lOyBAdmFye2ZwfSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcuCitZb3UgbXVzdCBoYXZlIHBhc3NlZCBAY29kZXtQRVhfVVNFX1BJUEVTfSB0byB0aGUgQGNvZGV7cGV4X2luaXR9IGNhbGwKK3RoYXQgcmV0dXJuZWQgQHZhcntvYmp9LgorCitZb3UgbXVzdCBjbG9zZSBAdmFye2ZwfSB1c2luZyBAY29kZXtmY2xvc2V9IHlvdXJzZWxmIHdoZW4geW91IGhhdmUKK2ZpbmlzaGVkIHdyaXRpbmcgZGF0YSB0byB0aGUgcGlwZWxpbmUuCisKK1RoZSBmaWxlIGRlc2NyaXB0b3IgdW5kZXJseWluZyBAdmFye2ZwfSBpcyBtYXJrZWQgbm90IHRvIGJlIGluaGVyaXRlZAorYnkgY2hpbGQgcHJvY2Vzc2VzLgorCitPbiBzeXN0ZW1zIHRoYXQgZG8gbm90IHN1cHBvcnQgcGlwZXMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworQGNvZGV7TlVMTH0sIGFuZCBzZXRzIEBjb2Rle2Vycm5vfSB0byBAY29kZXtFSU5WQUx9LiAgSWYgeW91IHdvdWxkCitsaWtlIHRvIHdyaXRlIGNvZGUgdGhhdCBpcyBwb3J0YWJsZSB0byBhbGwgc3lzdGVtcyB0aGUgQGNvZGV7cGV4fQorZnVuY3Rpb25zIHN1cHBvcnQsIGNvbnNpZGVyIHVzaW5nIEBjb2Rle3BleF9pbnB1dF9maWxlfSBpbnN0ZWFkLgorCitUaGVyZSBhcmUgdHdvIG9wcG9ydHVuaXRpZXMgZm9yIGRlYWRsb2NrIHVzaW5nCitAY29kZXtwZXhfaW5wdXRfcGlwZX06CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitNb3N0IHN5c3RlbXMnIHBpcGVzIGNhbiBidWZmZXIgb25seSBhIGZpeGVkIGFtb3VudCBvZiBkYXRhOyBhIHByb2Nlc3MKK3RoYXQgd3JpdGVzIHRvIGEgZnVsbCBwaXBlIGJsb2Nrcy4gIFRodXMsIGlmIHlvdSB3cml0ZSB0byBAZmlsZXtmcH0KK2JlZm9yZSBzdGFydGluZyB0aGUgZmlyc3QgcHJvY2VzcywgeW91IHJ1biB0aGUgcmlzayBvZiBibG9ja2luZyB3aGVuCit0aGVyZSBpcyBubyBjaGlsZCBwcm9jZXNzIHlldCB0byByZWFkIHRoZSBkYXRhIGFuZCBhbGxvdyB5b3UgdG8KK2NvbnRpbnVlLiAgQGNvZGV7cGV4X2lucHV0X3BpcGV9IG1ha2VzIG5vIHByb21pc2VzIGFib3V0IHRoZQorc2l6ZSBvZiB0aGUgcGlwZSdzIGJ1ZmZlciwgc28gaWYgeW91IG5lZWQgdG8gd3JpdGUgYW55IGRhdGEgYXQgYWxsCitiZWZvcmUgc3RhcnRpbmcgdGhlIGZpcnN0IHByb2Nlc3MgaW4gdGhlIHBpcGVsaW5lLCBjb25zaWRlciB1c2luZworQGNvZGV7cGV4X2lucHV0X2ZpbGV9IGluc3RlYWQuCisKK0BpdGVtCitVc2luZyBAY29kZXtwZXhfaW5wdXRfcGlwZX0gYW5kIEBjb2Rle3BleF9yZWFkX291dHB1dH0gdG9nZXRoZXIKK21heSBhbHNvIGNhdXNlIGRlYWRsb2NrLiAgSWYgdGhlIG91dHB1dCBwaXBlIGZpbGxzIHVwLCBzbyB0aGF0IGVhY2gKK3Byb2dyYW0gaW4gdGhlIHBpcGVsaW5lIGlzIHdhaXRpbmcgZm9yIHRoZSBuZXh0IHRvIHJlYWQgbW9yZSBkYXRhLCBhbmQKK3lvdSBmaWxsIHRoZSBpbnB1dCBwaXBlIGJ5IHdyaXRpbmcgbW9yZSBkYXRhIHRvIEB2YXJ7ZnB9LCB0aGVuIHRoZXJlCitpcyBubyB3YXkgdG8gbWFrZSBwcm9ncmVzczogdGhlIG9ubHkgcHJvY2VzcyB0aGF0IGNvdWxkIHJlYWQgZGF0YSBmcm9tCit0aGUgb3V0cHV0IHBpcGUgaXMgeW91LCBidXQgeW91IGFyZSBibG9ja2VkIG9uIHRoZSBpbnB1dCBwaXBlLgorCitAZW5kIGl0ZW1pemUKKworQGVuZCBkZWZ0eXBlZm4KKwogQGRlZnR5cGVmbiBFeHRlbnNpb24ge0ZJTEUgKn0gcGV4X3JlYWRfb3V0cHV0IChzdHJ1Y3QgcGV4X29iaiAqQHZhcntvYmp9LCBpbnQgQHZhcntiaW5hcnl9KQogCiBSZXR1cm5zIGEgQGNvZGV7RklMRX0gcG9pbnRlciB3aGljaCBtYXkgYmUgdXNlZCB0byByZWFkIHRoZSBzdGFuZGFyZApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Rlc3RzdWl0ZS9NYWtlZmlsZS5pbiBiL2xpYmliZXJ0eS90ZXN0c3VpdGUvTWFrZWZpbGUuaW4KaW5kZXggNjdlMWQyOC4uNTM0NjI2ZSAxMDA2NDQKLS0tIGEvbGliaWJlcnR5L3Rlc3RzdWl0ZS9NYWtlZmlsZS5pbgorKysgYi9saWJpYmVydHkvdGVzdHN1aXRlL01ha2VmaWxlLmluCkBAIC0xLDYgKzEsNiBAQAogIwogIyBNYWtlZmlsZQotIyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMgorIyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiwgMjAwNgogIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCkBAIC03Myw3ICs3Myw3IEBACiAJCSQoc3JjZGlyKS90ZXN0LWV4cGFuZGFyZ3YuYyAuLi9saWJpYmVydHkuYQogCiAjIFN0YW5kYXJkIChlaXRoZXIgR05VIG9yIEN5Z251cykgcnVsZXMgd2UgZG9uJ3QgdXNlLgotaW5mbyBpbnN0YWxsLWluZm8gY2xlYW4taW5mbyBkdmkgaW5zdGFsbCBldGFncyB0YWdzIGluc3RhbGxjaGVjazoKK2h0bWwgaW5zdGFsbC1odG1sIGluZm8gaW5zdGFsbC1pbmZvIGNsZWFuLWluZm8gZHZpIGluc3RhbGwgZXRhZ3MgdGFncyBpbnN0YWxsY2hlY2s6CiAKICMgVGhlIHN0YW5kYXJkIGNsZWFuIHJ1bGVzLgogbW9zdGx5Y2xlYW46CmRpZmYgLS1naXQgYS9vcGNvZGVzL0NoYW5nZUxvZyBiL29wY29kZXMvQ2hhbmdlTG9nCmluZGV4IGFlMGViNjQuLjg2MzdhOGIgMTAwNjQ0Ci0tLSBhL29wY29kZXMvQ2hhbmdlTG9nCisrKyBiL29wY29kZXMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDIgQEAKKzIwMDYtMDQtMTkgIEFsYW4gTW9kcmEgIDxhbW9kcmFAYmlncG9uZC5uZXQuYXU+CisKKwkqIE1ha2VmaWxlLmFtOiBSdW4gIm1ha2UgZGVwLWFtIi4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCisyMDA2LTA0LTE5ICBBbGFuIE1vZHJhICA8YW1vZHJhQGJpZ3BvbmQubmV0LmF1PgorCisJKiBhdnItZGlzLmMgKGF2cl9vcGVyYW5kKTogV2FybmluZyBmaXguCisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAwNi0wNC0xNiAgRGFuaWVsIEphY29ib3dpdHogIDxkYW5AY29kZXNvdXJjZXJ5LmNvbT4KKworCSogcG8vUE9URklMRVMuaW46IFJlZ2VuZXJhdGVkLgorCisyMDA2LTA0LTEyICAgSG9jaHN0ZWluICA8aG9jaHN0ZWluQGFsZ28uaW5mb3JtYXRpay50dS1kYXJtc3RhZHQuZGU+CisKKwlQUiBiaW51dGlscy8yNDU0CisJKiBhdnItZGlzLmMgKGF2cl9vcGVyYW5kKTogQXJyYW5nZSBmb3IgYSBjb21tZW50IHRvIGFwcGVhciBiZWZvcmUKKwl0aGUgc3ltb2xpYyBmb3JtIG9mIGFuIGFkZHJlc3MsIHNvIHRoYXQgdGhlIG91dHB1dCBvZiBvYmpkdW1wIC1kCisJY2FuIGJlIHJlYXNzZW1ibGVkLgorCisyMDA2LTA0LTEwICBESiBEZWxvcmllICA8ZGpAcmVkaGF0LmNvbT4KKworCSogbTMyYy1hc20uYzogUmVnZW5lcmF0ZS4KKworMjAwNi0wNC0wNiAgQ2FybG9zIE8nRG9uZWxsICA8Y2FybG9zQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBBZGQgaW5zdGFsbC1odG1sIHRhcmdldC4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCisyMDA2LTA0LTA2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0ByZWRoYXQuY29tPgorCisJKiBwby92aS9wbzogVXBkYXRlZCBWaWV0bmFtZXNlIHRyYW5zbGF0aW9uLgorCisyMDA2LTAzLTMxICBQYXVsIEtvbmluZyAgPG5pMWRAYXJybC5uZXQ+CisKKwkqIHBkcDExLW9wYy5jIChwZHAxMV9vcGNvZGVzKTogRml4IG9wY29kZSBmb3IgU0VDIGluc3RydWN0aW9uLgorCiAyMDA2LTAzLTE2ICBCZXJuZCBTY2htaWR0ICA8YmVybmQuc2NobWlkdEBhbmFsb2cuY29tPgogCiAJKiBiZmluLWRpcy5jIChkZWNvZGVfZHNwMzJzaGlmdGltbV8wKTogU2ltcGxpZnkgYW5kIGNvcnJlY3QgdGhlCmRpZmYgLS1naXQgYS9vcGNvZGVzL01ha2VmaWxlLmFtIGIvb3Bjb2Rlcy9NYWtlZmlsZS5hbQppbmRleCA4ZDAzMzA3Li4yYTI5YjU1IDEwMDY0NAotLS0gYS9vcGNvZGVzL01ha2VmaWxlLmFtCisrKyBiL29wY29kZXMvTWFrZWZpbGUuYW0KQEAgLTE1LDYgKzE1LDkgQEAKIGJmZGxpYmRpciA9IEBiZmRsaWJkaXJACiBiZmRpbmNsdWRlZGlyID0gQGJmZGluY2x1ZGVkaXJACiAKKy5QSE9OWTogaW5zdGFsbC1odG1sCitpbnN0YWxsLWh0bWw6CisKIGJmZGxpYl9MVExJQlJBUklFUyA9IGxpYm9wY29kZXMubGEKIAogIyBUaGlzIGlzIHdoZXJlIGJmZC5oIGxpdmVzLgpAQCAtOTcxLDYgKzk3NCwyNSBAQAogICAkKElOQ0RJUikvc3ltY2F0LmgKIHc2NS1kaXMubG86IHc2NS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCiAgIHc2NS1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaAoreGMxNngtYXNtLmxvOiB4YzE2eC1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCB4YzE2eC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLWJpdHNldC5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggeGMxNngtb3BjLmggb3BpbnRsLmggJChJTkNESVIpL3hyZWdleC5oIFwKKyAgJChJTkNESVIpL3hyZWdleDIuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL3NhZmUtY3R5cGUuaAoreGMxNngtZGVzYy5sbzogeGMxNngtZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIHhjMTZ4LWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4tYml0c2V0LmggXAorICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCB4YzE2eC1vcGMuaCBvcGludGwuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICAkKElOQ0RJUikveHJlZ2V4LmggJChJTkNESVIpL3hyZWdleDIuaAoreGMxNngtZGlzLmxvOiB4YzE2eC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIHhjMTZ4LWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4tYml0c2V0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAorICB4YzE2eC1vcGMuaCBvcGludGwuaAoreGMxNngtaWJsZC5sbzogeGMxNngtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggeGMxNngtZGVzYy5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLWJpdHNldC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKyAgeGMxNngtb3BjLmggb3BpbnRsLmggJChJTkNESVIpL3NhZmUtY3R5cGUuaAoreGMxNngtb3BjLmxvOiB4YzE2eC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCB4YzE2eC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLWJpdHNldC5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggeGMxNngtb3BjLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCiB4c3Rvcm15MTYtYXNtLmxvOiB4c3Rvcm15MTYtYXNtLmMgc3lzZGVwLmggY29uZmlnLmggXAogICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggeHN0b3JteTE2LWRlc2MuaCBcCiAgICQoSU5DRElSKS9vcGNvZGUvY2dlbi1iaXRzZXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCkBAIC05OTMsMjMgKzEwMTUsNiBAQAogICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggeHN0b3JteTE2LWRlc2MuaCBcCiAgICQoSU5DRElSKS9vcGNvZGUvY2dlbi1iaXRzZXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCiAgIHhzdG9ybXkxNi1vcGMuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhjMTZ4LWFzbS5sbzogeGMxNngtYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggeGMxNngtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgeGMxNngtb3BjLmggb3BpbnRsLmggJChJTkNESVIpL3hyZWdleC5oICQoSU5DRElSKS94cmVnZXgyLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL3NhZmUtY3R5cGUuaAoteGMxNngtZGVzYy5sbzogeGMxNngtZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIHhjMTZ4LWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIHhjMTZ4LW9wYy5oIG9waW50bC5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikveHJlZ2V4LmggXAotICAkKElOQ0RJUikveHJlZ2V4Mi5oCi14YzE2eC1kaXMubG86IHhjMTZ4LWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgeGMxNngtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIHhjMTZ4LW9wYy5oIG9waW50bC5oCi14YzE2eC1pYmxkLmxvOiB4YzE2eC1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCB4YzE2eC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCB4YzE2eC1vcGMuaCBvcGludGwuaCAkKElOQ0RJUikvc2FmZS1jdHlwZS5oCi14YzE2eC1vcGMubG86IHhjMTZ4LW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIHhjMTZ4LWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIHhjMTZ4LW9wYy5oICQoSU5DRElSKS9saWJpYmVydHkuaCAKIHh0ZW5zYS1kaXMubG86IHh0ZW5zYS1kaXMuYyAkKElOQ0RJUikveHRlbnNhLWlzYS5oIFwKICAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIHN5c2RlcC5oIFwKICAgY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmgKZGlmZiAtLWdpdCBhL29wY29kZXMvTWFrZWZpbGUuaW4gYi9vcGNvZGVzL01ha2VmaWxlLmluCmluZGV4IGEyOGZmMGUuLjkwMjkwODUgMTAwNjQ0Ci0tLSBhL29wY29kZXMvTWFrZWZpbGUuaW4KKysrIGIvb3Bjb2Rlcy9NYWtlZmlsZS5pbgpAQCAtOTMzLDYgKzkzMyw5IEBACiAJdW5pbnN0YWxsLWJmZGxpYkxUTElCUkFSSUVTIHVuaW5zdGFsbC1pbmZvLWFtCiAKIAorLlBIT05ZOiBpbnN0YWxsLWh0bWwKK2luc3RhbGwtaHRtbDoKKwogZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Rpcy1hc20uaAogCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyBAYXJjaGRlZnNAICQoc3JjZGlyKS9kaXNhc3NlbWJsZS5jCiAKQEAgLTE1MTMsNiArMTUxNiwyNSBAQAogICAkKElOQ0RJUikvc3ltY2F0LmgKIHc2NS1kaXMubG86IHc2NS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCiAgIHc2NS1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaAoreGMxNngtYXNtLmxvOiB4YzE2eC1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCB4YzE2eC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLWJpdHNldC5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggeGMxNngtb3BjLmggb3BpbnRsLmggJChJTkNESVIpL3hyZWdleC5oIFwKKyAgJChJTkNESVIpL3hyZWdleDIuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL3NhZmUtY3R5cGUuaAoreGMxNngtZGVzYy5sbzogeGMxNngtZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIHhjMTZ4LWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4tYml0c2V0LmggXAorICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCB4YzE2eC1vcGMuaCBvcGludGwuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICAkKElOQ0RJUikveHJlZ2V4LmggJChJTkNESVIpL3hyZWdleDIuaAoreGMxNngtZGlzLmxvOiB4YzE2eC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIHhjMTZ4LWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4tYml0c2V0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAorICB4YzE2eC1vcGMuaCBvcGludGwuaAoreGMxNngtaWJsZC5sbzogeGMxNngtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggeGMxNngtZGVzYy5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLWJpdHNldC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKyAgeGMxNngtb3BjLmggb3BpbnRsLmggJChJTkNESVIpL3NhZmUtY3R5cGUuaAoreGMxNngtb3BjLmxvOiB4YzE2eC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCB4YzE2eC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLWJpdHNldC5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggeGMxNngtb3BjLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCiB4c3Rvcm15MTYtYXNtLmxvOiB4c3Rvcm15MTYtYXNtLmMgc3lzZGVwLmggY29uZmlnLmggXAogICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggeHN0b3JteTE2LWRlc2MuaCBcCiAgICQoSU5DRElSKS9vcGNvZGUvY2dlbi1iaXRzZXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCkBAIC0xNTM1LDIzICsxNTU3LDYgQEAKICAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIHhzdG9ybXkxNi1kZXNjLmggXAogICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4tYml0c2V0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAogICB4c3Rvcm15MTYtb3BjLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi14YzE2eC1hc20ubG86IHhjMTZ4LWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIHhjMTZ4LWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIHhjMTZ4LW9wYy5oIG9waW50bC5oICQoSU5DRElSKS94cmVnZXguaCAkKElOQ0RJUikveHJlZ2V4Mi5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9zYWZlLWN0eXBlLmgKLXhjMTZ4LWRlc2MubG86IHhjMTZ4LWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCB4YzE2eC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICB4YzE2eC1vcGMuaCBvcGludGwuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL3hyZWdleC5oIFwKLSAgJChJTkNESVIpL3hyZWdleDIuaAoteGMxNngtZGlzLmxvOiB4YzE2eC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHhjMTZ4LWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCB4YzE2eC1vcGMuaCBvcGludGwuaAoteGMxNngtaWJsZC5sbzogeGMxNngtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggeGMxNngtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggeGMxNngtb3BjLmggb3BpbnRsLmggJChJTkNESVIpL3NhZmUtY3R5cGUuaAoteGMxNngtb3BjLmxvOiB4YzE2eC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCB4YzE2eC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICB4YzE2eC1vcGMuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggCiB4dGVuc2EtZGlzLmxvOiB4dGVuc2EtZGlzLmMgJChJTkNESVIpL3h0ZW5zYS1pc2EuaCBcCiAgICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBzeXNkZXAuaCBcCiAgIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oCmRpZmYgLS1naXQgYS9vcGNvZGVzL2F2ci1kaXMuYyBiL29wY29kZXMvYXZyLWRpcy5jCmluZGV4IDE1MzAwODQuLmFjMzc3NTIgMTAwNjQ0Ci0tLSBhL29wY29kZXMvYXZyLWRpcy5jCisrKyBiL29wY29kZXMvYXZyLWRpcy5jCkBAIC0xMzksNyArMTM5LDEyIEBACiAgICAgY2FzZSAnaCc6CiAgICAgICAqc3ltID0gMTsKICAgICAgICpzeW1fYWRkciA9ICgoKChpbnNuICYgMSkgfCAoKGluc24gJiAweDFmMCkgPj4gMykpIDw8IDE2KSB8IGluc24yKSAqIDI7Ci0gICAgICBzcHJpbnRmIChidWYsICIweCIpOworICAgICAgLyogU2VlIFBSIGJpbnV0aWxzLzI1NDUuICBJZGVhbGx5IHdlIHdvdWxkIGxpa2UgdG8gZGlzcGxheSB0aGUgaGV4CisJIHZhbHVlIG9mIHRoZSBhZGRyZXNzIG9ubHkgb25jZSwgYnV0IHRoaXMgd291bGQgbWVhbiByZWNvZGluZworCSBvYmpkdW1wX3ByaW50X2FkZHJlc3MoKSB3aGljaCB3b3VsZCBhZmZlY3QgbWFueSB0YXJnZXRzLiAgKi8KKyAgICAgIHNwcmludGYgKGJ1ZiwgIiUjbHgiLCAodW5zaWduZWQgbG9uZyApICpzeW1fYWRkcik7ICAgICAgCisgICAgICBzcHJpbnRmIChjb21tZW50LCAiMHgiKTsKKwogICAgICAgYnJlYWs7CiAgICAgICAKICAgICBjYXNlICdMJzoKZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlndXJlIGIvb3Bjb2Rlcy9jb25maWd1cmUKaW5kZXggYjY5MmU4My4uZGEyOWNjMyAxMDA3NTUKLS0tIGEvb3Bjb2Rlcy9jb25maWd1cmUKKysrIGIvb3Bjb2Rlcy9jb25maWd1cmUKQEAgLTg1OCw4ICs4NTgsOCBAQAogICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpCiAgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucwogICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkKLSAgLS1lbmFibGUtd2Vycm9yICAgIHRyZWF0IGNvbXBpbGUgd2FybmluZ3MgYXMgZXJyb3JzCi0gIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIEVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzCisgIC0tZW5hYmxlLXdlcnJvciAgICAgICAgIHRyZWF0IGNvbXBpbGUgd2FybmluZ3MgYXMgZXJyb3JzCisgIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIGVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzCiAgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSAgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCiAJCQkgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIKICAgLS1lbmFibGUtaW5zdGFsbC1saWJiZmQgY29udHJvbHMgaW5zdGFsbGF0aW9uIG9mIGxpYmJmZCBhbmQgcmVsYXRlZCBoZWFkZXJzCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMmMtYXNtLmMgYi9vcGNvZGVzL20zMmMtYXNtLmMKaW5kZXggOTQwN2VkOC4uNWFmNWQ3NSAxMDA2NDQKLS0tIGEvb3Bjb2Rlcy9tMzJjLWFzbS5jCisrKyBiL29wY29kZXMvbTMyYy1hc20uYwpAQCAtNTc4LDEzICs1NzgsMTQgQEAKIHN0YXRpYyBjb25zdCBjaGFyICoKIHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2UgKENHRU5fQ1BVX0RFU0MgY2QsIGNvbnN0IGNoYXIgKipzdHJwLAogCQkJaW50IG9waW5kZXgsIHVuc2lnbmVkIGxvbmcgKnZhbHVlcCwKLQkJCXVuc2lnbmVkIGJpdHMpCisJCQl1bnNpZ25lZCBiaXRzLCBpbnQgYWxsb3dfc3ltcykKIHsKICAgY29uc3QgY2hhciAqZXJybXNnID0gMDsKICAgdW5zaWduZWQgbG9uZyBiaXQ7CiAgIHVuc2lnbmVkIGxvbmcgYmFzZTsKICAgY29uc3QgY2hhciAqbmV3cCA9ICpzdHJwOwogICB1bnNpZ25lZCBsb25nIGxvbmcgYml0YmFzZTsKKyAgbG9uZyBoYXZlX3plcm8gPSAwOwogCiAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsICYgbmV3cCwgb3BpbmRleCwgJiBiaXQpOwogICBpZiAoZXJybXNnKQpAQCAtNTk0LDYgKzU5NSwxMSBAQAogICAgIHJldHVybiAiTWlzc2luZyBiYXNlIGZvciBiaXQsYmFzZTo4IjsKIAogICArK25ld3A7CisKKyAgaWYgKHN0cm5jbXAgKG5ld3AsICIweDAiLCAzKSA9PSAwIAorICAgICAgfHwgKG5ld3BbMF0gPT0gJzAnICYmIG5ld3BbMV0gIT0gJ3gnKSkKKyAgICBoYXZlX3plcm8gPSAxOworCiAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsICYgbmV3cCwgb3BpbmRleCwgJiBiYXNlKTsKICAgaWYgKGVycm1zZykKICAgICByZXR1cm4gZXJybXNnOwpAQCAtNjAzLDYgKzYwOSwyMSBAQAogICBpZiAoYml0YmFzZSA+PSAoMXVsbCA8PCBiaXRzKSkKICAgICByZXR1cm4gXygiYml0LGJhc2UgaXMgb3V0IG9mIHJhbmdlIik7CiAKKyAgLyogSWYgdGhpcyBmaWVsZCBtYXkgcmVxdWlyZSBhIHJlbG9jYXRpb24gdGhlbiB1c2UgbGFyZ2VyIGRpc3BsYWNlbWVudC4gICovCisgIGlmICghIGhhdmVfemVybyAmJiBiYXNlID09IDApCisgICAgeworICAgICAgc3dpdGNoIChhbGxvd19zeW1zKSB7CisgICAgICBjYXNlIDA6CisJcmV0dXJuIF8oImJpdCxiYXNlIG91dCBvZiByYW5nZSBmb3Igc3ltYm9sIik7CisgICAgICBjYXNlIDE6CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisJaWYgKHN0cm5jbXAgKG5ld3AsICJbc2JdIiwgNCkgIT0gMCkKKwkgIHJldHVybiBfKCJiaXQsYmFzZSBvdXQgb2YgcmFuZ2UgZm9yIHN5bWJvbCIpOworCWJyZWFrOworICAgICAgfQorICAgIH0KKwogICAqdmFsdWVwID0gYml0YmFzZTsKICAgKnN0cnAgPSBuZXdwOwogICByZXR1cm4gMDsKQEAgLTYxMSw3ICs2MzIsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKgogcGFyc2Vfc2lnbmVkX2JpdGJhc2UgKENHRU5fQ1BVX0RFU0MgY2QsIGNvbnN0IGNoYXIgKipzdHJwLAogCQkgICAgICBpbnQgb3BpbmRleCwgc2lnbmVkIGxvbmcgKnZhbHVlcCwKLQkJICAgICAgdW5zaWduZWQgYml0cykKKwkJICAgICAgdW5zaWduZWQgYml0cywgaW50IGFsbG93X3N5bXMpCiB7CiAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IDA7CiAgIHVuc2lnbmVkIGxvbmcgYml0OwpAQCAtNjE5LDYgKzY0MCw3IEBACiAgIGNvbnN0IGNoYXIgKm5ld3AgPSAqc3RycDsKICAgbG9uZyBsb25nIGJpdGJhc2U7CiAgIGxvbmcgbG9uZyBsaW1pdDsKKyAgbG9uZyBoYXZlX3plcm8gPSAwOwogCiAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsICYgbmV3cCwgb3BpbmRleCwgJiBiaXQpOwogICBpZiAoZXJybXNnKQpAQCAtNjI4LDYgKzY1MCwxMSBAQAogICAgIHJldHVybiAiTWlzc2luZyBiYXNlIGZvciBiaXQsYmFzZTo4IjsKIAogICArK25ld3A7CisKKyAgaWYgKHN0cm5jbXAgKG5ld3AsICIweDAiLCAzKSA9PSAwIAorICAgICAgfHwgKG5ld3BbMF0gPT0gJzAnICYmIG5ld3BbMV0gIT0gJ3gnKSkKKyAgICBoYXZlX3plcm8gPSAxOworCiAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCAmIG5ld3AsIG9waW5kZXgsICYgYmFzZSk7CiAgIGlmIChlcnJtc2cpCiAgICAgcmV0dXJuIGVycm1zZzsKQEAgLTYzOCw2ICs2NjUsMTAgQEAKICAgaWYgKGJpdGJhc2UgPCAtbGltaXQgfHwgYml0YmFzZSA+PSBsaW1pdCkKICAgICByZXR1cm4gXygiYml0LGJhc2UgaXMgb3V0IG9mIHJhbmdlIik7CiAKKyAgLyogSWYgdGhpcyBmaWVsZCBtYXkgcmVxdWlyZSBhIHJlbG9jYXRpb24gdGhlbiB1c2UgbGFyZ2VyIGRpc3BsYWNlbWVudC4gICovCisgIGlmICghIGhhdmVfemVybyAmJiBiYXNlID09IDAgJiYgISBhbGxvd19zeW1zKQorICAgIHJldHVybiBfKCJiaXQsYmFzZSBvdXQgb2YgcmFuZ2UgZm9yIHN5bWJvbCIpOworCiAgICp2YWx1ZXAgPSBiaXRiYXNlOwogICAqc3RycCA9IG5ld3A7CiAgIHJldHVybiAwOwpAQCAtNjQ3LDU2ICs2NzgsNTYgQEAKIHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2U4IChDR0VOX0NQVV9ERVNDIGNkLCBjb25zdCBjaGFyICoqc3RycCwKIAkJCSBpbnQgb3BpbmRleCwgdW5zaWduZWQgbG9uZyAqdmFsdWVwKQogewotICByZXR1cm4gcGFyc2VfdW5zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgOCk7CisgIHJldHVybiBwYXJzZV91bnNpZ25lZF9iaXRiYXNlIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCA4LCAwKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKgogcGFyc2VfdW5zaWduZWRfYml0YmFzZTExIChDR0VOX0NQVV9ERVNDIGNkLCBjb25zdCBjaGFyICoqc3RycCwKIAkJCSBpbnQgb3BpbmRleCwgdW5zaWduZWQgbG9uZyAqdmFsdWVwKQogewotICByZXR1cm4gcGFyc2VfdW5zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMTEpOworICByZXR1cm4gcGFyc2VfdW5zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMTEsIDApOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqCiBwYXJzZV91bnNpZ25lZF9iaXRiYXNlMTYgKENHRU5fQ1BVX0RFU0MgY2QsIGNvbnN0IGNoYXIgKipzdHJwLAogCQkJICBpbnQgb3BpbmRleCwgdW5zaWduZWQgbG9uZyAqdmFsdWVwKQogewotICByZXR1cm4gcGFyc2VfdW5zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMTYpOworICByZXR1cm4gcGFyc2VfdW5zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMTYsIDEpOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqCiBwYXJzZV91bnNpZ25lZF9iaXRiYXNlMTkgKENHRU5fQ1BVX0RFU0MgY2QsIGNvbnN0IGNoYXIgKipzdHJwLAogCQkJIGludCBvcGluZGV4LCB1bnNpZ25lZCBsb25nICp2YWx1ZXApCiB7Ci0gIHJldHVybiBwYXJzZV91bnNpZ25lZF9iaXRiYXNlIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxOSk7CisgIHJldHVybiBwYXJzZV91bnNpZ25lZF9iaXRiYXNlIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxOSwgMik7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICoKIHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2UyNyAoQ0dFTl9DUFVfREVTQyBjZCwgY29uc3QgY2hhciAqKnN0cnAsCiAJCQkgaW50IG9waW5kZXgsIHVuc2lnbmVkIGxvbmcgKnZhbHVlcCkKIHsKLSAgcmV0dXJuIHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDI3KTsKKyAgcmV0dXJuIHBhcnNlX3Vuc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDI3LCAxKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKgogcGFyc2Vfc2lnbmVkX2JpdGJhc2U4IChDR0VOX0NQVV9ERVNDIGNkLCBjb25zdCBjaGFyICoqc3RycCwKIAkJICAgICAgIGludCBvcGluZGV4LCBzaWduZWQgbG9uZyAqdmFsdWVwKQogewotICByZXR1cm4gcGFyc2Vfc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDgpOworICByZXR1cm4gcGFyc2Vfc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDgsIDEpOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqCiBwYXJzZV9zaWduZWRfYml0YmFzZTExIChDR0VOX0NQVV9ERVNDIGNkLCBjb25zdCBjaGFyICoqc3RycCwKIAkJICAgICAgIGludCBvcGluZGV4LCBzaWduZWQgbG9uZyAqdmFsdWVwKQogewotICByZXR1cm4gcGFyc2Vfc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDExKTsKKyAgcmV0dXJuIHBhcnNlX3NpZ25lZF9iaXRiYXNlIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxMSwgMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICoKIHBhcnNlX3NpZ25lZF9iaXRiYXNlMTkgKENHRU5fQ1BVX0RFU0MgY2QsIGNvbnN0IGNoYXIgKipzdHJwLAogCQkgICAgICAgaW50IG9waW5kZXgsIHNpZ25lZCBsb25nICp2YWx1ZXApCiB7Ci0gIHJldHVybiBwYXJzZV9zaWduZWRfYml0YmFzZSAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMTkpOworICByZXR1cm4gcGFyc2Vfc2lnbmVkX2JpdGJhc2UgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDE5LCAxKTsKIH0KIAogLyogUGFyc2UgdGhlIHN1ZmZpeCBhcyA6PGNoYXI+IG9yIGFzIG5vdGhpbmcgZm9sbG93ZWQgYnkgYSB3aGl0ZXNwYWNlLiAgKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvcGRwMTEtb3BjLmMgYi9vcGNvZGVzL3BkcDExLW9wYy5jCmluZGV4IDhiOTZlNzguLjVmZGIwODQgMTAwNjQ0Ci0tLSBhL29wY29kZXMvcGRwMTEtb3BjLmMKKysrIGIvb3Bjb2Rlcy9wZHAxMS1vcGMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIE9wY29kZSB0YWJsZSBmb3IgUERQLTExLgotICAgQ29weXJpZ2h0IDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC01MCw3ICs1MCw3IEBACiAgIHsgImNsX2UiLAkweDAwYWUsCTB4ZmZmZiwgUERQMTFfT1BDT0RFX05PX09QUywJUERQMTFfQkFTSUMgfSwKICAgeyAiY2NjIiwJMHgwMGFmLAkweGZmZmYsIFBEUDExX09QQ09ERV9OT19PUFMsCVBEUDExX0JBU0lDIH0sCiAgIHsgInNlXzAiLAkweDAwYjAsCTB4ZmZmZiwgUERQMTFfT1BDT0RFX05PX09QUywJUERQMTFfQkFTSUMgfSwKLSAgeyAic2VjIiwJMHgwMGExLAkweGZmZmYsIFBEUDExX09QQ09ERV9OT19PUFMsCVBEUDExX0JBU0lDIH0sCisgIHsgInNlYyIsCTB4MDBiMSwJMHhmZmZmLCBQRFAxMV9PUENPREVfTk9fT1BTLAlQRFAxMV9CQVNJQyB9LAogICB7ICJzZXYiLAkweDAwYjIsCTB4ZmZmZiwgUERQMTFfT1BDT0RFX05PX09QUywJUERQMTFfQkFTSUMgfSwKICAgeyAic2VfMyIsCTB4MDBiMywJMHhmZmZmLCBQRFAxMV9PUENPREVfTk9fT1BTLAlQRFAxMV9CQVNJQyB9LAogICB7ICJzZXoiLAkweDAwYjQsCTB4ZmZmZiwgUERQMTFfT1BDT0RFX05PX09QUywJUERQMTFfQkFTSUMgfSwKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vTWFrZS1pbiBiL29wY29kZXMvcG8vTWFrZS1pbgppbmRleCA1ZTM1NDI2Li40ZjMzOGJjIDEwMDY0NAotLS0gYS9vcGNvZGVzL3BvL01ha2UtaW4KKysrIGIvb3Bjb2Rlcy9wby9NYWtlLWluCkBAIC0xLDYgKzEsNiBAQAogIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCiAjIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjCiAjIFRoaXMgZmlsZSBtYXkgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgogIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKQEAgLTExMCw2ICsxMTAsNyBAQAogaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQogaW5zdGFsbC1leGVjOgogaW5zdGFsbC1pbmZvOgoraW5zdGFsbC1odG1sOgogaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACiBpbnN0YWxsLWRhdGEtbm86IGFsbAogaW5zdGFsbC1kYXRhLXllczogYWxsCmRpZmYgLS1naXQgYS9vcGNvZGVzL3BvL1BPVEZJTEVTLmluIGIvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbgppbmRleCBkZGI3Zjk1Li42N2U5OGM0IDEwMDY0NAotLS0gYS9vcGNvZGVzL3BvL1BPVEZJTEVTLmluCisrKyBiL29wY29kZXMvcG8vUE9URklMRVMuaW4KQEAgLTE1MCw2ICsxNTAsMTMgQEAKIHZheC1kaXMuYwogdzY1LWRpcy5jCiB3NjUtb3BjLmgKK3hjMTZ4LWFzbS5jCit4YzE2eC1kZXNjLmMKK3hjMTZ4LWRlc2MuaAoreGMxNngtZGlzLmMKK3hjMTZ4LWlibGQuYworeGMxNngtb3BjLmMKK3hjMTZ4LW9wYy5oCiB4c3Rvcm15MTYtYXNtLmMKIHhzdG9ybXkxNi1kZXNjLmMKIHhzdG9ybXkxNi1kZXNjLmgKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vdmkucG8gYi9vcGNvZGVzL3BvL3ZpLnBvCmluZGV4IDljZjg4ZWQuLjk1N2MzM2QgMTAwNjQ0Ci0tLSBhL29wY29kZXMvcG8vdmkucG8KKysrIGIvb3Bjb2Rlcy9wby92aS5wbwpAQCAtMSwxOCArMSwyMCBAQAotIyAgVmlldG5hbWVzZSBUcmFuc2xhdGlvbiBmb3Igb3Bjb2Rlcy0yLjE1Ljk2LgorIyAgVmlldG5hbWVzZSBUcmFuc2xhdGlvbiBmb3IgT3Bjb2Rlcy4KICMgIENvcHlyaWdodCDCqSAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIyAgQ2x5dGllIFNpZGRhbGwgPGNseXRpZUByaXZlcmxhbmQubmV0LmF1PiwgMjAwNS4KICMgCiBtc2dpZCAiIgogbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBvcGNvZGVzIDIuMTUuOTZcbiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IG9wY29kZXMtMi4xNS45NlxuIgogIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKICJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwNS0wMy0wNSAyMDozMisxMDMwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogMjAwNS0wNS0wNCAyMTo1MiswOTMwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNi0wNC0wNSAxNToxNCswOTMwXG4iCiAiTGFzdC1UcmFuc2xhdG9yOiBDbHl0aWUgU2lkZGFsbCA8Y2x5dGllQHJpdmVybGFuZC5uZXQuYXU+XG4iCiAiTGFuZ3VhZ2UtVGVhbTogVmlldG5hbWVzZSA8Z25vbWV2aS1saXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKICJNSU1FLVZlcnNpb246IDEuMFxuIgogIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFxuIgogIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTE7IHBsdXJhbD0wXG4iCisiWC1HZW5lcmF0b3I6IExvY0ZhY3RvcnlFZGl0b3IgMS42YjM2XG4iCiAKICM6IGFscGhhLW9wYy5jOjMzMQogbXNnaWQgImJyYW5jaCBvcGVyYW5kIHVuYWxpZ25lZCIKQEAgLTI0LDcgKzI2LDcgQEAKIAogIzogYXJjLWRpcy5jOjc2CiBtc2dpZCAiSWxsZWdhbCBsaW1tIHJlZmVyZW5jZSBpbiBsYXN0IGluc3RydWN0aW9uIVxuIgotbXNnc3RyICJLaMO0bmcgY2hvIHBow6lwIHRoYW0gY2hp4bq/dSBsb+G6oWkgbGltbSB0cm9uZyBjw6J1IGzhu4duaCBjdeG7kWkgY8O5bmcuXG4iCittc2dzdHIgIktow7RuZyBjaG8gcGjDqXAgdGhhbSBjaGnhur91IGtp4buDdSBsaW1tIHRyb25nIGPDonUgbOG7h25oIGN14buRaSBjw7luZy5cbiIKIAogIzogYXJtLWRpcy5jOjEyNjcKIG1zZ2lkICI8aWxsZWdhbCBwcmVjaXNpb24+IgpAQCAtNjUsNyArNjcsNyBAQAogIzogYXZyLWRpcy5jOjIyNwogIywgYy1mb3JtYXQKIG1zZ2lkICJ1bmtub3duIGNvbnN0cmFpbnQgYCVjJyIKLW1zZ3N0ciAia2jDtG5nIGJp4bq/dCByw6BuZyBideG7mWMgYCVjJyIKK21zZ3N0ciAia2jDtG5nIGJp4bq/dCByw6BuZyBideG7mWMgwqsgJWMgwrsiCiAKICM6IGNnZW4tYXNtLmM6MzM2IGZyMzAtaWJsZC5jOjE5NyBmcnYtaWJsZC5jOjE5NyBpcDJrLWlibGQuYzoxOTcKICM6IGlxMjAwMC1pYmxkLmM6MTk3IG0zMnItaWJsZC5jOjE5NyBvcGVucmlzYy1pYmxkLmM6MTk3IHhzdG9ybXkxNi1pYmxkLmM6MTk3CkBAIC0xMjAsMTMgKzEyMiwxMyBAQAogIzogbTMyci1hc20uYzo1Njkgb3BlbnJpc2MtYXNtLmM6NDgzIHhzdG9ybXkxNi1hc20uYzo1MTUKICMsIGMtZm9ybWF0CiBtc2dpZCAic3ludGF4IGVycm9yIChleHBlY3RlZCBjaGFyIGAlYycsIGZvdW5kIGAlYycpIgotbXNnc3RyICJn4bq3cCBs4buXaSBjw7ogcGjDoXAgKG5n4budIGvDvSB04buxIGAlYycsIGPDsm4gdMOsbSBgJWMnKSIKK21zZ3N0ciAiZ+G6t3AgbOG7l2kgY8O6IHBow6FwIChuZ+G7nSBrw70gdOG7sSDCqyAlYyDCuywgY8OybiB0w6xtIMKrICVjIMK7KSIKIAogIzogZnIzMC1hc20uYzo1NjQgZnJ2LWFzbS5jOjE1MzkgaXAyay1hc20uYzo3NzEgaXEyMDAwLWFzbS5jOjcwNgogIzogbTMyci1hc20uYzo1Nzkgb3BlbnJpc2MtYXNtLmM6NDkzIHhzdG9ybXkxNi1hc20uYzo1MjUKICMsIGMtZm9ybWF0CiBtc2dpZCAic3ludGF4IGVycm9yIChleHBlY3RlZCBjaGFyIGAlYycsIGZvdW5kIGVuZCBvZiBpbnN0cnVjdGlvbikiCi1tc2dzdHIgImfhurdwIGzhu5dpIGPDuiBwaMOhcCAobmfhu50ga8O9IHThu7EgYCVjJywgY8OybiB0w6xtIGvhur90IHRo4bupYyBjw6J1IGzhu4duaCkiCittc2dzdHIgImfhurdwIGzhu5dpIGPDuiBwaMOhcCAobmfhu50ga8O9IHThu7EgwqsgJWMgwrssIGPDsm4gdMOsbSBr4bq/dCB0aOG7qWMgY8OidSBs4buHbmgpIgogCiAjOiBmcjMwLWFzbS5jOjU5MiBmcnYtYXNtLmM6MTU2NyBpcDJrLWFzbS5jOjc5OSBpcTIwMDAtYXNtLmM6NzM0CiAjOiBtMzJyLWFzbS5jOjYwNyBvcGVucmlzYy1hc20uYzo1MjEgeHN0b3JteTE2LWFzbS5jOjU1MwpAQCAtMTQyLDE5ICsxNDQsMTkgQEAKICM6IG0zMnItYXNtLmM6NzI1IG9wZW5yaXNjLWFzbS5jOjYzOSB4c3Rvcm15MTYtYXNtLmM6NjcxCiAjLCBjLWZvcm1hdAogbXNnaWQgImJhZCBpbnN0cnVjdGlvbiBgJS41MHMuLi4nIgotbXNnc3RyICJjw6J1IGzhu4duaCBzYWkgYCUuNTBzJyIKK21zZ3N0ciAiY8OidSBs4buHbmggc2FpIMKrICUuNTBzIMK7IgogCiAjOiBmcjMwLWFzbS5jOjcxMyBmcnYtYXNtLmM6MTY4OCBpcDJrLWFzbS5jOjkyMCBpcTIwMDAtYXNtLmM6ODU1CiAjOiBtMzJyLWFzbS5jOjcyOCBvcGVucmlzYy1hc20uYzo2NDIgeHN0b3JteTE2LWFzbS5jOjY3NAogIywgYy1mb3JtYXQKIG1zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzJyIKLW1zZ3N0ciAiY8OidSBs4buHbmggc2FpIGAlLjUwcyciCittc2dzdHIgImPDonUgbOG7h25oIHNhaSDCqyAlLjUwcyDCuyIKIAogIy4gRGVmYXVsdCB0ZXh0IHRvIHByaW50IGlmIGFuIGluc3RydWN0aW9uIGlzbid0IHJlY29nbml6ZWQuCiAjOiBmcjMwLWRpcy5jOjQxIGZydi1kaXMuYzo0MSBpcDJrLWRpcy5jOjQxIGlxMjAwMC1kaXMuYzo0MSBtMzJyLWRpcy5jOjQxCiAjOiBtbWl4LWRpcy5jOjI4NCBvcGVucmlzYy1kaXMuYzo0MSB4c3Rvcm15MTYtZGlzLmM6NDEKIG1zZ2lkICIqdW5rbm93bioiCi1tc2dzdHIgIipraMO0bmcgYmnhur90KiIKK21zZ3N0ciAiIOKAoiBraMO0bmcgcsO1IOKAoiIKIAogIzogZnIzMC1kaXMuYzozMTkgZnJ2LWRpcy5jOjQxMCBpcDJrLWRpcy5jOjMxMyBpcTIwMDAtZGlzLmM6MTkxIG0zMnItZGlzLmM6MjYyCiAjOiBvcGVucmlzYy1kaXMuYzoxMzcgeHN0b3JteTE2LWRpcy5jOjE3MApAQCAtMTc4LDcgKzE4MCw3IEBACiAjOiBtMzJyLWlibGQuYzo2Njcgb3BlbnJpc2MtaWJsZC5jOjYzNSB4c3Rvcm15MTYtaWJsZC5jOjY4MAogIywgYy1mb3JtYXQKIG1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgYnVpbGRpbmcgaW5zbi5cbiIKLW1zZ3N0ciAiS2jDtG5nIGNo4bqlcCBuaOG6rW4gdHLGsOG7nW5nICVkIHRyb25nIGtoaSB4w6J5IGThu6VuZyBjw6J1IGzhu4duaC5cbiIKK21zZ3N0ciAiS2jDtG5nIGNo4bqlcCBuaOG6rW4gdHLGsOG7nW5nICVkIHRyb25nIGtoaSB4w6J5IGThu7FuZyBjw6J1IGzhu4duaC5cbiIKIAogIzogZnIzMC1pYmxkLmM6OTM5IGZydi1pYmxkLmM6MTE3NyBpcDJrLWlibGQuYzo2ODYgaXEyMDAwLWlibGQuYzo4OTIKICM6IG0zMnItaWJsZC5jOjgwNiBvcGVucmlzYy1pYmxkLmM6NzM3IHhzdG9ybXkxNi1pYmxkLmM6ODI4CkBAIC0xOTAsMjUgKzE5MiwyNSBAQAogIzogbTMyci1pYmxkLmM6OTIyIG9wZW5yaXNjLWlibGQuYzo4MTcgeHN0b3JteTE2LWlibGQuYzo5NDEKICMsIGMtZm9ybWF0CiBtc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgaW50IG9wZXJhbmQuXG4iCi1tc2dzdHIgIktow7RuZyBjaOG6pXAgbmjhuq1uIHRyxrDhu51uZyAlZCB0cm9uZyBraGkgZ+G7jWkgdMOhYyB04butIHPhu5Egbmd1ecOqbi5cbiIKK21zZ3N0ciAiS2jDtG5nIGNo4bqlcCBuaOG6rW4gdHLGsOG7nW5nICVkIHRyb25nIGtoaSBs4bqleSB0w6FjIHThu60gc+G7kSBuZ3V5w6puLlxuIgogCiAjOiBmcjMwLWlibGQuYzoxMjE3IGZydi1pYmxkLmM6MTcxOSBpcDJrLWlibGQuYzo4MjAgaXEyMDAwLWlibGQuYzoxMTQwCiAjOiBtMzJyLWlibGQuYzoxMDE4IG9wZW5yaXNjLWlibGQuYzo4NzcgeHN0b3JteTE2LWlibGQuYzoxMDM0CiAjLCBjLWZvcm1hdAogbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIHZtYSBvcGVyYW5kLlxuIgotbXNnc3RyICJLaMO0bmcgY2jhuqVwIG5o4bqtbiB0csaw4budbmcgJWQgdHJvbmcga2hpIGfhu41pIHTDoWMgdOG7rSB2bWEuXG4iCittc2dzdHIgIktow7RuZyBjaOG6pXAgbmjhuq1uIHRyxrDhu51uZyAlZCB0cm9uZyBraGkgbOG6pXkgdMOhYyB04butIHZtYS5cbiIKIAogIzogZnIzMC1pYmxkLmM6MTM1MSBmcnYtaWJsZC5jOjE5ODkgaXAyay1pYmxkLmM6ODgyIGlxMjAwMC1pYmxkLmM6MTI2MwogIzogbTMyci1pYmxkLmM6MTEyMiBvcGVucmlzYy1pYmxkLmM6OTQ2IHhzdG9ybXkxNi1pYmxkLmM6MTEzNgogIywgYy1mb3JtYXQKIG1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiS2jDtG5nIGNo4bqlcCBuaOG6rW4gdHLGsOG7nW5nICVkIHRyb25nIGtoaSBs4bqtcCB0w6FjIHThu60gc+G7kSBuZ3V5w6puLlxuIgorbXNnc3RyICJLaMO0bmcgY2jhuqVwIG5o4bqtbiB0csaw4budbmcgJWQgdHJvbmcga2hpIMSR4bq3dCB0w6FjIHThu60gc+G7kSBuZ3V5w6puLlxuIgogCiAjOiBmcjMwLWlibGQuYzoxNDczIGZydi1pYmxkLmM6MjI0NyBpcDJrLWlibGQuYzo5MzIgaXEyMDAwLWlibGQuYzoxMzc0CiAjOiBtMzJyLWlibGQuYzoxMjE0IG9wZW5yaXNjLWlibGQuYzoxMDAzIHhzdG9ybXkxNi1pYmxkLmM6MTIyNgogIywgYy1mb3JtYXQKIG1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyB2bWEgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiS2jDtG5nIGNo4bqlcCBuaOG6rW4gdHLGsOG7nW5nICVkIHRyb25nIGtoaSBs4bqtcCB0w6FjIHThu60gdm1hLlxuIgorbXNnc3RyICJLaMO0bmcgY2jhuqVwIG5o4bqtbiB0csaw4budbmcgJWQgdHJvbmcga2hpIMSR4bq3dCB0w6FjIHThu60gdm1hLlxuIgogCiAjOiBmcnYtYXNtLmM6OTc4CiBtc2dpZCAicmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgZXZlbiIKQEAgLTIyNywxMyArMjI5LDEzIEBACiAjOiBoODUwMC1kaXMuYzoxNDMKICMsIGMtZm9ybWF0CiBtc2dpZCAiY2FuJ3QgY29wZSB3aXRoIGluc2VydCAlZFxuIgotbXNnc3RyICJraMO0bmcgcXXhuqNuIGzDvSDEkcaw4bujYyDEkWnhu4F1IGNow6huICVkXG4iCittc2dzdHIgImtow7RuZyB0aOG7gyB44butIGzDvSDEkWnhu4F1IGNow6huICVkXG4iCiAKICMuIENvdWxkbid0IHVuZGVyc3RhbmQgYW55dGhpbmcuCiAjOiBoODUwMC1kaXMuYzozNDIKICMsIGMtZm9ybWF0CiBtc2dpZCAiJTAyeFx0XHQqdW5rbm93bioiCi1tc2dzdHIgIsKwa2jDtG5nIGJp4bq/dColMDJ4XHRcdCIKK21zZ3N0ciAiJTAyeFx0XHQg4oCiIGtow7RuZyByw7Ug4oCiIgogCiAjOiBpMzg2LWRpcy5jOjE3MzMKIG1zZ2lkICI8aW50ZXJuYWwgZGlzYXNzZW1ibGVyIGVycm9yPiIKQEAgLTI0NywyMSArMjQ5LDIxIEBACiAjOiBpYTY0LWdlbi5jOjMxMAogIywgYy1mb3JtYXQKIG1zZ2lkICIlczogV2FybmluZzogIgotbXNnc3RyICIlczogQ+G6o25oIGLDoW8iCittc2dzdHIgIiVzOiBD4bqjbmggYsOhbyA6ICIKIAogIzogaWE2NC1nZW4uYzo0OTYgaWE2NC1nZW4uYzo3MzAKICMsIGMtZm9ybWF0CiBtc2dpZCAibXVsdGlwbGUgbm90ZSAlcyBub3QgaGFuZGxlZFxuIgotbXNnc3RyICJraMO0bmcgcXXhuqNuIGzDvSDEkcaw4bujYyDEkWEgY2jDuiB0aMOtY2ggJXNcbiIKK21zZ3N0ciAia2jDtG5nIHjhu60gbMO9IMSRxrDhu6NjIMSRYSBjaMO6IHRow61jaCAlc1xuIgogCiAjOiBpYTY0LWdlbi5jOjYwNwogbXNnaWQgImNhbid0IGZpbmQgaWE2NC1pYy50YmwgZm9yIHJlYWRpbmdcbiIKLW1zZ3N0ciAia2jDtG5nIHTDrG0gxJHGsOG7o2MgaWE2NC1pYy50YmwgxJHhu4MgxJHhu41jXG4iCittc2dzdHIgImtow7RuZyB0w6xtIHRo4bqleSBpYTY0LWljLnRibCDEkeG7gyDEkeG7jWNcbiIKIAogIzogaWE2NC1nZW4uYzo4MTIKICMsIGMtZm9ybWF0CiBtc2dpZCAiY2FuJ3QgZmluZCAlcyBmb3IgcmVhZGluZ1xuIgotbXNnc3RyICJraMO0bmcgdMOsbSDEkcaw4bujYyAlcyDEkeG7gyDEkeG7jWNcbiIKK21zZ3N0ciAia2jDtG5nIHTDrG0gdGjhuqV5ICVzIMSR4buDIMSR4buNY1xuIgogCiAjOiBpYTY0LWdlbi5jOjEwMzYKICMsIGMtZm9ybWF0CkBAIC0yNjksMTggKzI3MSwxOCBAQAogIm1vc3QgcmVjZW50IGZvcm1hdCAnJXMnXG4iCiAiYXBwZWFycyBtb3JlIHJlc3RyaWN0aXZlIHRoYW4gJyVzJ1xuIgogbXNnc3RyICIiCi0iaMOsbmggbmjGsCBk4bqhbmcgdGjhu6ljIGfhuqduIMSRw6J5IG5o4bqldCAnJXMnXG4iCi0iZ2nhu5tpIGjhuqFuIGjGoW4gJyVzJ1xuIgorImThuqFuZyB0aOG7qWMgZ+G6p24gxJHDonkgbmjhuqV0IMKrICVzIMK7XG4iCisiY8OzIHbhursgaOG6oW4gaOG6uXAgaMahbiDCqyAlcyDCu1xuIgogCiAjOiBpYTY0LWdlbi5jOjEwNDcKICMsIGMtZm9ybWF0CiBtc2dpZCAib3ZlcmxhcHBpbmcgZmllbGQgJXMtPiVzXG4iCi1tc2dzdHIgInRyxrDhu51uZyBjaOG7k25nIGzhuqVwICVzLT4lc1xuIgorbXNnc3RyICJ0csaw4budbmcgY2jhu5NuZyBs4bqlcCAlcyDihpIgJXNcbiIKIAogIzogaWE2NC1nZW4uYzoxMjQ0CiAjLCBjLWZvcm1hdAogbXNnaWQgIm92ZXJ3cml0aW5nIG5vdGUgJWQgd2l0aCBub3RlICVkIChJQzolcylcbiIKLW1zZ3N0ciAixJFhbmcgZ2hpIMSR4buBIGNow7ogdGjDrWNoICVkIHbhu5tpIGNow7ogdGjDrWNoICVkIChJQzolcylcbiIKK21zZ3N0ciAixJFhbmcgZ2hpIMSRw6ggY2jDuiB0aMOtY2ggJWQgYuG6sW5nIGNow7ogdGjDrWNoICVkIChJQzolcylcbiIKIAogIzogaWE2NC1nZW4uYzoxNDQzCiAjLCBjLWZvcm1hdApAQCAtMzIwLDcgKzMyMiw3IEBACiAjOiBpYTY0LWdlbi5jOjE1NDEKICMsIGMtZm9ybWF0CiBtc2dpZCAiV2FybmluZzogcnNyYyAlcyAoJXMpIGhhcyBubyBjaGtzJXNcbiIKLW1zZ3N0ciAiQ+G6o25oIGLDoW86IHTDoGkgbmd1ecOqbiAlcyAoJXMpIGtow7RuZyBjw7MgY+G6o24gdHLhu58gJXNcbiIKK21zZ3N0ciAiQ+G6o25oIGLDoW8gOiB0w6BpIG5ndXnDqm4gJXMgKCVzKSBraMO0bmcgY8OzIGPhuqNuIHRy4bufICVzXG4iCiAKICM6IGlhNjQtZ2VuLmM6MTU0NQogIywgYy1mb3JtYXQKQEAgLTM0NSw3ICszNDcsNyBAQAogIzogaWE2NC1nZW4uYzoyODE2CiAjLCBjLWZvcm1hdAogbXNnaWQgInVuYWJsZSB0byBjaGFuZ2UgZGlyZWN0b3J5IHRvIFwiJXNcIiwgZXJybm8gPSAlc1xuIgotbXNnc3RyICJraMO0bmcgdGhheSDEkeG7lWkgxJHGsOG7o2MgdGjGsCBt4bulYyB0aMOgbmggXCIlc1wiLCBz4buRIGzhu5dpID0gJXNcbiIKK21zZ3N0ciAia2jDtG5nIHRo4buDIGNodXnhu4NuIMSR4buVaSB0aMawIG3hu6VjIHRow6BuaCDCqyAlcyDCuywgc+G7kSBs4buXaSA9ICVzXG4iCiAKICMuIFdlJ3ZlIGJlZW4gcGFzc2VkIGEgdy4gIFJldHVybiB3aXRoIGFuIGVycm9yIG1lc3NhZ2Ugc28gdGhhdAogIy4gY2dlbiB3aWxsIHRyeSB0aGUgbmV4dCBwYXJzaW5nIG9wdGlvbi4KQEAgLTM1Niw3ICszNTgsNyBAQAogIy4gSW52YWxpZCBvZmZzZXQgcHJlc2VudC4KICM6IGlwMmstYXNtLmM6MTE3CiBtc2dpZCAib2Zmc2V0KElQKSBpcyBub3QgYSB2YWxpZCBmb3JtIgotbXNnc3RyICJvZmZzZXQoSVApIChoaeG7h3Ugc+G7kSkga2jDtG5nIGzDoCBk4bqhbmcgaOG7o3AgbOG7hyIKK21zZ3N0ciAib2Zmc2V0KElQKSAoaGnhu4d1IHPhu5EpIGtow7RuZyBwaOG6o2kgbMOgIGThuqFuZyBo4bujcCBs4buHIgogCiAjLiBGb3VuZCBzb21ldGhpbmcgdGhlcmUgaW4gZnJvbnQgb2YgKERQKSBidXQgaXQncyBvdXQKICMuIG9mIHJhbmdlLgpAQCAtMzgxLDE1ICszODMsMTUgQEAKICMuIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiBvcGluZGV4IGhhcyB0byBiZSBvbmUgb2YgdGhlIGFib3ZlLgogIzogaXAyay1hc20uYzoyNTQKIG1zZ2lkICJwYXJzZV9hZGRyMTY6IGludmFsaWQgb3BpbmRleC4iCi1tc2dzdHIgInBhcnNlX2FkZHIxNjogKMSR4buLYSBjaOG7iSBwaMOibiB0w6FjaCkgb3BpbmRleCAoY2jhu4kgbeG7pWMgbG/huqFpIHTDoWMgdOG7rSkga2jDtG5nIGjhu6NwIGzhu4cuIgorbXNnc3RyICJwYXJzZV9hZGRyMTY6ICjEkeG7i2EgY2jhu4kgcGjDom4gdMOhY2gpIG9waW5kZXggKGNo4buJIG3hu6VjIGtp4buDdSB0w6FjIHThu60pIGtow7RuZyBo4bujcCBs4buHLiIKIAogIzogaXAyay1hc20uYzozMDkKIG1zZ2lkICJCeXRlIGFkZHJlc3MgcmVxdWlyZWQuIC0gbXVzdCBiZSBldmVuLiIKLW1zZ3N0ciAiQ+G6p24gxJHhur9uIMSR4buLYSBjaOG7iSBieXRlIC0gcGjhuqNpIGzDoCBz4buRIGNo4bq1bi4iCittc2dzdHIgIkPhuqduIMSR4bq/biDEkeG7i2EgY2jhu4kgYnl0ZSDigJQgcGjhuqNpIGzDoCBz4buRIGNo4bq1bi4iCiAKICM6IGlwMmstYXNtLmM6MzE4CiBtc2dpZCAiY2dlbl9wYXJzZV9hZGRyZXNzIHJldHVybmVkIGEgc3ltYm9sLiBMaXRlcmFsIHJlcXVpcmVkLiIKLW1zZ3N0ciAiY2dlbl9wYXJzZV9hZGRyZXNzICjEkeG7i2EgY2jhu4kgcGjDom4gdMOhY2ggY2dlbikgxJHDoyBn4buNaSBt4buZdCBrw70gaGnhu4d1OiBjw7JuIGPhuqduIMSR4bq/biBo4bqxbmcgbcOjIG5ndeG7k24uIgorbXNnc3RyICJjZ2VuX3BhcnNlX2FkZHJlc3MgKMSR4buLYSBjaOG7iSBwaMOibiB0w6FjaCBjZ2VuKSDEkcOjIHRy4bqjIGfhu59pIG3hu5l0IGvDvSBoaeG7h3U6IGPDsm4gY+G6p24gxJHhur9uIMSRaeG7gXUgbmdoxKlhIGNo4buvLiIKIAogIzogaXAyay1hc20uYzozNzYKICMsIGZ1enp5LCBjLWZvcm1hdApAQCAtNDE1LDIyICs0MTcsMjIgQEAKICM6IGlxMjAwMC1hc20uYzoyMTAgaXEyMDAwLWFzbS5jOjI0MCBpcTIwMDAtYXNtLmM6Mjc3IGlxMjAwMC1hc20uYzozMTAKICM6IG9wZW5yaXNjLWFzbS5jOjkwIG9wZW5yaXNjLWFzbS5jOjE0NAogbXNnaWQgIm1pc3NpbmcgYCknIgotbXNnc3RyICJ0aGnhur91IGApJyIKK21zZ3N0ciAidGhp4bq/dSBk4bqldSBuZ2/hurdjIMSRw7NuZyDCqyApIMK7IgogCiAjOiBtMTAyMDAtZGlzLmM6MTk5CiAjLCBjLWZvcm1hdAogbXNnaWQgInVua25vd25cdDB4JTAyeCIKLW1zZ3N0ciAia2jDtG5nIGJp4bq/dFx0MHglMDJ4IgorbXNnc3RyICJcdDB4JTAyeCBraMO0bmcgcsO1IgogCiAjOiBtMTAyMDAtZGlzLmM6MzM5CiAjLCBjLWZvcm1hdAogbXNnaWQgInVua25vd25cdDB4JTA0bHgiCi1tc2dzdHIgImtow7RuZyBiaeG6v3RcdDB4JTA0bHgiCittc2dzdHIgIlx0MHglMDRseCBraMO0bmcgcsO1IgogCiAjOiBtMTAzMDAtZGlzLmM6NzY3CiAjLCBjLWZvcm1hdAogbXNnaWQgInVua25vd25cdDB4JTA0eCIKLW1zZ3N0ciAia2jDtG5nIGJp4bq/dFx0MHglMDR4IgorbXNnc3RyICJcdDB4JTA0eCBraMO0bmcgcsO1IgogCiAjOiBtNjhrLWRpcy5jOjI5NQogIywgYy1mb3JtYXQKQEAgLTU1Miw3ICs1NTQsNyBAQAogIiAgICIKIG1zZ3N0ciAiIgogIlxuIgotIiAgVuG7m2kgbmjhu69uZyB0w7l5IGNo4buNbiDhu58gdHLDqm4sIGjhu5cgdHLhu6Mgbmjhu69uZyBnacOhIHRy4buLIHRoZW8gxJHDonkgY2hvIFwiQUJJXCI6XG4iCisiICBW4bubaSBuaOG7r25nIHTDuXkgY2jhu41uIOG7nyB0csOqbiwgaOG7lyB0cuG7oyBuaOG7r25nIGdpw6EgdHLhu4sgdGhlbyDEkcOieSBjaG8gwqsgQUJJIMK7OlxuIgogIiAgICIKIAogIzogbWlwcy1kaXMuYzoxODQwIG1pcHMtZGlzLmM6MTg0OCBtaXBzLWRpcy5jOjE4NTAKQEAgLTU2OCwyNyArNTcwLDI3IEBACiAiICAgIgogbXNnc3RyICIiCiAiXG4iCi0iICBW4bubaSBuaOG7r25nIHTDuXkgY2jhu41uIOG7nyB0csOqbiwgaOG7lyB0cuG7oyBuaOG7r25nIGdpw6EgdHLhu4sgdGhlbyDEkcOieSBjaG8gXCJBUkNIXCI6XG4iCisiICBW4bubaSBuaOG7r25nIHTDuXkgY2jhu41uIOG7nyB0csOqbiwgaOG7lyB0cuG7oyBuaOG7r25nIGdpw6EgdHLhu4sgdGhlbyDEkcOieSBjaG8gwqsgQVJDSCDCuzpcbiIKICIgICAiCiAKICM6IG1taXgtZGlzLmM6MzQKICMsIGMtZm9ybWF0CiBtc2dpZCAiQmFkIGNhc2UgJWQgKCVzKSBpbiAlczolZFxuIgotbXNnc3RyICJUcsaw4budbmcgaOG7o3Agc2FpICVkICglcykgdHJvbmcgJXM6JWRcbiIKK21zZ3N0ciAiQ2jhu68gaG9hL3RoxrDhu51uZyBzYWkgJWQgKCVzKSB0cm9uZyAlczolZFxuIgogCiAjOiBtbWl4LWRpcy5jOjQ0CiAjLCBjLWZvcm1hdAogbXNnaWQgIkludGVybmFsOiBOb24tZGVidWdnZWQgY29kZSAodGVzdC1jYXNlIG1pc3NpbmcpOiAlczolZCIKLW1zZ3N0ciAiTuG7mWkgYuG7mTogY2jGsGEgZ+G7oSBs4buXaSBtw6MgKHRoaeG6v3UgdHLGsOG7nW5nIGjhu6NwIHRo4butKTogJXM6JWQiCittc2dzdHIgIk7hu5lpIGLhu5kgOiBjaMawYSBn4buhIGzhu5dpIG3DoyAodGhp4bq/dSB0csaw4budbmcgaOG7o3AgdGjhu60pOiAlczolZCIKIAogIzogbW1peC1kaXMuYzo1MwogbXNnaWQgIih1bmtub3duKSIKLW1zZ3N0ciAiKGtow7RuZyBiaeG6v3QpIgorbXNnc3RyICIoa2jDtG5nIHLDtSkiCiAKICM6IG1taXgtZGlzLmM6NTE5CiAjLCBjLWZvcm1hdAogbXNnaWQgIip1bmtub3duIG9wZXJhbmRzIHR5cGU6ICVkKiIKLW1zZ3N0ciAiKmtow7RuZyBiaeG6v3QgbG/huqFpIHTDoWMgdOG7rTogJWQqIgorbXNnc3RyICLigKIga2jDtG5nIGJp4bq/dCBraeG7g3UgdMOhYyB04butOiAlZCDigKIiCiAKICMuIEkgYW5kIFogYXJlIG91dHB1dCBvcGVyYW5kcyBhbmQgY2FuYHQgYmUgaW1tZWRpYXRlCiAjLiAqIEEgaXMgYW4gYWRkcmVzcyBhbmQgd2UgY2FuYHQgaGF2ZSB0aGUgYWRkcmVzcyBvZgpAQCAtNjAzLDExICs2MDUsMTEgQEAKIAogIzogcHBjLW9wYy5jOjc5NCBwcGMtb3BjLmM6ODIyCiBtc2dpZCAiaW52YWxpZCBjb25kaXRpb25hbCBvcHRpb24iCi1tc2dzdHIgInTDuXkgY2jhu41uIHRodeG7mWMgxJFp4buBdSBraeG7h24ga2jDtG5nIGjhu6NwIGzhu4ciCittc2dzdHIgInTDuXkgY2jhu41uIMSRaeG7gXUga2nhu4duIGtow7RuZyBo4bujcCBs4buHIgogCiAjOiBwcGMtb3BjLmM6ODI0CiBtc2dpZCAiYXR0ZW1wdCB0byBzZXQgeSBiaXQgd2hlbiB1c2luZyArIG9yIC0gbW9kaWZpZXIiCi1tc2dzdHIgImPhu5EgbOG6rXAgwqtiaXQgecK7IGtoaSBz4butIGThu6VuZyDEkWnhu4F1IHPhu61hIMSR4buVaSArIGhheSAtIgorbXNnc3RyICJj4buRIGzhuq1wIMKrIGJpdCB5IMK7IGtoaSBz4butIGThu6VuZyDEkWnhu4F1IHPhu61hIMSR4buVaSArIGhheSAtIgogCiAjOiBwcGMtb3BjLmM6ODUyCiBtc2dpZCAib2Zmc2V0IG5vdCBhIG11bHRpcGxlIG9mIDE2IgpAQCAtNjYzLDE1ICs2NjUsMTUgQEAKIAogIzogcHBjLW9wYy5jOjEyMDUKIG1zZ2lkICJ2YWx1ZSBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgImdpw6EgdHLhu4sgY8Ogbmgg4bufIG5nb+G6oWkgcGjhuqFtIHbhu4siCittc2dzdHIgImdpw6EgdHLhu4sg4bufIG5nb+G6oWkgcGjhuqFtIHbhu4siCiAKICM6IHBwYy1vcGMuYzoxMjczCiBtc2dpZCAiaW5kZXggcmVnaXN0ZXIgaW4gbG9hZCByYW5nZSIKLW1zZ3N0ciAidGhhbmggZ2hpIGPGoSBz4buRIHRyb25nIHBo4bqhbSB24buLIG7huqFwIgorbXNnc3RyICJ0aGFuaCBnaGkgY8ahIHPhu5EgdHJvbmcgcGjhuqFtIHbhu4sgdOG6o2kiCiAKICM6IHBwYy1vcGMuYzoxMjg5CiBtc2dpZCAic291cmNlIGFuZCB0YXJnZXQgcmVnaXN0ZXIgb3BlcmFuZHMgbXVzdCBiZSBkaWZmZXJlbnQiCi1tc2dzdHIgInTDoWMgdOG7rSB0aGFuaCBnaGkgY+G6oyBoYWkgbG/huqFpIG5ndeG7k24gdsOgIMSRw61jaCDEkeG7gXUgcGjhuqNpIGzDoCBraMOhYyBuaGF1IgorbXNnc3RyICJ0w6FjIHThu60gdGhhbmggZ2hpIGtp4buDdSBj4bqjIG5ndeG7k24gbOG6q24gxJHDrWNoIMSR4buBdSBwaOG6o2kgbMOgIGtow6FjIG5oYXUiCiAKICM6IHBwYy1vcGMuYzoxMzA0CiBtc2dpZCAiaW52YWxpZCByZWdpc3RlciBvcGVyYW5kIHdoZW4gdXBkYXRpbmciCkBAIC02ODgsMjcgKzY5MCwyNyBAQAogIy4gTWFyayBhcyBub24tdmFsaWQgaW5zdHJ1Y3Rpb24uCiAjOiBzcGFyYy1kaXMuYzo3NjAKIG1zZ2lkICJ1bmtub3duIgotbXNnc3RyICJraMO0bmcgYmnhur90IgorbXNnc3RyICJraMO0bmcgcsO1IgogCiAjOiBzcGFyYy1kaXMuYzo4MzUKICMsIGMtZm9ybWF0CiBtc2dpZCAiSW50ZXJuYWwgZXJyb3I6ICBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIKLW1zZ3N0ciAiTOG7l2kgbuG7mWkgYuG7mTogc3BhcmMtb3Bjb2RlLmggc2FpOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iCittc2dzdHIgIkzhu5dpIG7hu5lpIGLhu5kgOiBzcGFyYy1vcGNvZGUuaCBzYWk6IMKrICVzIMK7LCAlIy44bHgsICUjLjhseFxuIgogCiAjOiBzcGFyYy1kaXMuYzo4NDYKICMsIGMtZm9ybWF0CiBtc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIgotbXNnc3RyICJM4buXaSBu4buZaSBi4buZOiBzcGFyYy1vcGNvZGUuaCBzYWk6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIKK21zZ3N0ciAiTOG7l2kgbuG7mWkgYuG7mSA6IHNwYXJjLW9wY29kZS5oIHNhaTogwqsgJXMgwrssICUjLjhseCwgJSMuOGx4XG4iCiAKICM6IHNwYXJjLWRpcy5jOjg5NQogIywgYy1mb3JtYXQKIG1zZ2lkICJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIgPT0gXCIlc1wiXG4iCi1tc2dzdHIgIkzhu5dpIG7hu5lpIGLhu5k6IHNwYXJjLW9wY29kZS5oIHNhaTogXCIlc1wiID09IFwiJXNcIlxuIgorbXNnc3RyICJM4buXaSBu4buZaSBi4buZIDogc3BhcmMtb3Bjb2RlLmggc2FpOiDCqyAlcyDCuyA9PSBcIiVzXCJcbiIKIAogIzogdjg1MC1kaXMuYzoyMjUKICMsIGMtZm9ybWF0CiBtc2dpZCAidW5rbm93biBvcGVyYW5kIHNoaWZ0OiAleFxuIgotbXNnc3RyICJraMO0bmcgYmnhur90IHBow61tIHNoaWZ0IChiw6puIHRyw6FpIGhheSBiw6puIHBo4bqjaSkgY+G7p2EgdMOhYyB04butOiAleFxuIgorbXNnc3RyICJraMO0bmcgYmnhur90IGPDoWNoIGThu4tjaCB0w6FjIHThu606ICV4XG4iCiAKICM6IHY4NTAtZGlzLmM6MjM3CiAjLCBjLWZvcm1hdApAQCAtNzIyLDcgKzcyNCw3IEBACiAjLiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGdpdmVuIHRvIEdBUy4KICM6IHY4NTAtb3BjLmM6NjkKIG1zZ2lkICJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGluIHJhbmdlIGFuZCBpcyBub3QgYWxpZ25lZCIKLW1zZ3N0ciAiZ2nDoSB0cuG7iyBkaSBjaHV54buDbiDhu58gbmdv4bqhaSBwaOG6oW0gduG7iyB2w6AgY2jGsGEgY2FuaCBs4buBIG7DsyIKK21zZ3N0ciAiZ2nDoSB0cuG7iyBkaSBjaHV54buDbiDhu58gbmdv4bqhaSBwaOG6oW0gduG7iyB2w6AgY2jGsGEgxJHGsOG7o2MgY2FuaCBs4buBIgogCiAjOiB2ODUwLW9wYy5jOjcwCiBtc2dpZCAiZGlzcGxhY2VtZW50IHZhbHVlIGlzIG91dCBvZiByYW5nZSIKQEAgLTczOCw3ICs3NDAsNyBAQAogCiAjOiB2ODUwLW9wYy5jOjg0CiBtc2dpZCAiYnJhbmNoIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgdG8gb2RkIG9mZnNldCIKLW1zZ3N0ciAiZ2nDoSB0cuG7iyBjw6BuaCDhu58gbmdv4bqhaSBwaOG6oW0gduG7iyB2w6AgduG7m2kgaGnhu4d1IHPhu5EgbOG6uyIKK21zZ3N0ciAiZ2nDoSB0cuG7iyBjw6BuaCDhu58gbmdv4bqhaSBwaOG6oW0gduG7iyB2w6AgxJHhu5FpIHbhu5tpIGhp4buHdSBz4buRIGzhursiCiAKICM6IHY4NTAtb3BjLmM6ODYgdjg1MC1vcGMuYzoxMTgKIG1zZ2lkICJicmFuY2ggdmFsdWUgb3V0IG9mIHJhbmdlIgpAQCAtNzQ2LDExICs3NDgsMTEgQEAKIAogIzogdjg1MC1vcGMuYzo4OSB2ODUwLW9wYy5jOjEyMQogbXNnaWQgImJyYW5jaCB0byBvZGQgb2Zmc2V0IgotbXNnc3RyICJuaMOhbmggduG7m2kgaGnhu4d1IHPhu5EgbOG6uyIKK21zZ3N0ciAibmjDoW5oIMSR4buRaSB24bubaSBoaeG7h3Ugc+G7kSBs4bq7IgogCiAjOiB2ODUwLW9wYy5jOjExNgogbXNnaWQgImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIGFuIG9kZCBvZmZzZXQiCi1tc2dzdHIgImdpw6EgdHLhu4sgbmjDoW5oIOG7nyBuZ2/huqFpIHBo4bqhbSB24buLIHbDoCB24bubaSBoaeG7h3Ugc+G7kSBs4bq7IgorbXNnc3RyICJnacOhIHRy4buLIG5ow6FuaCDhu58gbmdv4bqhaSBwaOG6oW0gduG7iyB2w6AgxJHhu5FpIHbhu5tpIGhp4buHdSBz4buRIGzhursiCiAKICM6IHY4NTAtb3BjLmM6MzQ3CiBtc2dpZCAiaW52YWxpZCByZWdpc3RlciBmb3Igc3RhY2sgYWRqdXN0bWVudCIKQEAgLTc2NiwxMSArNzY4LDExIEBACiAKICM6IHhzdG9ybXkxNi1hc20uYzo3NgogbXNnaWQgIkJhZCByZWdpc3RlciBpbiBwcmVpbmNyZW1lbnQiCi1tc2dzdHIgIlRoYW5oIGdoaSBzYWkgdHJvbmcgxJFp4buBdSB0csaw4bubYyBsxrDhu6NuZyBnaWEiCittc2dzdHIgIlRoYW5oIGdoaSBzYWkgdHJvbmcgdGnhu4FuIGzGsOG7o25nIGdpYSIKIAogIzogeHN0b3JteTE2LWFzbS5jOjgxCiBtc2dpZCAiQmFkIHJlZ2lzdGVyIGluIHBvc3RpbmNyZW1lbnQiCi1tc2dzdHIgIlRoYW5oIGdoaSBzYWkgdHJvbmcgxJFp4buBdSBzYXUgbMaw4bujbmcgZ2lhIgorbXNnc3RyICJUaGFuaCBnaGkgc2FpIHRyb25nIGjhuq11IGzGsOG7o25nIGdpYSIKIAogIzogeHN0b3JteTE2LWFzbS5jOjgzCiBtc2dpZCAiQmFkIHJlZ2lzdGVyIG5hbWUiCkBAIC03ODIsNyArNzg0LDcgQEAKIAogIzogeHN0b3JteTE2LWFzbS5jOjkxCiBtc2dpZCAiTGFiZWwgY29uZmxpY3RzIHdpdGggYFJ4JyIKLW1zZ3N0ciAiTmjDo24geHVuZyDEkeG7mXQgduG7m2kgYFJ4JyIKK21zZ3N0ciAiTmjDo24geHVuZyDEkeG7mXQgduG7m2kgwqsgUnggwrsiCiAKICM6IHhzdG9ybXkxNi1hc20uYzo5MwogbXNnaWQgIkJhZCBpbW1lZGlhdGUgZXhwcmVzc2lvbiIKQEAgLTgwMiw0ICs4MDQsNCBAQAogCiAjOiB4c3Rvcm15MTYtYXNtLmM6MTcyCiBtc2dpZCAiU3ludGF4IGVycm9yOiBObyB0cmFpbGluZyAnKSciCi1tc2dzdHIgIkzhu5dpIGPDuiBwaMOhcDoga2jDtG5nIGPDsyAnKScgxJFpIHRoZW8iCittc2dzdHIgIkzhu5dpIGPDuiBwaMOhcDoga2jDtG5nIGPDsyBk4bqldSBuZ2/hurdjIMSRw7NuZyDCqyApIMK7IMSRaSB0aGVvIgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvQ2hhbmdlTG9nLmdkYiBiL3JlYWRsaW5lL0NoYW5nZUxvZy5nZGIKaW5kZXggODYzYmVjYS4uZTk1NjE5MyAxMDA2NDQKLS0tIGEvcmVhZGxpbmUvQ2hhbmdlTG9nLmdkYgorKysgYi9yZWFkbGluZS9DaGFuZ2VMb2cuZ2RiCkBAIC0yNjYsMTIgKzI2NiwxNyBAQAogCShpbnNlcnRfc29tZV9jaGFycykgW19fTVNET1NfX106IERvbid0IGNhbGwgdHB1dHMuCiAJKGRlbGV0ZV9jaGFycykgW19fTVNET1NfX106IERvbid0IGNhbGwgdHB1dHMuCiAKLTIwMDAtMDctMDkgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KKzIwMDAtMDctMDggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KKworICAgICAgICAqIHJlYWRsaW5lL3JlYWRsaW5lLmg6IElmZGVmIG91dCB0aGUgZXhwb3J0IG9mIHNhdmVzdHJpbmcoKS4KKyAgICAgICAgSXQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gaW4gdGhlIGRpc3RyaWJ1dGlvbi4KKworMjAwMC0wNy0wNyAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgogCiAgICAgICAgICogSW1wb3J0IG9mIHJlYWRsaW5lIDQuMS4KIAogICAgICAgICBMb2NhbGx5IG1vZGlmaWVkIGZpbGVzOiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCBjb25maWd1cmUKLSAgICAgICAgKHJlZ2VuZXJhdGVkKSwgY29uZmlnLmguaW4gKHJlZ2VuZXJhdGVkKSwgcmVhZGxpbmUuaCwgcmx0dHkuYywKKyAgICAgICAgKHJlZ2VuZXJhdGVkKSwgY29uZmlnLmguaW4gKHJlZ2VuZXJhdGVkKSwgcmx0dHkuYywKICAJc2hlbGwuYyBzaWduYWxzLmMuCiAKICAgICAgICAgTG9jYWxseSBhZGRlZCBmaWxlczogYWNjb25maWcuaCwgY29uZmlnLyosIGNvbmZpZy5oLmJvdCwKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL05FV1MgYi9yZWFkbGluZS9ORVdTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZTY3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbGluZS9ORVdTCkBAIC0wLDAgKzEsMzIgQEAKK1RoaXMgaXMgYSB0ZXJzZSBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IGZlYXR1cmVzIGFkZGVkIHRvIHJlYWRsaW5lLTUuMSBzaW5jZQordGhlIHJlbGVhc2Ugb2YgcmVhZGxpbmUtNS4wLgorCisxLiAgTmV3IEZlYXR1cmVzIGluIFJlYWRsaW5lCisKK2EuICBUaGUga2V5IHNlcXVlbmNlIHNlbnQgYnkgdGhlIGtleXBhZCBgZGVsZXRlJyBrZXkgaXMgbm93IGF1dG9tYXRpY2FsbHkgICAKKyAgICBib3VuZCB0byBkZWxldGUtY2hhci4KKworYi4gIEEgbmVnYXRpdmUgYXJndW1lbnQgdG8gbWVudS1jb21wbGV0ZSBub3cgY3ljbGVzIGJhY2t3YXJkIHRocm91Z2ggdGhlCisgICAgY29tcGxldGlvbiBsaXN0LgorCitjLiAgQSBuZXcgYmluZGFibGUgcmVhZGxpbmUgdmFyaWFibGU6ICBiaW5kLXR0eS1zcGVjaWFsLWNoYXJzLiAgSWYgbm9uLXplcm8sCisgICAgcmVhZGxpbmUgd2lsbCBiaW5kIHRoZSB0ZXJtaW5hbCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gdGhlaXIgcmVhZGxpbmUKKyAgICBlcXVpdmFsZW50cyB3aGVuIGl0J3MgY2FsbGVkIChvbiBieSBkZWZhdWx0KS4KKworZC4gIE5ldyBiaW5kYWJsZSBjb21tYW5kOiB2aS1ydWJvdXQuICBTYXZlcyBkZWxldGVkIHRleHQgZm9yIHBvc3NpYmxlICAKKyAgICByZWluc2VydGlvbiwgYXMgd2l0aCBhbnkgdmktbW9kZSBgdGV4dCBtb2RpZmljYXRpb24nIGNvbW1hbmQ7IGBYJyBpcyBib3VuZAorICAgIHRvIHRoaXMgaW4gdmkgY29tbWFuZCBtb2RlLgorCitlLiAgSWYgdGhlIHJsX2NvbXBsZXRpb25fcXVlcnlfaXRlbXMgaXMgc2V0IHRvIGEgdmFsdWUgPCAwLCByZWFkbGluZSBuZXZlcgorICAgIGFza3MgdGhlIHVzZXIgd2hldGhlciBvciBub3QgdG8gdmlldyB0aGUgcG9zc2libGUgY29tcGxldGlvbnMuCisKK2YuICBOZXcgYXBwbGljYXRpb24tY2FsbGFibGUgYXV4aWxpYXJ5IGZ1bmN0aW9uLCBybF92YXJpYWJsZV92YWx1ZSwgcmV0dXJucworICAgIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gYSByZWFkbGluZSB2YXJpYWJsZSdzIHZhbHVlLgorCitnLiAgV2hlbiBwYXJzaW5nIGlucHV0cmMgZmlsZXMgYW5kIHZhcmlhYmxlIGJpbmRpbmcgY29tbWFuZHMsIHRoZSBwYXJzZXIKKyAgICBzdHJpcHMgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHZhbHVlcyBhc3NpZ25lZCB0byBib29sZWFuIHZhcmlhYmxlcworICAgIGJlZm9yZSBjaGVja2luZyB0aGVtLgorCitoLiAgQSBuZXcgZXh0ZXJuYWwgYXBwbGljYXRpb24tY29udHJvbGxhYmxlIHZhcmlhYmxlIHRoYXQgYWxsb3dzIHRoZSBMSU5FUworICAgIGFuZCBDT0xVTU5TIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgdGhlIHdpbmRvdyBzaXplIHJlZ2FyZGxlc3Mgb2YKKyAgICB3aGF0IHRoZSBrZXJuZWwgcmV0dXJucy4KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2NvbmZpZ3VyZSBiL3JlYWRsaW5lL2NvbmZpZ3VyZQppbmRleCBiOWNlZGNkLi43MjBkNzg5IDEwMDc1NQotLS0gYS9yZWFkbGluZS9jb25maWd1cmUKKysrIGIvcmVhZGxpbmUvY29uZmlndXJlCkBAIC04NDksNiArODQ5LDEwIEBACiBPcHRpb25hbCBGZWF0dXJlczoKICAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQogICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCis8PDw8PDw8IGNvbmZpZ3VyZQorICAtLWVuYWJsZS1zaGFyZWQgICAgICAgICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PU5PXQorPT09PT09PQorPj4+Pj4+PiAxLjYKICAgLS1lbmFibGUtc3RhdGljICAgICAgICAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD1ZRVNdCiAKIE9wdGlvbmFsIFBhY2thZ2VzOgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL0NoYW5nZUxvZy5nZGIgYi9yZWFkbGluZS9kb2MvQ2hhbmdlTG9nLmdkYgppbmRleCA4NTRkM2VlLi4xMjUzZDljIDEwMDY0NAotLS0gYS9yZWFkbGluZS9kb2MvQ2hhbmdlTG9nLmdkYgorKysgYi9yZWFkbGluZS9kb2MvQ2hhbmdlTG9nLmdkYgpAQCAtMTMsNiArMTMsMTAgQEAKIAogMjAwMC0wNy0wOSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgogCisgICAgICAgICogUmVtb3ZlZCBnZW5lcmF0ZWQgZmlsZXMgcmx1c2VybWFuLntkdmksIGluZm8sIGh0bWwsIHBzfS4KKworMjAwMC0wNy0wNyAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCiAgICAgICAgICogSW1wb3J0IG9mIHJlYWRsaW5lIDQuMS4KIAogICAgICAgICBSZWdlbmVyYXRlZCBpbmMtaGlzdC50ZXhpbmZvIGFzIGNvcHkgb2YgaHN1c2VyLnRleGluZm8sIGZvcgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL2ZkbC50ZXhpIGIvcmVhZGxpbmUvZG9jL2ZkbC50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZWFkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbGluZS9kb2MvZmRsLnRleGkKQEAgLTAsMCArMSw0NTIgQEAKKworQG5vZGUgR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlCitAYXBwZW5kaXhzZWMgR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlCisKK0BjaW5kZXggRkRMLCBHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UKK0BjZW50ZXIgVmVyc2lvbiAxLjIsIE5vdmVtYmVyIDIwMDIKKworQGRpc3BsYXkKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMjAwMCwyMDAxLDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCis1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCitAZW5kIGRpc3BsYXkKKworQGVudW1lcmF0ZSAwCitAaXRlbQorUFJFQU1CTEUKKworVGhlIHB1cnBvc2Ugb2YgdGhpcyBMaWNlbnNlIGlzIHRvIG1ha2UgYSBtYW51YWwsIHRleHRib29rLCBvciBvdGhlcgorZnVuY3Rpb25hbCBhbmQgdXNlZnVsIGRvY3VtZW50IEBkZm57ZnJlZX0gaW4gdGhlIHNlbnNlIG9mIGZyZWVkb206IHRvCithc3N1cmUgZXZlcnlvbmUgdGhlIGVmZmVjdGl2ZSBmcmVlZG9tIHRvIGNvcHkgYW5kIHJlZGlzdHJpYnV0ZSBpdCwKK3dpdGggb3Igd2l0aG91dCBtb2RpZnlpbmcgaXQsIGVpdGhlciBjb21tZXJjaWFsbHkgb3Igbm9uY29tbWVyY2lhbGx5LgorU2Vjb25kYXJpbHksIHRoaXMgTGljZW5zZSBwcmVzZXJ2ZXMgZm9yIHRoZSBhdXRob3IgYW5kIHB1Ymxpc2hlciBhIHdheQordG8gZ2V0IGNyZWRpdCBmb3IgdGhlaXIgd29yaywgd2hpbGUgbm90IGJlaW5nIGNvbnNpZGVyZWQgcmVzcG9uc2libGUKK2ZvciBtb2RpZmljYXRpb25zIG1hZGUgYnkgb3RoZXJzLgorCitUaGlzIExpY2Vuc2UgaXMgYSBraW5kIG9mIGBgY29weWxlZnQnJywgd2hpY2ggbWVhbnMgdGhhdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgZG9jdW1lbnQgbXVzdCB0aGVtc2VsdmVzIGJlIGZyZWUgaW4gdGhlIHNhbWUgc2Vuc2UuICBJdAorY29tcGxlbWVudHMgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCBpcyBhIGNvcHlsZWZ0CitsaWNlbnNlIGRlc2lnbmVkIGZvciBmcmVlIHNvZnR3YXJlLgorCitXZSBoYXZlIGRlc2lnbmVkIHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byB1c2UgaXQgZm9yIG1hbnVhbHMgZm9yIGZyZWUKK3NvZnR3YXJlLCBiZWNhdXNlIGZyZWUgc29mdHdhcmUgbmVlZHMgZnJlZSBkb2N1bWVudGF0aW9uOiBhIGZyZWUKK3Byb2dyYW0gc2hvdWxkIGNvbWUgd2l0aCBtYW51YWxzIHByb3ZpZGluZyB0aGUgc2FtZSBmcmVlZG9tcyB0aGF0IHRoZQorc29mdHdhcmUgZG9lcy4gIEJ1dCB0aGlzIExpY2Vuc2UgaXMgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgbWFudWFsczsKK2l0IGNhbiBiZSB1c2VkIGZvciBhbnkgdGV4dHVhbCB3b3JrLCByZWdhcmRsZXNzIG9mIHN1YmplY3QgbWF0dGVyIG9yCit3aGV0aGVyIGl0IGlzIHB1Ymxpc2hlZCBhcyBhIHByaW50ZWQgYm9vay4gIFdlIHJlY29tbWVuZCB0aGlzIExpY2Vuc2UKK3ByaW5jaXBhbGx5IGZvciB3b3JrcyB3aG9zZSBwdXJwb3NlIGlzIGluc3RydWN0aW9uIG9yIHJlZmVyZW5jZS4KKworQGl0ZW0KK0FQUExJQ0FCSUxJVFkgQU5EIERFRklOSVRJT05TCisKK1RoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBtYW51YWwgb3Igb3RoZXIgd29yaywgaW4gYW55IG1lZGl1bSwgdGhhdAorY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBjYW4gYmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuICBTdWNoIGEgbm90aWNlIGdyYW50cyBhCit3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUgbGljZW5zZSwgdW5saW1pdGVkIGluIGR1cmF0aW9uLCB0byB1c2UgdGhhdAord29yayB1bmRlciB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaGVyZWluLiAgVGhlIGBgRG9jdW1lbnQnJywgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggbWFudWFsIG9yIHdvcmsuICBBbnkgbWVtYmVyIG9mIHRoZSBwdWJsaWMgaXMgYQorbGljZW5zZWUsIGFuZCBpcyBhZGRyZXNzZWQgYXMgYGB5b3UnJy4gIFlvdSBhY2NlcHQgdGhlIGxpY2Vuc2UgaWYgeW91Citjb3B5LCBtb2RpZnkgb3IgZGlzdHJpYnV0ZSB0aGUgd29yayBpbiBhIHdheSByZXF1aXJpbmcgcGVybWlzc2lvbgordW5kZXIgY29weXJpZ2h0IGxhdy4KKworQSBgYE1vZGlmaWVkIFZlcnNpb24nJyBvZiB0aGUgRG9jdW1lbnQgbWVhbnMgYW55IHdvcmsgY29udGFpbmluZyB0aGUKK0RvY3VtZW50IG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIGNvcGllZCB2ZXJiYXRpbSwgb3Igd2l0aAorbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuCisKK0EgYGBTZWNvbmRhcnkgU2VjdGlvbicnIGlzIGEgbmFtZWQgYXBwZW5kaXggb3IgYSBmcm9udC1tYXR0ZXIgc2VjdGlvbgorb2YgdGhlIERvY3VtZW50IHRoYXQgZGVhbHMgZXhjbHVzaXZlbHkgd2l0aCB0aGUgcmVsYXRpb25zaGlwIG9mIHRoZQorcHVibGlzaGVycyBvciBhdXRob3JzIG9mIHRoZSBEb2N1bWVudCB0byB0aGUgRG9jdW1lbnQncyBvdmVyYWxsCitzdWJqZWN0IChvciB0byByZWxhdGVkIG1hdHRlcnMpIGFuZCBjb250YWlucyBub3RoaW5nIHRoYXQgY291bGQgZmFsbAorZGlyZWN0bHkgd2l0aGluIHRoYXQgb3ZlcmFsbCBzdWJqZWN0LiAgKFRodXMsIGlmIHRoZSBEb2N1bWVudCBpcyBpbgorcGFydCBhIHRleHRib29rIG9mIG1hdGhlbWF0aWNzLCBhIFNlY29uZGFyeSBTZWN0aW9uIG1heSBub3QgZXhwbGFpbgorYW55IG1hdGhlbWF0aWNzLikgIFRoZSByZWxhdGlvbnNoaXAgY291bGQgYmUgYSBtYXR0ZXIgb2YgaGlzdG9yaWNhbAorY29ubmVjdGlvbiB3aXRoIHRoZSBzdWJqZWN0IG9yIHdpdGggcmVsYXRlZCBtYXR0ZXJzLCBvciBvZiBsZWdhbCwKK2NvbW1lcmNpYWwsIHBoaWxvc29waGljYWwsIGV0aGljYWwgb3IgcG9saXRpY2FsIHBvc2l0aW9uIHJlZ2FyZGluZwordGhlbS4KKworVGhlIGBgSW52YXJpYW50IFNlY3Rpb25zJycgYXJlIGNlcnRhaW4gU2Vjb25kYXJ5IFNlY3Rpb25zIHdob3NlIHRpdGxlcworYXJlIGRlc2lnbmF0ZWQsIGFzIGJlaW5nIHRob3NlIG9mIEludmFyaWFudCBTZWN0aW9ucywgaW4gdGhlIG5vdGljZQordGhhdCBzYXlzIHRoYXQgdGhlIERvY3VtZW50IGlzIHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4gIElmIGEKK3NlY3Rpb24gZG9lcyBub3QgZml0IHRoZSBhYm92ZSBkZWZpbml0aW9uIG9mIFNlY29uZGFyeSB0aGVuIGl0IGlzIG5vdAorYWxsb3dlZCB0byBiZSBkZXNpZ25hdGVkIGFzIEludmFyaWFudC4gIFRoZSBEb2N1bWVudCBtYXkgY29udGFpbiB6ZXJvCitJbnZhcmlhbnQgU2VjdGlvbnMuICBJZiB0aGUgRG9jdW1lbnQgZG9lcyBub3QgaWRlbnRpZnkgYW55IEludmFyaWFudAorU2VjdGlvbnMgdGhlbiB0aGVyZSBhcmUgbm9uZS4KKworVGhlIGBgQ292ZXIgVGV4dHMnJyBhcmUgY2VydGFpbiBzaG9ydCBwYXNzYWdlcyBvZiB0ZXh0IHRoYXQgYXJlIGxpc3RlZCwKK2FzIEZyb250LUNvdmVyIFRleHRzIG9yIEJhY2stQ292ZXIgVGV4dHMsIGluIHRoZSBub3RpY2UgdGhhdCBzYXlzIHRoYXQKK3RoZSBEb2N1bWVudCBpcyByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBIEZyb250LUNvdmVyIFRleHQgbWF5CitiZSBhdCBtb3N0IDUgd29yZHMsIGFuZCBhIEJhY2stQ292ZXIgVGV4dCBtYXkgYmUgYXQgbW9zdCAyNSB3b3Jkcy4KKworQSBgYFRyYW5zcGFyZW50JycgY29weSBvZiB0aGUgRG9jdW1lbnQgbWVhbnMgYSBtYWNoaW5lLXJlYWRhYmxlIGNvcHksCityZXByZXNlbnRlZCBpbiBhIGZvcm1hdCB3aG9zZSBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUKK2dlbmVyYWwgcHVibGljLCB0aGF0IGlzIHN1aXRhYmxlIGZvciByZXZpc2luZyB0aGUgZG9jdW1lbnQKK3N0cmFpZ2h0Zm9yd2FyZGx5IHdpdGggZ2VuZXJpYyB0ZXh0IGVkaXRvcnMgb3IgKGZvciBpbWFnZXMgY29tcG9zZWQgb2YKK3BpeGVscykgZ2VuZXJpYyBwYWludCBwcm9ncmFtcyBvciAoZm9yIGRyYXdpbmdzKSBzb21lIHdpZGVseSBhdmFpbGFibGUKK2RyYXdpbmcgZWRpdG9yLCBhbmQgdGhhdCBpcyBzdWl0YWJsZSBmb3IgaW5wdXQgdG8gdGV4dCBmb3JtYXR0ZXJzIG9yCitmb3IgYXV0b21hdGljIHRyYW5zbGF0aW9uIHRvIGEgdmFyaWV0eSBvZiBmb3JtYXRzIHN1aXRhYmxlIGZvciBpbnB1dAordG8gdGV4dCBmb3JtYXR0ZXJzLiAgQSBjb3B5IG1hZGUgaW4gYW4gb3RoZXJ3aXNlIFRyYW5zcGFyZW50IGZpbGUKK2Zvcm1hdCB3aG9zZSBtYXJrdXAsIG9yIGFic2VuY2Ugb2YgbWFya3VwLCBoYXMgYmVlbiBhcnJhbmdlZCB0byB0aHdhcnQKK29yIGRpc2NvdXJhZ2Ugc3Vic2VxdWVudCBtb2RpZmljYXRpb24gYnkgcmVhZGVycyBpcyBub3QgVHJhbnNwYXJlbnQuCitBbiBpbWFnZSBmb3JtYXQgaXMgbm90IFRyYW5zcGFyZW50IGlmIHVzZWQgZm9yIGFueSBzdWJzdGFudGlhbCBhbW91bnQKK29mIHRleHQuICBBIGNvcHkgdGhhdCBpcyBub3QgYGBUcmFuc3BhcmVudCcnIGlzIGNhbGxlZCBgYE9wYXF1ZScnLgorCitFeGFtcGxlcyBvZiBzdWl0YWJsZSBmb3JtYXRzIGZvciBUcmFuc3BhcmVudCBjb3BpZXMgaW5jbHVkZSBwbGFpbgorQHNje2FzY2lpfSB3aXRob3V0IG1hcmt1cCwgVGV4aW5mbyBpbnB1dCBmb3JtYXQsIExhQFRlWHt9IGlucHV0Citmb3JtYXQsIEBhY3Jvbnlte1NHTUx9IG9yIEBhY3Jvbnlte1hNTH0gdXNpbmcgYSBwdWJsaWNseSBhdmFpbGFibGUKK0BhY3Jvbnlte0RURH0sIGFuZCBzdGFuZGFyZC1jb25mb3JtaW5nIHNpbXBsZSBAYWNyb255bXtIVE1MfSwKK1Bvc3RTY3JpcHQgb3IgQGFjcm9ueW17UERGfSBkZXNpZ25lZCBmb3IgaHVtYW4gbW9kaWZpY2F0aW9uLiAgRXhhbXBsZXMKK29mIHRyYW5zcGFyZW50IGltYWdlIGZvcm1hdHMgaW5jbHVkZSBAYWNyb255bXtQTkd9LCBAYWNyb255bXtYQ0Z9IGFuZAorQGFjcm9ueW17SlBHfS4gIE9wYXF1ZSBmb3JtYXRzIGluY2x1ZGUgcHJvcHJpZXRhcnkgZm9ybWF0cyB0aGF0IGNhbiBiZQorcmVhZCBhbmQgZWRpdGVkIG9ubHkgYnkgcHJvcHJpZXRhcnkgd29yZCBwcm9jZXNzb3JzLCBAYWNyb255bXtTR01MfSBvcgorQGFjcm9ueW17WE1MfSBmb3Igd2hpY2ggdGhlIEBhY3Jvbnlte0RURH0gYW5kL29yIHByb2Nlc3NpbmcgdG9vbHMgYXJlCitub3QgZ2VuZXJhbGx5IGF2YWlsYWJsZSwgYW5kIHRoZSBtYWNoaW5lLWdlbmVyYXRlZCBAYWNyb255bXtIVE1MfSwKK1Bvc3RTY3JpcHQgb3IgQGFjcm9ueW17UERGfSBwcm9kdWNlZCBieSBzb21lIHdvcmQgcHJvY2Vzc29ycyBmb3IKK291dHB1dCBwdXJwb3NlcyBvbmx5LgorCitUaGUgYGBUaXRsZSBQYWdlJycgbWVhbnMsIGZvciBhIHByaW50ZWQgYm9vaywgdGhlIHRpdGxlIHBhZ2UgaXRzZWxmLAorcGx1cyBzdWNoIGZvbGxvd2luZyBwYWdlcyBhcyBhcmUgbmVlZGVkIHRvIGhvbGQsIGxlZ2libHksIHRoZSBtYXRlcmlhbAordGhpcyBMaWNlbnNlIHJlcXVpcmVzIHRvIGFwcGVhciBpbiB0aGUgdGl0bGUgcGFnZS4gIEZvciB3b3JrcyBpbgorZm9ybWF0cyB3aGljaCBkbyBub3QgaGF2ZSBhbnkgdGl0bGUgcGFnZSBhcyBzdWNoLCBgYFRpdGxlIFBhZ2UnJyBtZWFucwordGhlIHRleHQgbmVhciB0aGUgbW9zdCBwcm9taW5lbnQgYXBwZWFyYW5jZSBvZiB0aGUgd29yaydzIHRpdGxlLAorcHJlY2VkaW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJvZHkgb2YgdGhlIHRleHQuCisKK0Egc2VjdGlvbiBgYEVudGl0bGVkIFhZWicnIG1lYW5zIGEgbmFtZWQgc3VidW5pdCBvZiB0aGUgRG9jdW1lbnQgd2hvc2UKK3RpdGxlIGVpdGhlciBpcyBwcmVjaXNlbHkgWFlaIG9yIGNvbnRhaW5zIFhZWiBpbiBwYXJlbnRoZXNlcyBmb2xsb3dpbmcKK3RleHQgdGhhdCB0cmFuc2xhdGVzIFhZWiBpbiBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmUgWFlaIHN0YW5kcyBmb3IgYQorc3BlY2lmaWMgc2VjdGlvbiBuYW1lIG1lbnRpb25lZCBiZWxvdywgc3VjaCBhcyBgYEFja25vd2xlZGdlbWVudHMnJywKK2BgRGVkaWNhdGlvbnMnJywgYGBFbmRvcnNlbWVudHMnJywgb3IgYGBIaXN0b3J5JycuKSAgVG8gYGBQcmVzZXJ2ZSB0aGUgVGl0bGUnJworb2Ygc3VjaCBhIHNlY3Rpb24gd2hlbiB5b3UgbW9kaWZ5IHRoZSBEb2N1bWVudCBtZWFucyB0aGF0IGl0IHJlbWFpbnMgYQorc2VjdGlvbiBgYEVudGl0bGVkIFhZWicnIGFjY29yZGluZyB0byB0aGlzIGRlZmluaXRpb24uCisKK1RoZSBEb2N1bWVudCBtYXkgaW5jbHVkZSBXYXJyYW50eSBEaXNjbGFpbWVycyBuZXh0IHRvIHRoZSBub3RpY2Ugd2hpY2gKK3N0YXRlcyB0aGF0IHRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIHRoZSBEb2N1bWVudC4gIFRoZXNlIFdhcnJhbnR5CitEaXNjbGFpbWVycyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmNsdWRlZCBieSByZWZlcmVuY2UgaW4gdGhpcworTGljZW5zZSwgYnV0IG9ubHkgYXMgcmVnYXJkcyBkaXNjbGFpbWluZyB3YXJyYW50aWVzOiBhbnkgb3RoZXIKK2ltcGxpY2F0aW9uIHRoYXQgdGhlc2UgV2FycmFudHkgRGlzY2xhaW1lcnMgbWF5IGhhdmUgaXMgdm9pZCBhbmQgaGFzCitubyBlZmZlY3Qgb24gdGhlIG1lYW5pbmcgb2YgdGhpcyBMaWNlbnNlLgorCitAaXRlbQorVkVSQkFUSU0gQ09QWUlORworCitZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIERvY3VtZW50IGluIGFueSBtZWRpdW0sIGVpdGhlcgorY29tbWVyY2lhbGx5IG9yIG5vbmNvbW1lcmNpYWxseSwgcHJvdmlkZWQgdGhhdCB0aGlzIExpY2Vuc2UsIHRoZQorY29weXJpZ2h0IG5vdGljZXMsIGFuZCB0aGUgbGljZW5zZSBub3RpY2Ugc2F5aW5nIHRoaXMgTGljZW5zZSBhcHBsaWVzCit0byB0aGUgRG9jdW1lbnQgYXJlIHJlcHJvZHVjZWQgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgeW91IGFkZCBubyBvdGhlcgorY29uZGl0aW9ucyB3aGF0c29ldmVyIHRvIHRob3NlIG9mIHRoaXMgTGljZW5zZS4gIFlvdSBtYXkgbm90IHVzZQordGVjaG5pY2FsIG1lYXN1cmVzIHRvIG9ic3RydWN0IG9yIGNvbnRyb2wgdGhlIHJlYWRpbmcgb3IgZnVydGhlcgorY29weWluZyBvZiB0aGUgY29waWVzIHlvdSBtYWtlIG9yIGRpc3RyaWJ1dGUuICBIb3dldmVyLCB5b3UgbWF5IGFjY2VwdAorY29tcGVuc2F0aW9uIGluIGV4Y2hhbmdlIGZvciBjb3BpZXMuICBJZiB5b3UgZGlzdHJpYnV0ZSBhIGxhcmdlIGVub3VnaAorbnVtYmVyIG9mIGNvcGllcyB5b3UgbXVzdCBhbHNvIGZvbGxvdyB0aGUgY29uZGl0aW9ucyBpbiBzZWN0aW9uIDMuCisKK1lvdSBtYXkgYWxzbyBsZW5kIGNvcGllcywgdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyBzdGF0ZWQgYWJvdmUsIGFuZAoreW91IG1heSBwdWJsaWNseSBkaXNwbGF5IGNvcGllcy4KKworQGl0ZW0KK0NPUFlJTkcgSU4gUVVBTlRJVFkKKworSWYgeW91IHB1Ymxpc2ggcHJpbnRlZCBjb3BpZXMgKG9yIGNvcGllcyBpbiBtZWRpYSB0aGF0IGNvbW1vbmx5IGhhdmUKK3ByaW50ZWQgY292ZXJzKSBvZiB0aGUgRG9jdW1lbnQsIG51bWJlcmluZyBtb3JlIHRoYW4gMTAwLCBhbmQgdGhlCitEb2N1bWVudCdzIGxpY2Vuc2Ugbm90aWNlIHJlcXVpcmVzIENvdmVyIFRleHRzLCB5b3UgbXVzdCBlbmNsb3NlIHRoZQorY29waWVzIGluIGNvdmVycyB0aGF0IGNhcnJ5LCBjbGVhcmx5IGFuZCBsZWdpYmx5LCBhbGwgdGhlc2UgQ292ZXIKK1RleHRzOiBGcm9udC1Db3ZlciBUZXh0cyBvbiB0aGUgZnJvbnQgY292ZXIsIGFuZCBCYWNrLUNvdmVyIFRleHRzIG9uCit0aGUgYmFjayBjb3Zlci4gIEJvdGggY292ZXJzIG11c3QgYWxzbyBjbGVhcmx5IGFuZCBsZWdpYmx5IGlkZW50aWZ5Cit5b3UgYXMgdGhlIHB1Ymxpc2hlciBvZiB0aGVzZSBjb3BpZXMuICBUaGUgZnJvbnQgY292ZXIgbXVzdCBwcmVzZW50Cit0aGUgZnVsbCB0aXRsZSB3aXRoIGFsbCB3b3JkcyBvZiB0aGUgdGl0bGUgZXF1YWxseSBwcm9taW5lbnQgYW5kCit2aXNpYmxlLiAgWW91IG1heSBhZGQgb3RoZXIgbWF0ZXJpYWwgb24gdGhlIGNvdmVycyBpbiBhZGRpdGlvbi4KK0NvcHlpbmcgd2l0aCBjaGFuZ2VzIGxpbWl0ZWQgdG8gdGhlIGNvdmVycywgYXMgbG9uZyBhcyB0aGV5IHByZXNlcnZlCit0aGUgdGl0bGUgb2YgdGhlIERvY3VtZW50IGFuZCBzYXRpc2Z5IHRoZXNlIGNvbmRpdGlvbnMsIGNhbiBiZSB0cmVhdGVkCithcyB2ZXJiYXRpbSBjb3B5aW5nIGluIG90aGVyIHJlc3BlY3RzLgorCitJZiB0aGUgcmVxdWlyZWQgdGV4dHMgZm9yIGVpdGhlciBjb3ZlciBhcmUgdG9vIHZvbHVtaW5vdXMgdG8gZml0CitsZWdpYmx5LCB5b3Ugc2hvdWxkIHB1dCB0aGUgZmlyc3Qgb25lcyBsaXN0ZWQgKGFzIG1hbnkgYXMgZml0CityZWFzb25hYmx5KSBvbiB0aGUgYWN0dWFsIGNvdmVyLCBhbmQgY29udGludWUgdGhlIHJlc3Qgb250byBhZGphY2VudAorcGFnZXMuCisKK0lmIHlvdSBwdWJsaXNoIG9yIGRpc3RyaWJ1dGUgT3BhcXVlIGNvcGllcyBvZiB0aGUgRG9jdW1lbnQgbnVtYmVyaW5nCittb3JlIHRoYW4gMTAwLCB5b3UgbXVzdCBlaXRoZXIgaW5jbHVkZSBhIG1hY2hpbmUtcmVhZGFibGUgVHJhbnNwYXJlbnQKK2NvcHkgYWxvbmcgd2l0aCBlYWNoIE9wYXF1ZSBjb3B5LCBvciBzdGF0ZSBpbiBvciB3aXRoIGVhY2ggT3BhcXVlIGNvcHkKK2EgY29tcHV0ZXItbmV0d29yayBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBnZW5lcmFsIG5ldHdvcmstdXNpbmcKK3B1YmxpYyBoYXMgYWNjZXNzIHRvIGRvd25sb2FkIHVzaW5nIHB1YmxpYy1zdGFuZGFyZCBuZXR3b3JrIHByb3RvY29scworYSBjb21wbGV0ZSBUcmFuc3BhcmVudCBjb3B5IG9mIHRoZSBEb2N1bWVudCwgZnJlZSBvZiBhZGRlZCBtYXRlcmlhbC4KK0lmIHlvdSB1c2UgdGhlIGxhdHRlciBvcHRpb24sIHlvdSBtdXN0IHRha2UgcmVhc29uYWJseSBwcnVkZW50IHN0ZXBzLAord2hlbiB5b3UgYmVnaW4gZGlzdHJpYnV0aW9uIG9mIE9wYXF1ZSBjb3BpZXMgaW4gcXVhbnRpdHksIHRvIGVuc3VyZQordGhhdCB0aGlzIFRyYW5zcGFyZW50IGNvcHkgd2lsbCByZW1haW4gdGh1cyBhY2Nlc3NpYmxlIGF0IHRoZSBzdGF0ZWQKK2xvY2F0aW9uIHVudGlsIGF0IGxlYXN0IG9uZSB5ZWFyIGFmdGVyIHRoZSBsYXN0IHRpbWUgeW91IGRpc3RyaWJ1dGUgYW4KK09wYXF1ZSBjb3B5IChkaXJlY3RseSBvciB0aHJvdWdoIHlvdXIgYWdlbnRzIG9yIHJldGFpbGVycykgb2YgdGhhdAorZWRpdGlvbiB0byB0aGUgcHVibGljLgorCitJdCBpcyByZXF1ZXN0ZWQsIGJ1dCBub3QgcmVxdWlyZWQsIHRoYXQgeW91IGNvbnRhY3QgdGhlIGF1dGhvcnMgb2YgdGhlCitEb2N1bWVudCB3ZWxsIGJlZm9yZSByZWRpc3RyaWJ1dGluZyBhbnkgbGFyZ2UgbnVtYmVyIG9mIGNvcGllcywgdG8gZ2l2ZQordGhlbSBhIGNoYW5jZSB0byBwcm92aWRlIHlvdSB3aXRoIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGUgRG9jdW1lbnQuCisKK0BpdGVtCitNT0RJRklDQVRJT05TCisKK1lvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSBhIE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIERvY3VtZW50IHVuZGVyCit0aGUgY29uZGl0aW9ucyBvZiBzZWN0aW9ucyAyIGFuZCAzIGFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSByZWxlYXNlCit0aGUgTW9kaWZpZWQgVmVyc2lvbiB1bmRlciBwcmVjaXNlbHkgdGhpcyBMaWNlbnNlLCB3aXRoIHRoZSBNb2RpZmllZAorVmVyc2lvbiBmaWxsaW5nIHRoZSByb2xlIG9mIHRoZSBEb2N1bWVudCwgdGh1cyBsaWNlbnNpbmcgZGlzdHJpYnV0aW9uCithbmQgbW9kaWZpY2F0aW9uIG9mIHRoZSBNb2RpZmllZCBWZXJzaW9uIHRvIHdob2V2ZXIgcG9zc2Vzc2VzIGEgY29weQorb2YgaXQuICBJbiBhZGRpdGlvbiwgeW91IG11c3QgZG8gdGhlc2UgdGhpbmdzIGluIHRoZSBNb2RpZmllZCBWZXJzaW9uOgorCitAZW51bWVyYXRlIEEKK0BpdGVtCitVc2UgaW4gdGhlIFRpdGxlIFBhZ2UgKGFuZCBvbiB0aGUgY292ZXJzLCBpZiBhbnkpIGEgdGl0bGUgZGlzdGluY3QKK2Zyb20gdGhhdCBvZiB0aGUgRG9jdW1lbnQsIGFuZCBmcm9tIHRob3NlIG9mIHByZXZpb3VzIHZlcnNpb25zCisod2hpY2ggc2hvdWxkLCBpZiB0aGVyZSB3ZXJlIGFueSwgYmUgbGlzdGVkIGluIHRoZSBIaXN0b3J5IHNlY3Rpb24KK29mIHRoZSBEb2N1bWVudCkuICBZb3UgbWF5IHVzZSB0aGUgc2FtZSB0aXRsZSBhcyBhIHByZXZpb3VzIHZlcnNpb24KK2lmIHRoZSBvcmlnaW5hbCBwdWJsaXNoZXIgb2YgdGhhdCB2ZXJzaW9uIGdpdmVzIHBlcm1pc3Npb24uCisKK0BpdGVtCitMaXN0IG9uIHRoZSBUaXRsZSBQYWdlLCBhcyBhdXRob3JzLCBvbmUgb3IgbW9yZSBwZXJzb25zIG9yIGVudGl0aWVzCityZXNwb25zaWJsZSBmb3IgYXV0aG9yc2hpcCBvZiB0aGUgbW9kaWZpY2F0aW9ucyBpbiB0aGUgTW9kaWZpZWQKK1ZlcnNpb24sIHRvZ2V0aGVyIHdpdGggYXQgbGVhc3QgZml2ZSBvZiB0aGUgcHJpbmNpcGFsIGF1dGhvcnMgb2YgdGhlCitEb2N1bWVudCAoYWxsIG9mIGl0cyBwcmluY2lwYWwgYXV0aG9ycywgaWYgaXQgaGFzIGZld2VyIHRoYW4gZml2ZSksCit1bmxlc3MgdGhleSByZWxlYXNlIHlvdSBmcm9tIHRoaXMgcmVxdWlyZW1lbnQuCisKK0BpdGVtCitTdGF0ZSBvbiB0aGUgVGl0bGUgcGFnZSB0aGUgbmFtZSBvZiB0aGUgcHVibGlzaGVyIG9mIHRoZQorTW9kaWZpZWQgVmVyc2lvbiwgYXMgdGhlIHB1Ymxpc2hlci4KKworQGl0ZW0KK1ByZXNlcnZlIGFsbCB0aGUgY29weXJpZ2h0IG5vdGljZXMgb2YgdGhlIERvY3VtZW50LgorCitAaXRlbQorQWRkIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgZm9yIHlvdXIgbW9kaWZpY2F0aW9ucworYWRqYWNlbnQgdG8gdGhlIG90aGVyIGNvcHlyaWdodCBub3RpY2VzLgorCitAaXRlbQorSW5jbHVkZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvcHlyaWdodCBub3RpY2VzLCBhIGxpY2Vuc2Ugbm90aWNlCitnaXZpbmcgdGhlIHB1YmxpYyBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgTW9kaWZpZWQgVmVyc2lvbiB1bmRlciB0aGUKK3Rlcm1zIG9mIHRoaXMgTGljZW5zZSwgaW4gdGhlIGZvcm0gc2hvd24gaW4gdGhlIEFkZGVuZHVtIGJlbG93LgorCitAaXRlbQorUHJlc2VydmUgaW4gdGhhdCBsaWNlbnNlIG5vdGljZSB0aGUgZnVsbCBsaXN0cyBvZiBJbnZhcmlhbnQgU2VjdGlvbnMKK2FuZCByZXF1aXJlZCBDb3ZlciBUZXh0cyBnaXZlbiBpbiB0aGUgRG9jdW1lbnQncyBsaWNlbnNlIG5vdGljZS4KKworQGl0ZW0KK0luY2x1ZGUgYW4gdW5hbHRlcmVkIGNvcHkgb2YgdGhpcyBMaWNlbnNlLgorCitAaXRlbQorUHJlc2VydmUgdGhlIHNlY3Rpb24gRW50aXRsZWQgYGBIaXN0b3J5JycsIFByZXNlcnZlIGl0cyBUaXRsZSwgYW5kIGFkZAordG8gaXQgYW4gaXRlbSBzdGF0aW5nIGF0IGxlYXN0IHRoZSB0aXRsZSwgeWVhciwgbmV3IGF1dGhvcnMsIGFuZAorcHVibGlzaGVyIG9mIHRoZSBNb2RpZmllZCBWZXJzaW9uIGFzIGdpdmVuIG9uIHRoZSBUaXRsZSBQYWdlLiAgSWYKK3RoZXJlIGlzIG5vIHNlY3Rpb24gRW50aXRsZWQgYGBIaXN0b3J5JycgaW4gdGhlIERvY3VtZW50LCBjcmVhdGUgb25lCitzdGF0aW5nIHRoZSB0aXRsZSwgeWVhciwgYXV0aG9ycywgYW5kIHB1Ymxpc2hlciBvZiB0aGUgRG9jdW1lbnQgYXMKK2dpdmVuIG9uIGl0cyBUaXRsZSBQYWdlLCB0aGVuIGFkZCBhbiBpdGVtIGRlc2NyaWJpbmcgdGhlIE1vZGlmaWVkCitWZXJzaW9uIGFzIHN0YXRlZCBpbiB0aGUgcHJldmlvdXMgc2VudGVuY2UuCisKK0BpdGVtCitQcmVzZXJ2ZSB0aGUgbmV0d29yayBsb2NhdGlvbiwgaWYgYW55LCBnaXZlbiBpbiB0aGUgRG9jdW1lbnQgZm9yCitwdWJsaWMgYWNjZXNzIHRvIGEgVHJhbnNwYXJlbnQgY29weSBvZiB0aGUgRG9jdW1lbnQsIGFuZCBsaWtld2lzZQordGhlIG5ldHdvcmsgbG9jYXRpb25zIGdpdmVuIGluIHRoZSBEb2N1bWVudCBmb3IgcHJldmlvdXMgdmVyc2lvbnMKK2l0IHdhcyBiYXNlZCBvbi4gIFRoZXNlIG1heSBiZSBwbGFjZWQgaW4gdGhlIGBgSGlzdG9yeScnIHNlY3Rpb24uCitZb3UgbWF5IG9taXQgYSBuZXR3b3JrIGxvY2F0aW9uIGZvciBhIHdvcmsgdGhhdCB3YXMgcHVibGlzaGVkIGF0CitsZWFzdCBmb3VyIHllYXJzIGJlZm9yZSB0aGUgRG9jdW1lbnQgaXRzZWxmLCBvciBpZiB0aGUgb3JpZ2luYWwKK3B1Ymxpc2hlciBvZiB0aGUgdmVyc2lvbiBpdCByZWZlcnMgdG8gZ2l2ZXMgcGVybWlzc2lvbi4KKworQGl0ZW0KK0ZvciBhbnkgc2VjdGlvbiBFbnRpdGxlZCBgYEFja25vd2xlZGdlbWVudHMnJyBvciBgYERlZGljYXRpb25zJycsIFByZXNlcnZlCit0aGUgVGl0bGUgb2YgdGhlIHNlY3Rpb24sIGFuZCBwcmVzZXJ2ZSBpbiB0aGUgc2VjdGlvbiBhbGwgdGhlCitzdWJzdGFuY2UgYW5kIHRvbmUgb2YgZWFjaCBvZiB0aGUgY29udHJpYnV0b3IgYWNrbm93bGVkZ2VtZW50cyBhbmQvb3IKK2RlZGljYXRpb25zIGdpdmVuIHRoZXJlaW4uCisKK0BpdGVtCitQcmVzZXJ2ZSBhbGwgdGhlIEludmFyaWFudCBTZWN0aW9ucyBvZiB0aGUgRG9jdW1lbnQsCit1bmFsdGVyZWQgaW4gdGhlaXIgdGV4dCBhbmQgaW4gdGhlaXIgdGl0bGVzLiAgU2VjdGlvbiBudW1iZXJzCitvciB0aGUgZXF1aXZhbGVudCBhcmUgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgc2VjdGlvbiB0aXRsZXMuCisKK0BpdGVtCitEZWxldGUgYW55IHNlY3Rpb24gRW50aXRsZWQgYGBFbmRvcnNlbWVudHMnJy4gIFN1Y2ggYSBzZWN0aW9uCittYXkgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBNb2RpZmllZCBWZXJzaW9uLgorCitAaXRlbQorRG8gbm90IHJldGl0bGUgYW55IGV4aXN0aW5nIHNlY3Rpb24gdG8gYmUgRW50aXRsZWQgYGBFbmRvcnNlbWVudHMnJyBvcgordG8gY29uZmxpY3QgaW4gdGl0bGUgd2l0aCBhbnkgSW52YXJpYW50IFNlY3Rpb24uCisKK0BpdGVtCitQcmVzZXJ2ZSBhbnkgV2FycmFudHkgRGlzY2xhaW1lcnMuCitAZW5kIGVudW1lcmF0ZQorCitJZiB0aGUgTW9kaWZpZWQgVmVyc2lvbiBpbmNsdWRlcyBuZXcgZnJvbnQtbWF0dGVyIHNlY3Rpb25zIG9yCithcHBlbmRpY2VzIHRoYXQgcXVhbGlmeSBhcyBTZWNvbmRhcnkgU2VjdGlvbnMgYW5kIGNvbnRhaW4gbm8gbWF0ZXJpYWwKK2NvcGllZCBmcm9tIHRoZSBEb2N1bWVudCwgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBkZXNpZ25hdGUgc29tZSBvciBhbGwKK29mIHRoZXNlIHNlY3Rpb25zIGFzIGludmFyaWFudC4gIFRvIGRvIHRoaXMsIGFkZCB0aGVpciB0aXRsZXMgdG8gdGhlCitsaXN0IG9mIEludmFyaWFudCBTZWN0aW9ucyBpbiB0aGUgTW9kaWZpZWQgVmVyc2lvbidzIGxpY2Vuc2Ugbm90aWNlLgorVGhlc2UgdGl0bGVzIG11c3QgYmUgZGlzdGluY3QgZnJvbSBhbnkgb3RoZXIgc2VjdGlvbiB0aXRsZXMuCisKK1lvdSBtYXkgYWRkIGEgc2VjdGlvbiBFbnRpdGxlZCBgYEVuZG9yc2VtZW50cycnLCBwcm92aWRlZCBpdCBjb250YWlucworbm90aGluZyBidXQgZW5kb3JzZW1lbnRzIG9mIHlvdXIgTW9kaWZpZWQgVmVyc2lvbiBieSB2YXJpb3VzCitwYXJ0aWVzLS0tZm9yIGV4YW1wbGUsIHN0YXRlbWVudHMgb2YgcGVlciByZXZpZXcgb3IgdGhhdCB0aGUgdGV4dCBoYXMKK2JlZW4gYXBwcm92ZWQgYnkgYW4gb3JnYW5pemF0aW9uIGFzIHRoZSBhdXRob3JpdGF0aXZlIGRlZmluaXRpb24gb2YgYQorc3RhbmRhcmQuCisKK1lvdSBtYXkgYWRkIGEgcGFzc2FnZSBvZiB1cCB0byBmaXZlIHdvcmRzIGFzIGEgRnJvbnQtQ292ZXIgVGV4dCwgYW5kIGEKK3Bhc3NhZ2Ugb2YgdXAgdG8gMjUgd29yZHMgYXMgYSBCYWNrLUNvdmVyIFRleHQsIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKK29mIENvdmVyIFRleHRzIGluIHRoZSBNb2RpZmllZCBWZXJzaW9uLiAgT25seSBvbmUgcGFzc2FnZSBvZgorRnJvbnQtQ292ZXIgVGV4dCBhbmQgb25lIG9mIEJhY2stQ292ZXIgVGV4dCBtYXkgYmUgYWRkZWQgYnkgKG9yCit0aHJvdWdoIGFycmFuZ2VtZW50cyBtYWRlIGJ5KSBhbnkgb25lIGVudGl0eS4gIElmIHRoZSBEb2N1bWVudCBhbHJlYWR5CitpbmNsdWRlcyBhIGNvdmVyIHRleHQgZm9yIHRoZSBzYW1lIGNvdmVyLCBwcmV2aW91c2x5IGFkZGVkIGJ5IHlvdSBvcgorYnkgYXJyYW5nZW1lbnQgbWFkZSBieSB0aGUgc2FtZSBlbnRpdHkgeW91IGFyZSBhY3Rpbmcgb24gYmVoYWxmIG9mLAoreW91IG1heSBub3QgYWRkIGFub3RoZXI7IGJ1dCB5b3UgbWF5IHJlcGxhY2UgdGhlIG9sZCBvbmUsIG9uIGV4cGxpY2l0CitwZXJtaXNzaW9uIGZyb20gdGhlIHByZXZpb3VzIHB1Ymxpc2hlciB0aGF0IGFkZGVkIHRoZSBvbGQgb25lLgorCitUaGUgYXV0aG9yKHMpIGFuZCBwdWJsaXNoZXIocykgb2YgdGhlIERvY3VtZW50IGRvIG5vdCBieSB0aGlzIExpY2Vuc2UKK2dpdmUgcGVybWlzc2lvbiB0byB1c2UgdGhlaXIgbmFtZXMgZm9yIHB1YmxpY2l0eSBmb3Igb3IgdG8gYXNzZXJ0IG9yCitpbXBseSBlbmRvcnNlbWVudCBvZiBhbnkgTW9kaWZpZWQgVmVyc2lvbi4KKworQGl0ZW0KK0NPTUJJTklORyBET0NVTUVOVFMKKworWW91IG1heSBjb21iaW5lIHRoZSBEb2N1bWVudCB3aXRoIG90aGVyIGRvY3VtZW50cyByZWxlYXNlZCB1bmRlciB0aGlzCitMaWNlbnNlLCB1bmRlciB0aGUgdGVybXMgZGVmaW5lZCBpbiBzZWN0aW9uIDQgYWJvdmUgZm9yIG1vZGlmaWVkCit2ZXJzaW9ucywgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUgY29tYmluYXRpb24gYWxsIG9mIHRoZQorSW52YXJpYW50IFNlY3Rpb25zIG9mIGFsbCBvZiB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzLCB1bm1vZGlmaWVkLCBhbmQKK2xpc3QgdGhlbSBhbGwgYXMgSW52YXJpYW50IFNlY3Rpb25zIG9mIHlvdXIgY29tYmluZWQgd29yayBpbiBpdHMKK2xpY2Vuc2Ugbm90aWNlLCBhbmQgdGhhdCB5b3UgcHJlc2VydmUgYWxsIHRoZWlyIFdhcnJhbnR5IERpc2NsYWltZXJzLgorCitUaGUgY29tYmluZWQgd29yayBuZWVkIG9ubHkgY29udGFpbiBvbmUgY29weSBvZiB0aGlzIExpY2Vuc2UsIGFuZAorbXVsdGlwbGUgaWRlbnRpY2FsIEludmFyaWFudCBTZWN0aW9ucyBtYXkgYmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZQorY29weS4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBJbnZhcmlhbnQgU2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dAorZGlmZmVyZW50IGNvbnRlbnRzLCBtYWtlIHRoZSB0aXRsZSBvZiBlYWNoIHN1Y2ggc2VjdGlvbiB1bmlxdWUgYnkKK2FkZGluZyBhdCB0aGUgZW5kIG9mIGl0LCBpbiBwYXJlbnRoZXNlcywgdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsCithdXRob3Igb3IgcHVibGlzaGVyIG9mIHRoYXQgc2VjdGlvbiBpZiBrbm93biwgb3IgZWxzZSBhIHVuaXF1ZSBudW1iZXIuCitNYWtlIHRoZSBzYW1lIGFkanVzdG1lbnQgdG8gdGhlIHNlY3Rpb24gdGl0bGVzIGluIHRoZSBsaXN0IG9mCitJbnZhcmlhbnQgU2VjdGlvbnMgaW4gdGhlIGxpY2Vuc2Ugbm90aWNlIG9mIHRoZSBjb21iaW5lZCB3b3JrLgorCitJbiB0aGUgY29tYmluYXRpb24sIHlvdSBtdXN0IGNvbWJpbmUgYW55IHNlY3Rpb25zIEVudGl0bGVkIGBgSGlzdG9yeScnCitpbiB0aGUgdmFyaW91cyBvcmlnaW5hbCBkb2N1bWVudHMsIGZvcm1pbmcgb25lIHNlY3Rpb24gRW50aXRsZWQKK2BgSGlzdG9yeScnOyBsaWtld2lzZSBjb21iaW5lIGFueSBzZWN0aW9ucyBFbnRpdGxlZCBgYEFja25vd2xlZGdlbWVudHMnJywKK2FuZCBhbnkgc2VjdGlvbnMgRW50aXRsZWQgYGBEZWRpY2F0aW9ucycnLiAgWW91IG11c3QgZGVsZXRlIGFsbAorc2VjdGlvbnMgRW50aXRsZWQgYGBFbmRvcnNlbWVudHMuJycKKworQGl0ZW0KK0NPTExFQ1RJT05TIE9GIERPQ1VNRU5UUworCitZb3UgbWF5IG1ha2UgYSBjb2xsZWN0aW9uIGNvbnNpc3Rpbmcgb2YgdGhlIERvY3VtZW50IGFuZCBvdGhlciBkb2N1bWVudHMKK3JlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHJlcGxhY2UgdGhlIGluZGl2aWR1YWwgY29waWVzIG9mIHRoaXMKK0xpY2Vuc2UgaW4gdGhlIHZhcmlvdXMgZG9jdW1lbnRzIHdpdGggYSBzaW5nbGUgY29weSB0aGF0IGlzIGluY2x1ZGVkIGluCit0aGUgY29sbGVjdGlvbiwgcHJvdmlkZWQgdGhhdCB5b3UgZm9sbG93IHRoZSBydWxlcyBvZiB0aGlzIExpY2Vuc2UgZm9yCit2ZXJiYXRpbSBjb3B5aW5nIG9mIGVhY2ggb2YgdGhlIGRvY3VtZW50cyBpbiBhbGwgb3RoZXIgcmVzcGVjdHMuCisKK1lvdSBtYXkgZXh0cmFjdCBhIHNpbmdsZSBkb2N1bWVudCBmcm9tIHN1Y2ggYSBjb2xsZWN0aW9uLCBhbmQgZGlzdHJpYnV0ZQoraXQgaW5kaXZpZHVhbGx5IHVuZGVyIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgeW91IGluc2VydCBhIGNvcHkgb2YgdGhpcworTGljZW5zZSBpbnRvIHRoZSBleHRyYWN0ZWQgZG9jdW1lbnQsIGFuZCBmb2xsb3cgdGhpcyBMaWNlbnNlIGluIGFsbAorb3RoZXIgcmVzcGVjdHMgcmVnYXJkaW5nIHZlcmJhdGltIGNvcHlpbmcgb2YgdGhhdCBkb2N1bWVudC4KKworQGl0ZW0KK0FHR1JFR0FUSU9OIFdJVEggSU5ERVBFTkRFTlQgV09SS1MKKworQSBjb21waWxhdGlvbiBvZiB0aGUgRG9jdW1lbnQgb3IgaXRzIGRlcml2YXRpdmVzIHdpdGggb3RoZXIgc2VwYXJhdGUKK2FuZCBpbmRlcGVuZGVudCBkb2N1bWVudHMgb3Igd29ya3MsIGluIG9yIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvcgorZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuIGBgYWdncmVnYXRlJycgaWYgdGhlIGNvcHlyaWdodAorcmVzdWx0aW5nIGZyb20gdGhlIGNvbXBpbGF0aW9uIGlzIG5vdCB1c2VkIHRvIGxpbWl0IHRoZSBsZWdhbCByaWdodHMKK29mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzIGJleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4KK1doZW4gdGhlIERvY3VtZW50IGlzIGluY2x1ZGVkIGFuIGFnZ3JlZ2F0ZSwgdGhpcyBMaWNlbnNlIGRvZXMgbm90CithcHBseSB0byB0aGUgb3RoZXIgd29ya3MgaW4gdGhlIGFnZ3JlZ2F0ZSB3aGljaCBhcmUgbm90IHRoZW1zZWx2ZXMKK2Rlcml2YXRpdmUgd29ya3Mgb2YgdGhlIERvY3VtZW50LgorCitJZiB0aGUgQ292ZXIgVGV4dCByZXF1aXJlbWVudCBvZiBzZWN0aW9uIDMgaXMgYXBwbGljYWJsZSB0byB0aGVzZQorY29waWVzIG9mIHRoZSBEb2N1bWVudCwgdGhlbiBpZiB0aGUgRG9jdW1lbnQgaXMgbGVzcyB0aGFuIG9uZSBoYWxmIG9mCit0aGUgZW50aXJlIGFnZ3JlZ2F0ZSwgdGhlIERvY3VtZW50J3MgQ292ZXIgVGV4dHMgbWF5IGJlIHBsYWNlZCBvbgorY292ZXJzIHRoYXQgYnJhY2tldCB0aGUgRG9jdW1lbnQgd2l0aGluIHRoZSBhZ2dyZWdhdGUsIG9yIHRoZQorZWxlY3Ryb25pYyBlcXVpdmFsZW50IG9mIGNvdmVycyBpZiB0aGUgRG9jdW1lbnQgaXMgaW4gZWxlY3Ryb25pYyBmb3JtLgorT3RoZXJ3aXNlIHRoZXkgbXVzdCBhcHBlYXIgb24gcHJpbnRlZCBjb3ZlcnMgdGhhdCBicmFja2V0IHRoZSB3aG9sZQorYWdncmVnYXRlLgorCitAaXRlbQorVFJBTlNMQVRJT04KKworVHJhbnNsYXRpb24gaXMgY29uc2lkZXJlZCBhIGtpbmQgb2YgbW9kaWZpY2F0aW9uLCBzbyB5b3UgbWF5CitkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGUgRG9jdW1lbnQgdW5kZXIgdGhlIHRlcm1zIG9mIHNlY3Rpb24gNC4KK1JlcGxhY2luZyBJbnZhcmlhbnQgU2VjdGlvbnMgd2l0aCB0cmFuc2xhdGlvbnMgcmVxdWlyZXMgc3BlY2lhbAorcGVybWlzc2lvbiBmcm9tIHRoZWlyIGNvcHlyaWdodCBob2xkZXJzLCBidXQgeW91IG1heSBpbmNsdWRlCit0cmFuc2xhdGlvbnMgb2Ygc29tZSBvciBhbGwgSW52YXJpYW50IFNlY3Rpb25zIGluIGFkZGl0aW9uIHRvIHRoZQorb3JpZ2luYWwgdmVyc2lvbnMgb2YgdGhlc2UgSW52YXJpYW50IFNlY3Rpb25zLiAgWW91IG1heSBpbmNsdWRlIGEKK3RyYW5zbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgYW5kIGFsbCB0aGUgbGljZW5zZSBub3RpY2VzIGluIHRoZQorRG9jdW1lbnQsIGFuZCBhbnkgV2FycmFudHkgRGlzY2xhaW1lcnMsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gaW5jbHVkZQordGhlIG9yaWdpbmFsIEVuZ2xpc2ggdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoZSBvcmlnaW5hbCB2ZXJzaW9ucworb2YgdGhvc2Ugbm90aWNlcyBhbmQgZGlzY2xhaW1lcnMuICBJbiBjYXNlIG9mIGEgZGlzYWdyZWVtZW50IGJldHdlZW4KK3RoZSB0cmFuc2xhdGlvbiBhbmQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIGEgbm90aWNlCitvciBkaXNjbGFpbWVyLCB0aGUgb3JpZ2luYWwgdmVyc2lvbiB3aWxsIHByZXZhaWwuCisKK0lmIGEgc2VjdGlvbiBpbiB0aGUgRG9jdW1lbnQgaXMgRW50aXRsZWQgYGBBY2tub3dsZWRnZW1lbnRzJycsCitgYERlZGljYXRpb25zJycsIG9yIGBgSGlzdG9yeScnLCB0aGUgcmVxdWlyZW1lbnQgKHNlY3Rpb24gNCkgdG8gUHJlc2VydmUKK2l0cyBUaXRsZSAoc2VjdGlvbiAxKSB3aWxsIHR5cGljYWxseSByZXF1aXJlIGNoYW5naW5nIHRoZSBhY3R1YWwKK3RpdGxlLgorCitAaXRlbQorVEVSTUlOQVRJT04KKworWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBEb2N1bWVudCBleGNlcHQKK2FzIGV4cHJlc3NseSBwcm92aWRlZCBmb3IgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IG90aGVyIGF0dGVtcHQgdG8KK2NvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBEb2N1bWVudCBpcyB2b2lkLCBhbmQgd2lsbAorYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwKK3BhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMKK0xpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCitAaXRlbQorRlVUVVJFIFJFVklTSU9OUyBPRiBUSElTIExJQ0VOU0UKKworVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCBuZXcsIHJldmlzZWQgdmVyc2lvbnMKK29mIHRoZSBHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldwordmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5CitkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLiAgU2VlCitAdXJlZntodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvfS4KKworRWFjaCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuCitJZiB0aGUgRG9jdW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBwYXJ0aWN1bGFyIG51bWJlcmVkIHZlcnNpb24gb2YgdGhpcworTGljZW5zZSBgYG9yIGFueSBsYXRlciB2ZXJzaW9uJycgYXBwbGllcyB0byBpdCwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZgorZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCBzcGVjaWZpZWQgdmVyc2lvbiBvcgorb2YgYW55IGxhdGVyIHZlcnNpb24gdGhhdCBoYXMgYmVlbiBwdWJsaXNoZWQgKG5vdCBhcyBhIGRyYWZ0KSBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBEb2N1bWVudCBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbgorbnVtYmVyIG9mIHRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgKG5vdAorYXMgYSBkcmFmdCkgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KK0BlbmQgZW51bWVyYXRlCisKK0BwYWdlCitAYXBwZW5kaXhzdWJzZWMgQURERU5EVU06IEhvdyB0byB1c2UgdGhpcyBMaWNlbnNlIGZvciB5b3VyIGRvY3VtZW50cworCitUbyB1c2UgdGhpcyBMaWNlbnNlIGluIGEgZG9jdW1lbnQgeW91IGhhdmUgd3JpdHRlbiwgaW5jbHVkZSBhIGNvcHkgb2YKK3RoZSBMaWNlbnNlIGluIHRoZSBkb2N1bWVudCBhbmQgcHV0IHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZAorbGljZW5zZSBub3RpY2VzIGp1c3QgYWZ0ZXIgdGhlIHRpdGxlIHBhZ2U6CisKK0BzbWFsbGV4YW1wbGUKK0Bncm91cAorICBDb3B5cmlnaHQgKEMpICBAdmFye3llYXJ9ICBAdmFye3lvdXIgbmFtZX0uCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBkb2N1bWVudAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbiAxLjIKKyAgb3IgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgIHdpdGggbm8gSW52YXJpYW50IFNlY3Rpb25zLCBubyBGcm9udC1Db3ZlciBUZXh0cywgYW5kIG5vIEJhY2stQ292ZXIgVGV4dHMuCisgIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGUgc2VjdGlvbiBlbnRpdGxlZCBgYEdOVQorICBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZScnLgorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworSWYgeW91IGhhdmUgSW52YXJpYW50IFNlY3Rpb25zLCBGcm9udC1Db3ZlciBUZXh0cyBhbmQgQmFjay1Db3ZlciBUZXh0cywKK3JlcGxhY2UgdGhlIGBgd2l0aC4uLlRleHRzLicnIGxpbmUgd2l0aCB0aGlzOgorCitAc21hbGxleGFtcGxlCitAZ3JvdXAKKyAgICB3aXRoIHRoZSBJbnZhcmlhbnQgU2VjdGlvbnMgYmVpbmcgQHZhcntsaXN0IHRoZWlyIHRpdGxlc30sIHdpdGgKKyAgICB0aGUgRnJvbnQtQ292ZXIgVGV4dHMgYmVpbmcgQHZhcntsaXN0fSwgYW5kIHdpdGggdGhlIEJhY2stQ292ZXIgVGV4dHMKKyAgICBiZWluZyBAdmFye2xpc3R9LgorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworSWYgeW91IGhhdmUgSW52YXJpYW50IFNlY3Rpb25zIHdpdGhvdXQgQ292ZXIgVGV4dHMsIG9yIHNvbWUgb3RoZXIKK2NvbWJpbmF0aW9uIG9mIHRoZSB0aHJlZSwgbWVyZ2UgdGhvc2UgdHdvIGFsdGVybmF0aXZlcyB0byBzdWl0IHRoZQorc2l0dWF0aW9uLgorCitJZiB5b3VyIGRvY3VtZW50IGNvbnRhaW5zIG5vbnRyaXZpYWwgZXhhbXBsZXMgb2YgcHJvZ3JhbSBjb2RlLCB3ZQorcmVjb21tZW5kIHJlbGVhc2luZyB0aGVzZSBleGFtcGxlcyBpbiBwYXJhbGxlbCB1bmRlciB5b3VyIGNob2ljZSBvZgorZnJlZSBzb2Z0d2FyZSBsaWNlbnNlLCBzdWNoIGFzIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKK3RvIHBlcm1pdCB0aGVpciB1c2UgaW4gZnJlZSBzb2Z0d2FyZS4KKworQGMgTG9jYWwgVmFyaWFibGVzOgorQGMgaXNwZWxsLWxvY2FsLXBkaWN0OiAiaXNwZWxsLWRpY3QiCitAYyBFbmQ6CisKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2RvYy9oaXN0b3J5LnBkZiBiL3JlYWRsaW5lL2RvYy9oaXN0b3J5LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQxMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZG9jL2hpc3RvcnkucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2RvYy9oaXN0b3J5LnRleGkgYi9yZWFkbGluZS9kb2MvaGlzdG9yeS50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTNkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbGluZS9kb2MvaGlzdG9yeS50ZXhpCkBAIC0wLDAgKzEsMTA0IEBACitcaW5wdXQgdGV4aW5mbyAgICBAYyAtKi10ZXhpbmZvLSotCitAYyAlKipzdGFydCBvZiBoZWFkZXIgKFRoaXMgaXMgZm9yIHJ1bm5pbmcgVGV4aW5mbyBvbiBhIHJlZ2lvbi4pCitAc2V0ZmlsZW5hbWUgaGlzdG9yeS5pbmZvCitAc2V0dGl0bGUgR05VIEhpc3RvcnkgTGlicmFyeQorQGMgJSoqZW5kIG9mIGhlYWRlciAoVGhpcyBpcyBmb3IgcnVubmluZyBUZXhpbmZvIG9uIGEgcmVnaW9uLikKKworQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAorCitAaW5jbHVkZSB2ZXJzaW9uLnRleGkKKworQGNvcHlpbmcKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBHTlUgSGlzdG9yeSBsaWJyYXJ5CisodmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0sIEB2YWx1ZXtVUERBVEVEfSksCithIHByb2dyYW1taW5nIHRvb2wgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgdXNlciBpbnRlcmZhY2UgZm9yCityZWNhbGxpbmcgbGluZXMgb2YgcHJldmlvdXNseSB0eXBlZCBpbnB1dC4KKworQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTg4LTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworQHF1b3RhdGlvbgorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIGRvY3VtZW50Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbiAxLjEgb3IKK2FueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3aXRoIG5vCitJbnZhcmlhbnQgU2VjdGlvbnMsIHdpdGggdGhlIEZyb250LUNvdmVyIHRleHRzIGJlaW5nIGBgQSBHTlUgTWFudWFsLCcnCithbmQgd2l0aCB0aGUgQmFjay1Db3ZlciBUZXh0cyBhcyBpbiAoYSkgYmVsb3cuICBBIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMKK2luY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGVudGl0bGVkIGBgR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlLicnCisKKyhhKSBUaGUgRlNGJ3MgQmFjay1Db3ZlciBUZXh0IGlzOiBgYFlvdSBoYXZlIGZyZWVkb20gdG8gY29weSBhbmQgbW9kaWZ5Cit0aGlzIEdOVSBNYW51YWwsIGxpa2UgR05VIHNvZnR3YXJlLiAgQ29waWVzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiByYWlzZSBmdW5kcyBmb3IgR05VIGRldmVsb3BtZW50LicnCitAZW5kIHF1b3RhdGlvbgorQGVuZCBjb3B5aW5nCisKK0BkaXJjYXRlZ29yeSBMaWJyYXJpZXMKK0BkaXJlbnRyeQorKiBIaXN0b3J5OiAoaGlzdG9yeSkuICAgICAgIFRoZSBHTlUgaGlzdG9yeSBsaWJyYXJ5IEFQSS4KK0BlbmQgZGlyZW50cnkKKworQHRpdGxlcGFnZQorQHRpdGxlIEdOVSBIaXN0b3J5IExpYnJhcnkKK0BzdWJ0aXRsZSBFZGl0aW9uIEB2YWx1ZXtFRElUSU9OfSwgZm9yIEBjb2Rle0hpc3RvcnkgTGlicmFyeX0gVmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0uCitAc3VidGl0bGUgQHZhbHVle1VQREFURUQtTU9OVEh9CitAYXV0aG9yIENoZXQgUmFtZXksIENhc2UgV2VzdGVybiBSZXNlcnZlIFVuaXZlcnNpdHkKK0BhdXRob3IgQnJpYW4gRm94LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworQHBhZ2UKKworQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorQGluc2VydGNvcHlpbmcKKworQHNwIDEKK1B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEAqCis1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQCoKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNyBAKgorVVNBIEAqCisKK0BlbmQgdGl0bGVwYWdlCisKK0Bjb250ZW50cworCitAaWZub3R0ZXgKK0Bub2RlIFRvcAorQHRvcCBHTlUgSGlzdG9yeSBMaWJyYXJ5CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBHTlUgSGlzdG9yeSBsaWJyYXJ5LCBhIHByb2dyYW1taW5nIHRvb2wgdGhhdAorcHJvdmlkZXMgYSBjb25zaXN0ZW50IHVzZXIgaW50ZXJmYWNlIGZvciByZWNhbGxpbmcgbGluZXMgb2YgcHJldmlvdXNseQordHlwZWQgaW5wdXQuCisKK0BtZW51CisqIFVzaW5nIEhpc3RvcnkgSW50ZXJhY3RpdmVseTo6CSAgR05VIEhpc3RvcnkgVXNlcidzIE1hbnVhbC4KKyogUHJvZ3JhbW1pbmcgd2l0aCBHTlUgSGlzdG9yeTo6ICBHTlUgSGlzdG9yeSBQcm9ncmFtbWVyJ3MgTWFudWFsLgorKiBDb3B5aW5nIFRoaXMgTWFudWFsOjoJCSAgQ29weWluZyBUaGlzIE1hbnVhbC4KKyogQ29uY2VwdCBJbmRleDo6CQkgIEluZGV4IG9mIGNvbmNlcHRzIGRlc2NyaWJlZCBpbiB0aGlzIG1hbnVhbC4KKyogRnVuY3Rpb24gYW5kIFZhcmlhYmxlIEluZGV4OjoJICBJbmRleCBvZiBleHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb25zCisJCQkJICBhbmQgdmFyaWFibGVzLgorQGVuZCBtZW51CitAZW5kIGlmbm90dGV4CisKK0BzeW5jb2RlaW5kZXggZm4gdnIKKworQGluY2x1ZGUgaHN1c2VyLnRleGkKK0BpbmNsdWRlIGhzdGVjaC50ZXhpCisKK0Bub2RlIENvcHlpbmcgVGhpcyBNYW51YWwKK0BhcHBlbmRpeCBDb3B5aW5nIFRoaXMgTWFudWFsCisKK0BtZW51CisqIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZTo6CUxpY2Vuc2UgZm9yIGNvcHlpbmcgdGhpcyBtYW51YWwuCitAZW5kIG1lbnUKKworQGluY2x1ZGUgZmRsLnRleGkKKworQG5vZGUgQ29uY2VwdCBJbmRleAorQGFwcGVuZGl4IENvbmNlcHQgSW5kZXgKK0BwcmludGluZGV4IGNwCisKK0Bub2RlIEZ1bmN0aW9uIGFuZCBWYXJpYWJsZSBJbmRleAorQGFwcGVuZGl4IEZ1bmN0aW9uIGFuZCBWYXJpYWJsZSBJbmRleAorQHByaW50aW5kZXggdnIKKworQGJ5ZQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL2hzdGVjaC50ZXhpIGIvcmVhZGxpbmUvZG9jL2hzdGVjaC50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZGRhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbGluZS9kb2MvaHN0ZWNoLnRleGkKQEAgLTAsMCArMSw1NzMgQEAKK0BpZ25vcmUKK1RoaXMgZmlsZSBkb2N1bWVudHMgdGhlIHVzZXIgaW50ZXJmYWNlIHRvIHRoZSBHTlUgSGlzdG9yeSBsaWJyYXJ5LgorCitDb3B5cmlnaHQgKEMpIDE5ODgtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0F1dGhvcmVkIGJ5IEJyaWFuIEZveCBhbmQgQ2hldCBSYW1leS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbWFudWFsCitwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcmUgcHJlc2VydmVkIG9uCithbGwgY29waWVzLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24gbm90aWNlCitpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaCAodGhpcworcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdCB0aGUKK0dOVSBDb3B5cmlnaHQgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSB0byB0aGUgZGlzdHJpYnV0ZWUsIGFuZCBwcm92aWRlZCB0aGF0Cit0aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KK0BlbmQgaWdub3JlCisKK0Bub2RlIFByb2dyYW1taW5nIHdpdGggR05VIEhpc3RvcnkKK0BjaGFwdGVyIFByb2dyYW1taW5nIHdpdGggR05VIEhpc3RvcnkKKworVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBob3cgdG8gaW50ZXJmYWNlIHByb2dyYW1zIHRoYXQgeW91IHdyaXRlCit3aXRoIHRoZSBAc2N7Z251fSBIaXN0b3J5IExpYnJhcnkuCitJdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHRlY2huaWNhbCBndWlkZS4KK0ZvciBpbmZvcm1hdGlvbiBvbiB0aGUgaW50ZXJhY3RpdmUgdXNlIG9mIEBzY3tnbnV9IEhpc3RvcnksIEBweHJlZntVc2luZworSGlzdG9yeSBJbnRlcmFjdGl2ZWx5fS4KKworQG1lbnUKKyogSW50cm9kdWN0aW9uIHRvIEhpc3Rvcnk6OglXaGF0IGlzIHRoZSBHTlUgSGlzdG9yeSBsaWJyYXJ5IGZvcj8KKyogSGlzdG9yeSBTdG9yYWdlOjoJCUhvdyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQuCisqIEhpc3RvcnkgRnVuY3Rpb25zOjoJCUZ1bmN0aW9ucyB0aGF0IHlvdSBjYW4gdXNlLgorKiBIaXN0b3J5IFZhcmlhYmxlczo6CQlWYXJpYWJsZXMgdGhhdCBjb250cm9sIGJlaGF2aW91ci4KKyogSGlzdG9yeSBQcm9ncmFtbWluZyBFeGFtcGxlOjoJRXhhbXBsZSBvZiB1c2luZyB0aGUgR05VIEhpc3RvcnkgTGlicmFyeS4KK0BlbmQgbWVudQorCitAbm9kZSBJbnRyb2R1Y3Rpb24gdG8gSGlzdG9yeQorQHNlY3Rpb24gSW50cm9kdWN0aW9uIHRvIEhpc3RvcnkKKworTWFueSBwcm9ncmFtcyByZWFkIGlucHV0IGZyb20gdGhlIHVzZXIgYSBsaW5lIGF0IGEgdGltZS4gIFRoZSBAc2N7Z251fQorSGlzdG9yeSBsaWJyYXJ5IGlzIGFibGUgdG8ga2VlcCB0cmFjayBvZiB0aG9zZSBsaW5lcywgYXNzb2NpYXRlIGFyYml0cmFyeQorZGF0YSB3aXRoIGVhY2ggbGluZSwgYW5kIHV0aWxpemUgaW5mb3JtYXRpb24gZnJvbSBwcmV2aW91cyBsaW5lcyBpbgorY29tcG9zaW5nIG5ldyBvbmVzLiAKKworVGhlIHByb2dyYW1tZXIgdXNpbmcgdGhlIEhpc3RvcnkgbGlicmFyeSBoYXMgYXZhaWxhYmxlIGZ1bmN0aW9ucworZm9yIHJlbWVtYmVyaW5nIGxpbmVzIG9uIGEgaGlzdG9yeSBsaXN0LCBhc3NvY2lhdGluZyBhcmJpdHJhcnkgZGF0YQord2l0aCBhIGxpbmUsIHJlbW92aW5nIGxpbmVzIGZyb20gdGhlIGxpc3QsIHNlYXJjaGluZyB0aHJvdWdoIHRoZSBsaXN0Citmb3IgYSBsaW5lIGNvbnRhaW5pbmcgYW4gYXJiaXRyYXJ5IHRleHQgc3RyaW5nLCBhbmQgcmVmZXJlbmNpbmcgYW55IGxpbmUKK2luIHRoZSBsaXN0IGRpcmVjdGx5LiAgSW4gYWRkaXRpb24sIGEgaGlzdG9yeSBAZGZue2V4cGFuc2lvbn0gZnVuY3Rpb24KK2lzIGF2YWlsYWJsZSB3aGljaCBwcm92aWRlcyBmb3IgYSBjb25zaXN0ZW50IHVzZXIgaW50ZXJmYWNlIGFjcm9zcworZGlmZmVyZW50IHByb2dyYW1zLgorCitUaGUgdXNlciB1c2luZyBwcm9ncmFtcyB3cml0dGVuIHdpdGggdGhlIEhpc3RvcnkgbGlicmFyeSBoYXMgdGhlCitiZW5lZml0IG9mIGEgY29uc2lzdGVudCB1c2VyIGludGVyZmFjZSB3aXRoIGEgc2V0IG9mIHdlbGwta25vd24KK2NvbW1hbmRzIGZvciBtYW5pcHVsYXRpbmcgdGhlIHRleHQgb2YgcHJldmlvdXMgbGluZXMgYW5kIHVzaW5nIHRoYXQgdGV4dAoraW4gbmV3IGNvbW1hbmRzLiAgVGhlIGJhc2ljIGhpc3RvcnkgbWFuaXB1bGF0aW9uIGNvbW1hbmRzIGFyZSBzaW1pbGFyIHRvCit0aGUgaGlzdG9yeSBzdWJzdGl0dXRpb24gcHJvdmlkZWQgYnkgQGNvZGV7Y3NofS4KKworSWYgdGhlIHByb2dyYW1tZXIgZGVzaXJlcywgaGUgY2FuIHVzZSB0aGUgUmVhZGxpbmUgbGlicmFyeSwgd2hpY2gKK2luY2x1ZGVzIHNvbWUgaGlzdG9yeSBtYW5pcHVsYXRpb24gYnkgZGVmYXVsdCwgYW5kIGhhcyB0aGUgYWRkZWQKK2FkdmFudGFnZSBvZiBjb21tYW5kIGxpbmUgZWRpdGluZy4KKworQmVmb3JlIGRlY2xhcmluZyBhbnkgZnVuY3Rpb25zIHVzaW5nIGFueSBmdW5jdGlvbmFsaXR5IHRoZSBIaXN0b3J5CitsaWJyYXJ5IHByb3ZpZGVzIGluIG90aGVyIGNvZGUsIGFuIGFwcGxpY2F0aW9uIHdyaXRlciBzaG91bGQgaW5jbHVkZQordGhlIGZpbGUgQGNvZGV7PHJlYWRsaW5lL2hpc3RvcnkuaD59IGluIGFueSBmaWxlIHRoYXQgdXNlcyB0aGUKK0hpc3RvcnkgbGlicmFyeSdzIGZlYXR1cmVzLiAgSXQgc3VwcGxpZXMgZXh0ZXJuIGRlY2xhcmF0aW9ucyBmb3IgYWxsCitvZiB0aGUgbGlicmFyeSdzIHB1YmxpYyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcywgYW5kIGRlY2xhcmVzIGFsbCBvZgordGhlIHB1YmxpYyBkYXRhIHN0cnVjdHVyZXMuCisKK0Bub2RlIEhpc3RvcnkgU3RvcmFnZQorQHNlY3Rpb24gSGlzdG9yeSBTdG9yYWdlCisKK1RoZSBoaXN0b3J5IGxpc3QgaXMgYW4gYXJyYXkgb2YgaGlzdG9yeSBlbnRyaWVzLiAgQSBoaXN0b3J5IGVudHJ5IGlzCitkZWNsYXJlZCBhcyBmb2xsb3dzOgorCitAZXhhbXBsZQordHlwZWRlZiB2b2lkICpoaXN0ZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCBfaGlzdF9lbnRyeSBAeworICBjaGFyICpsaW5lOworICBjaGFyICp0aW1lc3RhbXA7CisgIGhpc3RkYXRhX3QgZGF0YTsKK0B9IEhJU1RfRU5UUlk7CitAZW5kIGV4YW1wbGUKKworVGhlIGhpc3RvcnkgbGlzdCBpdHNlbGYgbWlnaHQgdGhlcmVmb3JlIGJlIGRlY2xhcmVkIGFzCisKK0BleGFtcGxlCitISVNUX0VOVFJZICoqdGhlX2hpc3RvcnlfbGlzdDsKK0BlbmQgZXhhbXBsZQorCitUaGUgc3RhdGUgb2YgdGhlIEhpc3RvcnkgbGlicmFyeSBpcyBlbmNhcHN1bGF0ZWQgaW50byBhIHNpbmdsZSBzdHJ1Y3R1cmU6CisKK0BleGFtcGxlCisvKgorICogQSBzdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIGFyb3VuZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaGlzdG9yeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2hpc3Rfc3RhdGUgQHsKKyAgSElTVF9FTlRSWSAqKmVudHJpZXM7IC8qIFBvaW50ZXIgdG8gdGhlIGVudHJpZXMgdGhlbXNlbHZlcy4gKi8KKyAgaW50IG9mZnNldDsgICAgICAgICAgIC8qIFRoZSBsb2NhdGlvbiBwb2ludGVyIHdpdGhpbiB0aGlzIGFycmF5LiAqLworICBpbnQgbGVuZ3RoOyAgICAgICAgICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhpbiB0aGlzIGFycmF5LiAqLworICBpbnQgc2l6ZTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNsb3RzIGFsbG9jYXRlZCB0byB0aGlzIGFycmF5LiAqLworICBpbnQgZmxhZ3M7CitAfSBISVNUT1JZX1NUQVRFOworQGVuZCBleGFtcGxlCisKK0lmIHRoZSBmbGFncyBtZW1iZXIgaW5jbHVkZXMgQGNvZGV7SFNfU1RJRkxFRH0sIHRoZSBoaXN0b3J5IGhhcyBiZWVuCitzdGlmbGVkLgorCitAbm9kZSBIaXN0b3J5IEZ1bmN0aW9ucworQHNlY3Rpb24gSGlzdG9yeSBGdW5jdGlvbnMKKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgY2FsbGluZyBzZXF1ZW5jZSBmb3IgdGhlIHZhcmlvdXMgZnVuY3Rpb25zCitleHBvcnRlZCBieSB0aGUgQHNje2dudX0gSGlzdG9yeSBsaWJyYXJ5LgorCitAbWVudQorKiBJbml0aWFsaXppbmcgSGlzdG9yeSBhbmQgU3RhdGUgTWFuYWdlbWVudDo6CUZ1bmN0aW9ucyB0byBjYWxsIHdoZW4geW91CisJCQkJCQl3YW50IHRvIHVzZSBoaXN0b3J5IGluIGEKKwkJCQkJCXByb2dyYW0uCisqIEhpc3RvcnkgTGlzdCBNYW5hZ2VtZW50OjoJCUZ1bmN0aW9ucyB1c2VkIHRvIG1hbmFnZSB0aGUgbGlzdAorCQkJCQlvZiBoaXN0b3J5IGVudHJpZXMuCisqIEluZm9ybWF0aW9uIEFib3V0IHRoZSBIaXN0b3J5IExpc3Q6OglGdW5jdGlvbnMgcmV0dXJuaW5nIGluZm9ybWF0aW9uIGFib3V0CisJCQkJCXRoZSBoaXN0b3J5IGxpc3QuCisqIE1vdmluZyBBcm91bmQgdGhlIEhpc3RvcnkgTGlzdDo6CUZ1bmN0aW9ucyB1c2VkIHRvIGNoYW5nZSB0aGUgcG9zaXRpb24KKwkJCQkJaW4gdGhlIGhpc3RvcnkgbGlzdC4KKyogU2VhcmNoaW5nIHRoZSBIaXN0b3J5IExpc3Q6OgkJRnVuY3Rpb25zIHRvIHNlYXJjaCB0aGUgaGlzdG9yeSBsaXN0CisJCQkJCWZvciBlbnRyaWVzIGNvbnRhaW5pbmcgYSBzdHJpbmcuCisqIE1hbmFnaW5nIHRoZSBIaXN0b3J5IEZpbGU6OgkJRnVuY3Rpb25zIHRoYXQgcmVhZCBhbmQgd3JpdGUgYSBmaWxlCisJCQkJCWNvbnRhaW5pbmcgdGhlIGhpc3RvcnkgbGlzdC4KKyogSGlzdG9yeSBFeHBhbnNpb246OgkJCUZ1bmN0aW9ucyB0byBwZXJmb3JtIGNzaC1saWtlIGhpc3RvcnkKKwkJCQkJZXhwYW5zaW9uLgorQGVuZCBtZW51CisKK0Bub2RlIEluaXRpYWxpemluZyBIaXN0b3J5IGFuZCBTdGF0ZSBNYW5hZ2VtZW50CitAc3Vic2VjdGlvbiBJbml0aWFsaXppbmcgSGlzdG9yeSBhbmQgU3RhdGUgTWFuYWdlbWVudAorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGZ1bmN0aW9ucyB1c2VkIHRvIGluaXRpYWxpemUgYW5kIG1hbmFnZQordGhlIHN0YXRlIG9mIHRoZSBIaXN0b3J5IGxpYnJhcnkgd2hlbiB5b3Ugd2FudCB0byB1c2UgdGhlIGhpc3RvcnkKK2Z1bmN0aW9ucyBpbiB5b3VyIHByb2dyYW0uCisKK0BkZWZ0eXBlZnVuIHZvaWQgdXNpbmdfaGlzdG9yeSAodm9pZCkKK0JlZ2luIGEgc2Vzc2lvbiBpbiB3aGljaCB0aGUgaGlzdG9yeSBmdW5jdGlvbnMgbWlnaHQgYmUgdXNlZC4gIFRoaXMKK2luaXRpYWxpemVzIHRoZSBpbnRlcmFjdGl2ZSB2YXJpYWJsZXMuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge0hJU1RPUllfU1RBVEUgKn0gaGlzdG9yeV9nZXRfaGlzdG9yeV9zdGF0ZSAodm9pZCkKK1JldHVybiBhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbnB1dCBoaXN0b3J5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgaGlzdG9yeV9zZXRfaGlzdG9yeV9zdGF0ZSAoSElTVE9SWV9TVEFURSAqc3RhdGUpCitTZXQgdGhlIHN0YXRlIG9mIHRoZSBoaXN0b3J5IGxpc3QgYWNjb3JkaW5nIHRvIEB2YXJ7c3RhdGV9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIEhpc3RvcnkgTGlzdCBNYW5hZ2VtZW50CitAc3Vic2VjdGlvbiBIaXN0b3J5IExpc3QgTWFuYWdlbWVudAorCitUaGVzZSBmdW5jdGlvbnMgbWFuYWdlIGluZGl2aWR1YWwgZW50cmllcyBvbiB0aGUgaGlzdG9yeSBsaXN0LCBvciBzZXQKK3BhcmFtZXRlcnMgbWFuYWdpbmcgdGhlIGxpc3QgaXRzZWxmLgorCitAZGVmdHlwZWZ1biB2b2lkIGFkZF9oaXN0b3J5IChjb25zdCBjaGFyICpzdHJpbmcpCitQbGFjZSBAdmFye3N0cmluZ30gYXQgdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSBsaXN0LiAgVGhlIGFzc29jaWF0ZWQgZGF0YQorZmllbGQgKGlmIGFueSkgaXMgc2V0IHRvIEBjb2Rle05VTEx9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgYWRkX2hpc3RvcnlfdGltZSAoY29uc3QgY2hhciAqc3RyaW5nKQorQ2hhbmdlIHRoZSB0aW1lIHN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgaGlzdG9yeSBlbnRyeSB0bworQHZhcntzdHJpbmd9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHtISVNUX0VOVFJZICp9IHJlbW92ZV9oaXN0b3J5IChpbnQgd2hpY2gpCitSZW1vdmUgaGlzdG9yeSBlbnRyeSBhdCBvZmZzZXQgQHZhcnt3aGljaH0gZnJvbSB0aGUgaGlzdG9yeS4gIFRoZQorcmVtb3ZlZCBlbGVtZW50IGlzIHJldHVybmVkIHNvIHlvdSBjYW4gZnJlZSB0aGUgbGluZSwgZGF0YSwKK2FuZCBjb250YWluaW5nIHN0cnVjdHVyZS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7aGlzdGRhdGFfdH0gZnJlZV9oaXN0b3J5X2VudHJ5IChISVNUX0VOVFJZICpoaXN0ZW50KQorRnJlZSB0aGUgaGlzdG9yeSBlbnRyeSBAdmFye2hpc3RlbnR9IGFuZCBhbnkgaGlzdG9yeSBsaWJyYXJ5IHByaXZhdGUKK2RhdGEgYXNzb2NpYXRlZCB3aXRoIGl0LiAgUmV0dXJucyB0aGUgYXBwbGljYXRpb24tc3BlY2lmaWMgZGF0YQorc28gdGhlIGNhbGxlciBjYW4gZGlzcG9zZSBvZiBpdC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7SElTVF9FTlRSWSAqfSByZXBsYWNlX2hpc3RvcnlfZW50cnkgKGludCB3aGljaCwgY29uc3QgY2hhciAqbGluZSwgaGlzdGRhdGFfdCBkYXRhKQorTWFrZSB0aGUgaGlzdG9yeSBlbnRyeSBhdCBvZmZzZXQgQHZhcnt3aGljaH0gaGF2ZSBAdmFye2xpbmV9IGFuZCBAdmFye2RhdGF9LgorVGhpcyByZXR1cm5zIHRoZSBvbGQgZW50cnkgc28gdGhlIGNhbGxlciBjYW4gZGlzcG9zZSBvZiBhbnkKK2FwcGxpY2F0aW9uLXNwZWNpZmljIGRhdGEuICBJbiB0aGUgY2FzZQorb2YgYW4gaW52YWxpZCBAdmFye3doaWNofSwgYSBAY29kZXtOVUxMfSBwb2ludGVyIGlzIHJldHVybmVkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgY2xlYXJfaGlzdG9yeSAodm9pZCkKK0NsZWFyIHRoZSBoaXN0b3J5IGxpc3QgYnkgZGVsZXRpbmcgYWxsIHRoZSBlbnRyaWVzLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgc3RpZmxlX2hpc3RvcnkgKGludCBtYXgpCitTdGlmbGUgdGhlIGhpc3RvcnkgbGlzdCwgcmVtZW1iZXJpbmcgb25seSB0aGUgbGFzdCBAdmFye21heH0gZW50cmllcy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgdW5zdGlmbGVfaGlzdG9yeSAodm9pZCkKK1N0b3Agc3RpZmxpbmcgdGhlIGhpc3RvcnkuICBUaGlzIHJldHVybnMgdGhlIHByZXZpb3VzbHktc2V0CittYXhpbXVtIG51bWJlciBvZiBoaXN0b3J5IGVudHJpZXMgKGFzIHNldCBieSBAY29kZXtzdGlmbGVfaGlzdG9yeSgpfSkuCitUaGUgdmFsdWUgaXMgcG9zaXRpdmUgaWYgdGhlIGhpc3Rvcnkgd2FzCitzdGlmbGVkLCBuZWdhdGl2ZSBpZiBpdCB3YXNuJ3QuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IGhpc3RvcnlfaXNfc3RpZmxlZCAodm9pZCkKK1JldHVybnMgbm9uLXplcm8gaWYgdGhlIGhpc3RvcnkgaXMgc3RpZmxlZCwgemVybyBpZiBpdCBpcyBub3QuCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgSW5mb3JtYXRpb24gQWJvdXQgdGhlIEhpc3RvcnkgTGlzdAorQHN1YnNlY3Rpb24gSW5mb3JtYXRpb24gQWJvdXQgdGhlIEhpc3RvcnkgTGlzdAorCitUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbnRpcmUgaGlzdG9yeSBsaXN0IG9yCitpbmRpdmlkdWFsIGxpc3QgZW50cmllcy4KKworQGRlZnR5cGVmdW4ge0hJU1RfRU5UUlkgKip9IGhpc3RvcnlfbGlzdCAodm9pZCkKK1JldHVybiBhIEBjb2Rle05VTEx9IHRlcm1pbmF0ZWQgYXJyYXkgb2YgQGNvZGV7SElTVF9FTlRSWSAqfSB3aGljaCBpcyB0aGUKK2N1cnJlbnQgaW5wdXQgaGlzdG9yeS4gIEVsZW1lbnQgMCBvZiB0aGlzIGxpc3QgaXMgdGhlIGJlZ2lubmluZyBvZiB0aW1lLgorSWYgdGhlcmUgaXMgbm8gaGlzdG9yeSwgcmV0dXJuIEBjb2Rle05VTEx9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCB3aGVyZV9oaXN0b3J5ICh2b2lkKQorUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGhpc3RvcnkgZWxlbWVudC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7SElTVF9FTlRSWSAqfSBjdXJyZW50X2hpc3RvcnkgKHZvaWQpCitSZXR1cm4gdGhlIGhpc3RvcnkgZW50cnkgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24sIGFzIGRldGVybWluZWQgYnkKK0Bjb2Rle3doZXJlX2hpc3RvcnkoKX0uICBJZiB0aGVyZSBpcyBubyBlbnRyeSB0aGVyZSwgcmV0dXJuIGEgQGNvZGV7TlVMTH0KK3BvaW50ZXIuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge0hJU1RfRU5UUlkgKn0gaGlzdG9yeV9nZXQgKGludCBvZmZzZXQpCitSZXR1cm4gdGhlIGhpc3RvcnkgZW50cnkgYXQgcG9zaXRpb24gQHZhcntvZmZzZXR9LCBzdGFydGluZyBmcm9tCitAY29kZXtoaXN0b3J5X2Jhc2V9IChAcHhyZWZ7SGlzdG9yeSBWYXJpYWJsZXN9KS4KK0lmIHRoZXJlIGlzIG5vIGVudHJ5IHRoZXJlLCBvciBpZiBAdmFye29mZnNldH0KK2lzIGdyZWF0ZXIgdGhhbiB0aGUgaGlzdG9yeSBsZW5ndGgsIHJldHVybiBhIEBjb2Rle05VTEx9IHBvaW50ZXIuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdGltZV90IGhpc3RvcnlfZ2V0X3RpbWUgKEhJU1RfRU5UUlkgKmVudHJ5KQorUmV0dXJuIHRoZSB0aW1lIHN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGlzdG9yeSBlbnRyeSBAdmFye2VudHJ5fS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgaGlzdG9yeV90b3RhbF9ieXRlcyAodm9pZCkKK1JldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIHByaW1hcnkgaGlzdG9yeSBlbnRyaWVzIGFyZSB1c2luZy4KK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIGFsbCB0aGUgbGluZXMgaW4gdGhlCitoaXN0b3J5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIE1vdmluZyBBcm91bmQgdGhlIEhpc3RvcnkgTGlzdAorQHN1YnNlY3Rpb24gTW92aW5nIEFyb3VuZCB0aGUgSGlzdG9yeSBMaXN0CisKK1RoZXNlIGZ1bmN0aW9ucyBhbGxvdyB0aGUgY3VycmVudCBpbmRleCBpbnRvIHRoZSBoaXN0b3J5IGxpc3QgdG8gYmUKK3NldCBvciBjaGFuZ2VkLgorCitAZGVmdHlwZWZ1biBpbnQgaGlzdG9yeV9zZXRfcG9zIChpbnQgcG9zKQorU2V0IHRoZSBjdXJyZW50IGhpc3Rvcnkgb2Zmc2V0IHRvIEB2YXJ7cG9zfSwgYW4gYWJzb2x1dGUgaW5kZXgKK2ludG8gdGhlIGxpc3QuCitSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBpZiBAdmFye3Bvc30gaXMgbGVzcyB0aGFuIHplcm8gb3IgZ3JlYXRlcgordGhhbiB0aGUgbnVtYmVyIG9mIGhpc3RvcnkgZW50cmllcy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7SElTVF9FTlRSWSAqfSBwcmV2aW91c19oaXN0b3J5ICh2b2lkKQorQmFjayB1cCB0aGUgY3VycmVudCBoaXN0b3J5IG9mZnNldCB0byB0aGUgcHJldmlvdXMgaGlzdG9yeSBlbnRyeSwgYW5kCityZXR1cm4gYSBwb2ludGVyIHRvIHRoYXQgZW50cnkuICBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyBlbnRyeSwgcmV0dXJuCithIEBjb2Rle05VTEx9IHBvaW50ZXIuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge0hJU1RfRU5UUlkgKn0gbmV4dF9oaXN0b3J5ICh2b2lkKQorTW92ZSB0aGUgY3VycmVudCBoaXN0b3J5IG9mZnNldCBmb3J3YXJkIHRvIHRoZSBuZXh0IGhpc3RvcnkgZW50cnksIGFuZAorcmV0dXJuIHRoZSBhIHBvaW50ZXIgdG8gdGhhdCBlbnRyeS4gIElmIHRoZXJlIGlzIG5vIG5leHQgZW50cnksIHJldHVybgorYSBAY29kZXtOVUxMfSBwb2ludGVyLgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIFNlYXJjaGluZyB0aGUgSGlzdG9yeSBMaXN0CitAc3Vic2VjdGlvbiBTZWFyY2hpbmcgdGhlIEhpc3RvcnkgTGlzdAorQGNpbmRleCBIaXN0b3J5IFNlYXJjaGluZworCitUaGVzZSBmdW5jdGlvbnMgYWxsb3cgc2VhcmNoaW5nIG9mIHRoZSBoaXN0b3J5IGxpc3QgZm9yIGVudHJpZXMgY29udGFpbmluZworYSBzcGVjaWZpYyBzdHJpbmcuICBTZWFyY2hpbmcgbWF5IGJlIHBlcmZvcm1lZCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkCitmcm9tIHRoZSBjdXJyZW50IGhpc3RvcnkgcG9zaXRpb24uICBUaGUgc2VhcmNoIG1heSBiZSBAZGZue2FuY2hvcmVkfSwKK21lYW5pbmcgdGhhdCB0aGUgc3RyaW5nIG11c3QgbWF0Y2ggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGlzdG9yeSBlbnRyeS4KK0BjaW5kZXggYW5jaG9yZWQgc2VhcmNoCisKK0BkZWZ0eXBlZnVuIGludCBoaXN0b3J5X3NlYXJjaCAoY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgZGlyZWN0aW9uKQorU2VhcmNoIHRoZSBoaXN0b3J5IGZvciBAdmFye3N0cmluZ30sIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGhpc3Rvcnkgb2Zmc2V0LgorSWYgQHZhcntkaXJlY3Rpb259IGlzIGxlc3MgdGhhbiAwLCB0aGVuIHRoZSBzZWFyY2ggaXMgdGhyb3VnaAorcHJldmlvdXMgZW50cmllcywgb3RoZXJ3aXNlIHRocm91Z2ggc3Vic2VxdWVudCBlbnRyaWVzLgorSWYgQHZhcntzdHJpbmd9IGlzIGZvdW5kLCB0aGVuCit0aGUgY3VycmVudCBoaXN0b3J5IGluZGV4IGlzIHNldCB0byB0aGF0IGhpc3RvcnkgZW50cnksIGFuZCB0aGUgdmFsdWUKK3JldHVybmVkIGlzIHRoZSBvZmZzZXQgaW4gdGhlIGxpbmUgb2YgdGhlIGVudHJ5IHdoZXJlCitAdmFye3N0cmluZ30gd2FzIGZvdW5kLiAgT3RoZXJ3aXNlLCBub3RoaW5nIGlzIGNoYW5nZWQsIGFuZCBhIC0xIGlzCityZXR1cm5lZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgaGlzdG9yeV9zZWFyY2hfcHJlZml4IChjb25zdCBjaGFyICpzdHJpbmcsIGludCBkaXJlY3Rpb24pCitTZWFyY2ggdGhlIGhpc3RvcnkgZm9yIEB2YXJ7c3RyaW5nfSwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgaGlzdG9yeQorb2Zmc2V0LiAgVGhlIHNlYXJjaCBpcyBhbmNob3JlZDogbWF0Y2hpbmcgbGluZXMgbXVzdCBiZWdpbiB3aXRoCitAdmFye3N0cmluZ30uICBJZiBAdmFye2RpcmVjdGlvbn0gaXMgbGVzcyB0aGFuIDAsIHRoZW4gdGhlIHNlYXJjaCBpcwordGhyb3VnaCBwcmV2aW91cyBlbnRyaWVzLCBvdGhlcndpc2UgdGhyb3VnaCBzdWJzZXF1ZW50IGVudHJpZXMuCitJZiBAdmFye3N0cmluZ30gaXMgZm91bmQsIHRoZW4gdGhlCitjdXJyZW50IGhpc3RvcnkgaW5kZXggaXMgc2V0IHRvIHRoYXQgZW50cnksIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIDAuIAorT3RoZXJ3aXNlLCBub3RoaW5nIGlzIGNoYW5nZWQsIGFuZCBhIC0xIGlzIHJldHVybmVkLiAKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgaGlzdG9yeV9zZWFyY2hfcG9zIChjb25zdCBjaGFyICpzdHJpbmcsIGludCBkaXJlY3Rpb24sIGludCBwb3MpCitTZWFyY2ggZm9yIEB2YXJ7c3RyaW5nfSBpbiB0aGUgaGlzdG9yeSBsaXN0LCBzdGFydGluZyBhdCBAdmFye3Bvc30sIGFuCithYnNvbHV0ZSBpbmRleCBpbnRvIHRoZSBsaXN0LiAgSWYgQHZhcntkaXJlY3Rpb259IGlzIG5lZ2F0aXZlLCB0aGUgc2VhcmNoCitwcm9jZWVkcyBiYWNrd2FyZCBmcm9tIEB2YXJ7cG9zfSwgb3RoZXJ3aXNlIGZvcndhcmQuICBSZXR1cm5zIHRoZSBhYnNvbHV0ZQoraW5kZXggb2YgdGhlIGhpc3RvcnkgZWxlbWVudCB3aGVyZSBAdmFye3N0cmluZ30gd2FzIGZvdW5kLCBvciAtMSBvdGhlcndpc2UuCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgTWFuYWdpbmcgdGhlIEhpc3RvcnkgRmlsZQorQHN1YnNlY3Rpb24gTWFuYWdpbmcgdGhlIEhpc3RvcnkgRmlsZQorCitUaGUgSGlzdG9yeSBsaWJyYXJ5IGNhbiByZWFkIHRoZSBoaXN0b3J5IGZyb20gYW5kIHdyaXRlIGl0IHRvIGEgZmlsZS4KK1RoaXMgc2VjdGlvbiBkb2N1bWVudHMgdGhlIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgYSBoaXN0b3J5IGZpbGUuCisKK0BkZWZ0eXBlZnVuIGludCByZWFkX2hpc3RvcnkgKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorQWRkIHRoZSBjb250ZW50cyBvZiBAdmFye2ZpbGVuYW1lfSB0byB0aGUgaGlzdG9yeSBsaXN0LCBhIGxpbmUgYXQgYSB0aW1lLgorSWYgQHZhcntmaWxlbmFtZX0gaXMgQGNvZGV7TlVMTH0sIHRoZW4gcmVhZCBmcm9tIEBmaWxle34vLmhpc3Rvcnl9LgorUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIEBjb2Rle2Vycm5vfSBpZiBub3QuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJlYWRfaGlzdG9yeV9yYW5nZSAoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmcm9tLCBpbnQgdG8pCitSZWFkIGEgcmFuZ2Ugb2YgbGluZXMgZnJvbSBAdmFye2ZpbGVuYW1lfSwgYWRkaW5nIHRoZW0gdG8gdGhlIGhpc3RvcnkgbGlzdC4KK1N0YXJ0IHJlYWRpbmcgYXQgbGluZSBAdmFye2Zyb219IGFuZCBlbmQgYXQgQHZhcnt0b30uCitJZiBAdmFye2Zyb219IGlzIHplcm8sIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuICBJZiBAdmFye3RvfSBpcyBsZXNzIHRoYW4KK0B2YXJ7ZnJvbX0sIHRoZW4gcmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgSWYgQHZhcntmaWxlbmFtZX0gaXMKK0Bjb2Rle05VTEx9LCB0aGVuIHJlYWQgZnJvbSBAZmlsZXt+Ly5oaXN0b3J5fS4gIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLAorb3IgQGNvZGV7ZXJybm99IGlmIG5vdC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgd3JpdGVfaGlzdG9yeSAoY29uc3QgY2hhciAqZmlsZW5hbWUpCitXcml0ZSB0aGUgY3VycmVudCBoaXN0b3J5IHRvIEB2YXJ7ZmlsZW5hbWV9LCBvdmVyd3JpdGluZyBAdmFye2ZpbGVuYW1lfQoraWYgbmVjZXNzYXJ5LgorSWYgQHZhcntmaWxlbmFtZX0gaXMgQGNvZGV7TlVMTH0sIHRoZW4gd3JpdGUgdGhlIGhpc3RvcnkgbGlzdCB0bworQGZpbGV7fi8uaGlzdG9yeX0uCitSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgQGNvZGV7ZXJybm99IG9uIGEgcmVhZCBvciB3cml0ZSBlcnJvci4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgYXBwZW5kX2hpc3RvcnkgKGludCBuZWxlbWVudHMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorQXBwZW5kIHRoZSBsYXN0IEB2YXJ7bmVsZW1lbnRzfSBvZiB0aGUgaGlzdG9yeSBsaXN0IHRvIEB2YXJ7ZmlsZW5hbWV9LgorSWYgQHZhcntmaWxlbmFtZX0gaXMgQGNvZGV7TlVMTH0sIHRoZW4gYXBwZW5kIHRvIEBmaWxle34vLmhpc3Rvcnl9LgorUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIEBjb2Rle2Vycm5vfSBvbiBhIHJlYWQgb3Igd3JpdGUgZXJyb3IuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IGhpc3RvcnlfdHJ1bmNhdGVfZmlsZSAoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBubGluZXMpCitUcnVuY2F0ZSB0aGUgaGlzdG9yeSBmaWxlIEB2YXJ7ZmlsZW5hbWV9LCBsZWF2aW5nIG9ubHkgdGhlIGxhc3QKK0B2YXJ7bmxpbmVzfSBsaW5lcy4KK0lmIEB2YXJ7ZmlsZW5hbWV9IGlzIEBjb2Rle05VTEx9LCB0aGVuIEBmaWxle34vLmhpc3Rvcnl9IGlzIHRydW5jYXRlZC4KK1JldHVybnMgMCBvbiBzdWNjZXNzLCBvciBAY29kZXtlcnJub30gb24gZmFpbHVyZS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBIaXN0b3J5IEV4cGFuc2lvbgorQHN1YnNlY3Rpb24gSGlzdG9yeSBFeHBhbnNpb24KKworVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCBoaXN0b3J5IGV4cGFuc2lvbi4KKworQGRlZnR5cGVmdW4gaW50IGhpc3RvcnlfZXhwYW5kIChjaGFyICpzdHJpbmcsIGNoYXIgKipvdXRwdXQpCitFeHBhbmQgQHZhcntzdHJpbmd9LCBwbGFjaW5nIHRoZSByZXN1bHQgaW50byBAdmFye291dHB1dH0sIGEgcG9pbnRlcgordG8gYSBzdHJpbmcgKEBweHJlZntIaXN0b3J5IEludGVyYWN0aW9ufSkuICBSZXR1cm5zOgorQHRhYmxlIEBjb2RlCitAaXRlbSAwCitJZiBubyBleHBhbnNpb25zIHRvb2sgcGxhY2UgKG9yLCBpZiB0aGUgb25seSBjaGFuZ2UgaW4KK3RoZSB0ZXh0IHdhcyB0aGUgcmVtb3ZhbCBvZiBlc2NhcGUgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGhpc3RvcnkgZXhwYW5zaW9uCitjaGFyYWN0ZXIpOworQGl0ZW0gMQoraWYgZXhwYW5zaW9ucyBkaWQgdGFrZSBwbGFjZTsKK0BpdGVtIC0xCitpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gZXhwYW5zaW9uOworQGl0ZW0gMgoraWYgdGhlIHJldHVybmVkIGxpbmUgc2hvdWxkIGJlIGRpc3BsYXllZCwgYnV0IG5vdCBleGVjdXRlZCwKK2FzIHdpdGggdGhlIEBjb2RlezpwfSBtb2RpZmllciAoQHB4cmVme01vZGlmaWVyc30pLgorQGVuZCB0YWJsZQorCitJZiBhbiBlcnJvciBvY3VycmVkIGluIGV4cGFuc2lvbiwgdGhlbiBAdmFye291dHB1dH0gY29udGFpbnMgYSBkZXNjcmlwdGl2ZQorZXJyb3IgbWVzc2FnZS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7Y2hhciAqfSBnZXRfaGlzdG9yeV9ldmVudCAoY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgKmNpbmRleCwgaW50IHFjaGFyKQorUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgaGlzdG9yeSBldmVudCBiZWdpbm5pbmcgYXQgQHZhcntzdHJpbmd9ICsKK0B2YXJ7KmNpbmRleH0uICBAdmFyeypjaW5kZXh9IGlzIG1vZGlmaWVkIHRvIHBvaW50IHRvIGFmdGVyIHRoZSBldmVudAorc3BlY2lmaWVyLiAgQXQgZnVuY3Rpb24gZW50cnksIEB2YXJ7Y2luZGV4fSBwb2ludHMgdG8gdGhlIGluZGV4IGludG8KK0B2YXJ7c3RyaW5nfSB3aGVyZSB0aGUgaGlzdG9yeSBldmVudCBzcGVjaWZpY2F0aW9uIGJlZ2lucy4gIEB2YXJ7cWNoYXJ9CitpcyBhIGNoYXJhY3RlciB0aGF0IGlzIGFsbG93ZWQgdG8gZW5kIHRoZSBldmVudCBzcGVjaWZpY2F0aW9uIGluIGFkZGl0aW9uCit0byB0aGUgYGBub3JtYWwnJyB0ZXJtaW5hdGluZyBjaGFyYWN0ZXJzLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHtjaGFyICoqfSBoaXN0b3J5X3Rva2VuaXplIChjb25zdCBjaGFyICpzdHJpbmcpCitSZXR1cm4gYW4gYXJyYXkgb2YgdG9rZW5zIHBhcnNlZCBvdXQgb2YgQHZhcntzdHJpbmd9LCBtdWNoIGFzIHRoZQorc2hlbGwgbWlnaHQuICBUaGUgdG9rZW5zIGFyZSBzcGxpdCBvbiB0aGUgY2hhcmFjdGVycyBpbiB0aGUKK0B2YXJ7aGlzdG9yeV93b3JkX2RlbGltaXRlcnN9IHZhcmlhYmxlLAorYW5kIHNoZWxsIHF1b3RpbmcgY29udmVudGlvbnMgYXJlIG9iZXllZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7Y2hhciAqfSBoaXN0b3J5X2FyZ19leHRyYWN0IChpbnQgZmlyc3QsIGludCBsYXN0LCBjb25zdCBjaGFyICpzdHJpbmcpCitFeHRyYWN0IGEgc3RyaW5nIHNlZ21lbnQgY29uc2lzdGluZyBvZiB0aGUgQHZhcntmaXJzdH0gdGhyb3VnaCBAdmFye2xhc3R9Cithcmd1bWVudHMgcHJlc2VudCBpbiBAdmFye3N0cmluZ30uICBBcmd1bWVudHMgYXJlIHNwbGl0IHVzaW5nCitAY29kZXtoaXN0b3J5X3Rva2VuaXplfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBIaXN0b3J5IFZhcmlhYmxlcworQHNlY3Rpb24gSGlzdG9yeSBWYXJpYWJsZXMKKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZXh0ZXJuYWxseS12aXNpYmxlIHZhcmlhYmxlcyBleHBvcnRlZCBieQordGhlIEBzY3tnbnV9IEhpc3RvcnkgTGlicmFyeS4KKworQGRlZnR5cGV2YXIgaW50IGhpc3RvcnlfYmFzZQorVGhlIGxvZ2ljYWwgb2Zmc2V0IG9mIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgaGlzdG9yeSBsaXN0LgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIGludCBoaXN0b3J5X2xlbmd0aAorVGhlIG51bWJlciBvZiBlbnRyaWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIGhpc3RvcnkgbGlzdC4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgaGlzdG9yeV9tYXhfZW50cmllcworVGhlIG1heGltdW0gbnVtYmVyIG9mIGhpc3RvcnkgZW50cmllcy4gIFRoaXMgbXVzdCBiZSBjaGFuZ2VkIHVzaW5nCitAY29kZXtzdGlmbGVfaGlzdG9yeSgpfS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgaGlzdG9yeV93cml0ZV90aW1lc3RhbXBzCitJZiBub24temVybywgdGltZXN0YW1wcyBhcmUgd3JpdHRlbiB0byB0aGUgaGlzdG9yeSBmaWxlLCBzbyB0aGV5IGNhbiBiZQorcHJlc2VydmVkIGJldHdlZW4gc2Vzc2lvbnMuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLCBtZWFuaW5nIHRoYXQKK3RpbWVzdGFtcHMgYXJlIG5vdCBzYXZlZC4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBjaGFyIGhpc3RvcnlfZXhwYW5zaW9uX2NoYXIKK1RoZSBjaGFyYWN0ZXIgdGhhdCBpbnRyb2R1Y2VzIGEgaGlzdG9yeSBldmVudC4gIFRoZSBkZWZhdWx0IGlzIEBzYW1weyF9LgorU2V0dGluZyB0aGlzIHRvIDAgaW5oaWJpdHMgaGlzdG9yeSBleHBhbnNpb24uCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgY2hhciBoaXN0b3J5X3N1YnN0X2NoYXIKK1RoZSBjaGFyYWN0ZXIgdGhhdCBpbnZva2VzIHdvcmQgc3Vic3RpdHV0aW9uIGlmIGZvdW5kIGF0IHRoZSBzdGFydCBvZgorYSBsaW5lLiAgVGhlIGRlZmF1bHQgaXMgQHNhbXB7Xn0uCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgY2hhciBoaXN0b3J5X2NvbW1lbnRfY2hhcgorRHVyaW5nIHRva2VuaXphdGlvbiwgaWYgdGhpcyBjaGFyYWN0ZXIgaXMgc2VlbiBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCitvZiBhIHdvcmQsIHRoZW4gaXQgYW5kIGFsbCBzdWJzZXF1ZW50IGNoYXJhY3RlcnMgdXAgdG8gYSBuZXdsaW5lIGFyZQoraWdub3JlZCwgc3VwcHJlc3NpbmcgaGlzdG9yeSBleHBhbnNpb24gZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUuCitUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIge2NoYXIgKn0gaGlzdG9yeV93b3JkX2RlbGltaXRlcnMKK1RoZSBjaGFyYWN0ZXJzIHRoYXQgc2VwYXJhdGUgdG9rZW5zIGZvciBAY29kZXtoaXN0b3J5X3Rva2VuaXplKCl9LgorVGhlIGRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7IiBcdFxuKCk8PjsmfCJ9LgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtjaGFyICp9IGhpc3Rvcnlfc2VhcmNoX2RlbGltaXRlcl9jaGFycworVGhlIGxpc3Qgb2YgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBkZWxpbWl0IGEgaGlzdG9yeSBzZWFyY2gKK3N0cmluZywgaW4gYWRkaXRpb24gdG8gc3BhY2UsIFRBQiwgQHNhbXB7On0gYW5kIEBzYW1wez99IGluIHRoZSBjYXNlIG9mCithIHN1YnN0cmluZyBzZWFyY2guICBUaGUgZGVmYXVsdCBpcyBlbXB0eS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7Y2hhciAqfSBoaXN0b3J5X25vX2V4cGFuZF9jaGFycworVGhlIGxpc3Qgb2YgY2hhcmFjdGVycyB3aGljaCBpbmhpYml0IGhpc3RvcnkgZXhwYW5zaW9uIGlmIGZvdW5kIGltbWVkaWF0ZWx5Citmb2xsb3dpbmcgQHZhcntoaXN0b3J5X2V4cGFuc2lvbl9jaGFyfS4gIFRoZSBkZWZhdWx0IGlzIHNwYWNlLCB0YWIsIG5ld2xpbmUsCitjYXJyaWFnZSByZXR1cm4sIGFuZCBAc2FtcHs9fS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgaGlzdG9yeV9xdW90ZXNfaW5oaWJpdF9leHBhbnNpb24KK0lmIG5vbi16ZXJvLCBzaW5nbGUtcXVvdGVkIHdvcmRzIGFyZSBub3Qgc2Nhbm5lZCBmb3IgdGhlIGhpc3RvcnkgZXhwYW5zaW9uCitjaGFyYWN0ZXIuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtybF9saW5lYnVmX2Z1bmNfdCAqfSBoaXN0b3J5X2luaGliaXRfZXhwYW5zaW9uX2Z1bmN0aW9uCitUaGlzIHNob3VsZCBiZSBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB0aGF0IHRha2VzIHR3byBhcmd1bWVudHM6CithIEBjb2Rle2NoYXIgKn0gKEB2YXJ7c3RyaW5nfSkKK2FuZCBhbiBAY29kZXtpbnR9IGluZGV4IGludG8gdGhhdCBzdHJpbmcgKEB2YXJ7aX0pLgorSXQgc2hvdWxkIHJldHVybiBhIG5vbi16ZXJvIHZhbHVlIGlmIHRoZSBoaXN0b3J5IGV4cGFuc2lvbiBzdGFydGluZyBhdAorQHZhcntzdHJpbmdbaV19IHNob3VsZCBub3QgYmUgcGVyZm9ybWVkOyB6ZXJvIGlmIHRoZSBleHBhbnNpb24gc2hvdWxkCitiZSBkb25lLgorSXQgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMgbGlrZSBCYXNoIHRoYXQgdXNlIHRoZSBoaXN0b3J5CitleHBhbnNpb24gY2hhcmFjdGVyIGZvciBhZGRpdGlvbmFsIHB1cnBvc2VzLgorQnkgZGVmYXVsdCwgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gQGNvZGV7TlVMTH0uCitAZW5kIGRlZnR5cGV2YXIKKworQG5vZGUgSGlzdG9yeSBQcm9ncmFtbWluZyBFeGFtcGxlCitAc2VjdGlvbiBIaXN0b3J5IFByb2dyYW1taW5nIEV4YW1wbGUKKworVGhlIGZvbGxvd2luZyBwcm9ncmFtIGRlbW9uc3RyYXRlcyBzaW1wbGUgdXNlIG9mIHRoZSBAc2N7Z251fSBIaXN0b3J5IExpYnJhcnkuCisKK0BzbWFsbGV4YW1wbGUKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4KKworbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworQHsKKyAgY2hhciBsaW5lWzEwMjRdLCAqdDsKKyAgaW50IGxlbiwgZG9uZSA9IDA7CisKKyAgbGluZVswXSA9IDA7CisKKyAgdXNpbmdfaGlzdG9yeSAoKTsKKyAgd2hpbGUgKCFkb25lKQorICAgIEB7CisgICAgICBwcmludGYgKCJoaXN0b3J5JCAiKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICAgIHQgPSBmZ2V0cyAobGluZSwgc2l6ZW9mIChsaW5lKSAtIDEsIHN0ZGluKTsKKyAgICAgIGlmICh0ICYmICp0KQorICAgICAgICBAeworICAgICAgICAgIGxlbiA9IHN0cmxlbiAodCk7CisgICAgICAgICAgaWYgKHRbbGVuIC0gMV0gPT0gJ1xuJykKKyAgICAgICAgICAgIHRbbGVuIC0gMV0gPSAnXDAnOworICAgICAgICBAfQorCisgICAgICBpZiAoIXQpCisgICAgICAgIHN0cmNweSAobGluZSwgInF1aXQiKTsKKworICAgICAgaWYgKGxpbmVbMF0pCisgICAgICAgIEB7CisgICAgICAgICAgY2hhciAqZXhwYW5zaW9uOworICAgICAgICAgIGludCByZXN1bHQ7CisKKyAgICAgICAgICByZXN1bHQgPSBoaXN0b3J5X2V4cGFuZCAobGluZSwgJmV4cGFuc2lvbik7CisgICAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBleHBhbnNpb24pOworCisgICAgICAgICAgaWYgKHJlc3VsdCA8IDAgfHwgcmVzdWx0ID09IDIpCisgICAgICAgICAgICBAeworICAgICAgICAgICAgICBmcmVlIChleHBhbnNpb24pOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEB9CisKKyAgICAgICAgICBhZGRfaGlzdG9yeSAoZXhwYW5zaW9uKTsKKyAgICAgICAgICBzdHJuY3B5IChsaW5lLCBleHBhbnNpb24sIHNpemVvZiAobGluZSkgLSAxKTsKKyAgICAgICAgICBmcmVlIChleHBhbnNpb24pOworICAgICAgICBAfQorCisgICAgICBpZiAoc3RyY21wIChsaW5lLCAicXVpdCIpID09IDApCisgICAgICAgIGRvbmUgPSAxOworICAgICAgZWxzZSBpZiAoc3RyY21wIChsaW5lLCAic2F2ZSIpID09IDApCisgICAgICAgIHdyaXRlX2hpc3RvcnkgKCJoaXN0b3J5X2ZpbGUiKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobGluZSwgInJlYWQiKSA9PSAwKQorICAgICAgICByZWFkX2hpc3RvcnkgKCJoaXN0b3J5X2ZpbGUiKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobGluZSwgImxpc3QiKSA9PSAwKQorICAgICAgICBAeworICAgICAgICAgIHJlZ2lzdGVyIEhJU1RfRU5UUlkgKip0aGVfbGlzdDsKKyAgICAgICAgICByZWdpc3RlciBpbnQgaTsKKworICAgICAgICAgIHRoZV9saXN0ID0gaGlzdG9yeV9saXN0ICgpOworICAgICAgICAgIGlmICh0aGVfbGlzdCkKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IHRoZV9saXN0W2ldOyBpKyspCisgICAgICAgICAgICAgIHByaW50ZiAoIiVkOiAlc1xuIiwgaSArIGhpc3RvcnlfYmFzZSwgdGhlX2xpc3RbaV0tPmxpbmUpOworICAgICAgICBAfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAobGluZSwgImRlbGV0ZSIsIDYpID09IDApCisgICAgICAgIEB7CisgICAgICAgICAgaW50IHdoaWNoOworICAgICAgICAgIGlmICgoc3NjYW5mIChsaW5lICsgNiwgIiVkIiwgJndoaWNoKSkgPT0gMSkKKyAgICAgICAgICAgIEB7CisgICAgICAgICAgICAgIEhJU1RfRU5UUlkgKmVudHJ5ID0gcmVtb3ZlX2hpc3RvcnkgKHdoaWNoKTsKKyAgICAgICAgICAgICAgaWYgKCFlbnRyeSkKKyAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJObyBzdWNoIGVudHJ5ICVkXG4iLCB3aGljaCk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBAeworICAgICAgICAgICAgICAgICAgZnJlZSAoZW50cnktPmxpbmUpOworICAgICAgICAgICAgICAgICAgZnJlZSAoZW50cnkpOworICAgICAgICAgICAgICAgIEB9CisgICAgICAgICAgICBAfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIm5vbi1udW1lcmljIGFyZyBnaXZlbiB0byBgZGVsZXRlJ1xuIik7CisgICAgICAgICAgICBAfQorICAgICAgICBAfQorICAgIEB9CitAfQorQGVuZCBzbWFsbGV4YW1wbGUKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2RvYy9oc3VzZXIudGV4aSBiL3JlYWRsaW5lL2RvYy9oc3VzZXIudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzg5MTgzCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZG9jL2hzdXNlci50ZXhpCkBAIC0wLDAgKzEsNDU3IEBACitAaWdub3JlCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSB1c2VyIGludGVyZmFjZSB0byB0aGUgR05VIEhpc3RvcnkgbGlicmFyeS4KKworQ29weXJpZ2h0IChDKSAxOTg4LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitBdXRob3JlZCBieSBCcmlhbiBGb3ggYW5kIENoZXQgUmFtZXkuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIG1hbnVhbAorcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXJlIHByZXNlcnZlZCBvbgorYWxsIGNvcGllcy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKK3Jlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uIG5vdGljZQoraWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGggKHRoaXMKK3BhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQgdGhlCitHTlUgQ29weXJpZ2h0IHN0YXRlbWVudCBpcyBhdmFpbGFibGUgdG8gdGhlIGRpc3RyaWJ1dGVlLCBhbmQgcHJvdmlkZWQgdGhhdAordGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIGlnbm9yZQorCitAbm9kZSBVc2luZyBIaXN0b3J5IEludGVyYWN0aXZlbHkKK0BjaGFwdGVyIFVzaW5nIEhpc3RvcnkgSW50ZXJhY3RpdmVseQorCitAaWZjbGVhciBCYXNoRmVhdHVyZXMKK0BkZWZjb2RlaW5kZXggYnQKK0BlbmQgaWZjbGVhcgorCitAaWZzZXQgQmFzaEZlYXR1cmVzCitUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIEBzY3tnbnV9IEhpc3RvcnkgTGlicmFyeQoraW50ZXJhY3RpdmVseSwgZnJvbSBhIHVzZXIncyBzdGFuZHBvaW50LgorSXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSB1c2VyJ3MgZ3VpZGUuCitGb3IgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIEBzY3tnbnV9IEhpc3RvcnkgTGlicmFyeSBpbiBvdGhlciBwcm9ncmFtcywKK3NlZSB0aGUgQHNje2dudX0gUmVhZGxpbmUgTGlicmFyeSBNYW51YWwuCitAZW5kIGlmc2V0CitAaWZjbGVhciBCYXNoRmVhdHVyZXMKK1RoaXMgY2hhcHRlciBkZXNjcmliZXMgaG93IHRvIHVzZSB0aGUgQHNje2dudX0gSGlzdG9yeSBMaWJyYXJ5IGludGVyYWN0aXZlbHksCitmcm9tIGEgdXNlcidzIHN0YW5kcG9pbnQuICBJdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHVzZXIncyBndWlkZS4gIEZvcgoraW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIEBzY3tnbnV9IEhpc3RvcnkgTGlicmFyeSBpbiB5b3VyIG93biBwcm9ncmFtcywKK0BweHJlZntQcm9ncmFtbWluZyB3aXRoIEdOVSBIaXN0b3J5fS4KK0BlbmQgaWZjbGVhcgorCitAaWZzZXQgQmFzaEZlYXR1cmVzCitAbWVudQorKiBCYXNoIEhpc3RvcnkgRmFjaWxpdGllczo6CUhvdyBCYXNoIGxldHMgeW91IG1hbmlwdWxhdGUgeW91ciBjb21tYW5kCisJCQkJaGlzdG9yeS4KKyogQmFzaCBIaXN0b3J5IEJ1aWx0aW5zOjoJVGhlIEJhc2ggYnVpbHRpbiBjb21tYW5kcyB0aGF0IG1hbmlwdWxhdGUKKwkJCQl0aGUgY29tbWFuZCBoaXN0b3J5LgorKiBIaXN0b3J5IEludGVyYWN0aW9uOjoJCVdoYXQgaXQgZmVlbHMgbGlrZSB1c2luZyBIaXN0b3J5IGFzIGEgdXNlci4KK0BlbmQgbWVudQorQGVuZCBpZnNldAorQGlmY2xlYXIgQmFzaEZlYXR1cmVzCitAbWVudQorKiBIaXN0b3J5IEludGVyYWN0aW9uOjoJCVdoYXQgaXQgZmVlbHMgbGlrZSB1c2luZyBIaXN0b3J5IGFzIGEgdXNlci4KK0BlbmQgbWVudQorQGVuZCBpZmNsZWFyCisKK0BpZnNldCBCYXNoRmVhdHVyZXMKK0Bub2RlIEJhc2ggSGlzdG9yeSBGYWNpbGl0aWVzCitAc2VjdGlvbiBCYXNoIEhpc3RvcnkgRmFjaWxpdGllcworQGNpbmRleCBjb21tYW5kIGhpc3RvcnkKK0BjaW5kZXggaGlzdG9yeSBsaXN0CisKK1doZW4gdGhlIEBvcHRpb257LW8gaGlzdG9yeX0gb3B0aW9uIHRvIHRoZSBAY29kZXtzZXR9IGJ1aWx0aW4KK2lzIGVuYWJsZWQgKEBweHJlZntUaGUgU2V0IEJ1aWx0aW59KSwKK3RoZSBzaGVsbCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIEBkZm57Y29tbWFuZCBoaXN0b3J5fSwKK3RoZSBsaXN0IG9mIGNvbW1hbmRzIHByZXZpb3VzbHkgdHlwZWQuCitUaGUgdmFsdWUgb2YgdGhlIEBlbnZ7SElTVFNJWkV9IHNoZWxsIHZhcmlhYmxlIGlzIHVzZWQgYXMgdGhlCitudW1iZXIgb2YgY29tbWFuZHMgdG8gc2F2ZSBpbiBhIGhpc3RvcnkgbGlzdC4KK1RoZSB0ZXh0IG9mIHRoZSBsYXN0IEBlbnZ7JEhJU1RTSVpFfQorY29tbWFuZHMgKGRlZmF1bHQgNTAwKSBpcyBzYXZlZC4KK1RoZSBzaGVsbCBzdG9yZXMgZWFjaCBjb21tYW5kIGluIHRoZSBoaXN0b3J5IGxpc3QgcHJpb3IgdG8KK3BhcmFtZXRlciBhbmQgdmFyaWFibGUgZXhwYW5zaW9uCitidXQgYWZ0ZXIgaGlzdG9yeSBleHBhbnNpb24gaXMgcGVyZm9ybWVkLCBzdWJqZWN0IHRvIHRoZQordmFsdWVzIG9mIHRoZSBzaGVsbCB2YXJpYWJsZXMKK0BlbnZ7SElTVElHTk9SRX0gYW5kIEBlbnZ7SElTVENPTlRST0x9LgorCitXaGVuIHRoZSBzaGVsbCBzdGFydHMgdXAsIHRoZSBoaXN0b3J5IGlzIGluaXRpYWxpemVkIGZyb20gdGhlCitmaWxlIG5hbWVkIGJ5IHRoZSBAZW52e0hJU1RGSUxFfSB2YXJpYWJsZSAoZGVmYXVsdCBAZmlsZXt+Ly5iYXNoX2hpc3Rvcnl9KS4KK1RoZSBmaWxlIG5hbWVkIGJ5IHRoZSB2YWx1ZSBvZiBAZW52e0hJU1RGSUxFfSBpcyB0cnVuY2F0ZWQsIGlmCituZWNlc3NhcnksIHRvIGNvbnRhaW4gbm8gbW9yZSB0aGFuIHRoZSBudW1iZXIgb2YgbGluZXMgc3BlY2lmaWVkIGJ5Cit0aGUgdmFsdWUgb2YgdGhlIEBlbnZ7SElTVEZJTEVTSVpFfSB2YXJpYWJsZS4KK1doZW4gYW4gaW50ZXJhY3RpdmUgc2hlbGwgZXhpdHMsIHRoZSBsYXN0CitAZW52eyRISVNUU0laRX0gbGluZXMgYXJlIGNvcGllZCBmcm9tIHRoZSBoaXN0b3J5IGxpc3QgdG8gdGhlIGZpbGUKK25hbWVkIGJ5IEBlbnZ7JEhJU1RGSUxFfS4KK0lmIHRoZSBAY29kZXtoaXN0YXBwZW5kfSBzaGVsbCBvcHRpb24gaXMgc2V0IChAcHhyZWZ7QmFzaCBCdWlsdGluc30pLAordGhlIGxpbmVzIGFyZSBhcHBlbmRlZCB0byB0aGUgaGlzdG9yeSBmaWxlLAorb3RoZXJ3aXNlIHRoZSBoaXN0b3J5IGZpbGUgaXMgb3ZlcndyaXR0ZW4uCitJZiBAZW52e0hJU1RGSUxFfQoraXMgdW5zZXQsIG9yIGlmIHRoZSBoaXN0b3J5IGZpbGUgaXMgdW53cml0YWJsZSwgdGhlIGhpc3RvcnkgaXMKK25vdCBzYXZlZC4gIEFmdGVyIHNhdmluZyB0aGUgaGlzdG9yeSwgdGhlIGhpc3RvcnkgZmlsZSBpcyB0cnVuY2F0ZWQKK3RvIGNvbnRhaW4gbm8gbW9yZSB0aGFuIEBlbnZ7JEhJU1RGSUxFU0laRX0KK2xpbmVzLiAgSWYgQGVudntISVNURklMRVNJWkV9IGlzIG5vdCBzZXQsIG5vIHRydW5jYXRpb24gaXMgcGVyZm9ybWVkLgorCitJZiB0aGUgQGVudntISVNUVElNRUZPUk1BVH0gaXMgc2V0LCB0aGUgdGltZSBzdGFtcCBpbmZvcm1hdGlvbgorYXNzb2NpYXRlZCB3aXRoIGVhY2ggaGlzdG9yeSBlbnRyeSBpcyB3cml0dGVuIHRvIHRoZSBoaXN0b3J5IGZpbGUuCisKK1RoZSBidWlsdGluIGNvbW1hbmQgQGNvZGV7ZmN9IG1heSBiZSB1c2VkIHRvIGxpc3Qgb3IgZWRpdCBhbmQgcmUtZXhlY3V0ZQorYSBwb3J0aW9uIG9mIHRoZSBoaXN0b3J5IGxpc3QuCitUaGUgQGNvZGV7aGlzdG9yeX0gYnVpbHRpbiBtYXkgYmUgdXNlZCB0byBkaXNwbGF5IG9yIG1vZGlmeSB0aGUgaGlzdG9yeQorbGlzdCBhbmQgbWFuaXB1bGF0ZSB0aGUgaGlzdG9yeSBmaWxlLgorV2hlbiB1c2luZyBjb21tYW5kLWxpbmUgZWRpdGluZywgc2VhcmNoIGNvbW1hbmRzCithcmUgYXZhaWxhYmxlIGluIGVhY2ggZWRpdGluZyBtb2RlIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlCitoaXN0b3J5IGxpc3QgKEBweHJlZntDb21tYW5kcyBGb3IgSGlzdG9yeX0pLgorCitUaGUgc2hlbGwgYWxsb3dzIGNvbnRyb2wgb3ZlciB3aGljaCBjb21tYW5kcyBhcmUgc2F2ZWQgb24gdGhlIGhpc3RvcnkKK2xpc3QuICBUaGUgQGVudntISVNUQ09OVFJPTH0gYW5kIEBlbnZ7SElTVElHTk9SRX0KK3ZhcmlhYmxlcyBtYXkgYmUgc2V0IHRvIGNhdXNlIHRoZSBzaGVsbCB0byBzYXZlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCitjb21tYW5kcyBlbnRlcmVkLgorVGhlIEBjb2Rle2NtZGhpc3R9CitzaGVsbCBvcHRpb24sIGlmIGVuYWJsZWQsIGNhdXNlcyB0aGUgc2hlbGwgdG8gYXR0ZW1wdCB0byBzYXZlIGVhY2gKK2xpbmUgb2YgYSBtdWx0aS1saW5lIGNvbW1hbmQgaW4gdGhlIHNhbWUgaGlzdG9yeSBlbnRyeSwgYWRkaW5nCitzZW1pY29sb25zIHdoZXJlIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZSBzeW50YWN0aWMgY29ycmVjdG5lc3MuCitUaGUgQGNvZGV7bGl0aGlzdH0KK3NoZWxsIG9wdGlvbiBjYXVzZXMgdGhlIHNoZWxsIHRvIHNhdmUgdGhlIGNvbW1hbmQgd2l0aCBlbWJlZGRlZCBuZXdsaW5lcworaW5zdGVhZCBvZiBzZW1pY29sb25zLgorVGhlIEBjb2Rle3Nob3B0fSBidWlsdGluIGlzIHVzZWQgdG8gc2V0IHRoZXNlIG9wdGlvbnMuCitAeHJlZntCYXNoIEJ1aWx0aW5zfSwgZm9yIGEgZGVzY3JpcHRpb24gb2YgQGNvZGV7c2hvcHR9LgorCitAbm9kZSBCYXNoIEhpc3RvcnkgQnVpbHRpbnMKK0BzZWN0aW9uIEJhc2ggSGlzdG9yeSBCdWlsdGlucworQGNpbmRleCBoaXN0b3J5IGJ1aWx0aW5zCisKK0Jhc2ggcHJvdmlkZXMgdHdvIGJ1aWx0aW4gY29tbWFuZHMgd2hpY2ggbWFuaXB1bGF0ZSB0aGUKK2hpc3RvcnkgbGlzdCBhbmQgaGlzdG9yeSBmaWxlLgorCitAdGFibGUgQGNvZGUKKworQGl0ZW0gZmMKK0BidGluZGV4IGZjCitAZXhhbXBsZQorQGNvZGV7ZmMgWy1lIEB2YXJ7ZW5hbWV9XSBbLW5scl0gW0B2YXJ7Zmlyc3R9XSBbQHZhcntsYXN0fV19CitAY29kZXtmYyAtcyBbQHZhcntwYXR9PUB2YXJ7cmVwfV0gW0B2YXJ7Y29tbWFuZH1dfQorQGVuZCBleGFtcGxlCisKK0ZpeCBDb21tYW5kLiAgSW4gdGhlIGZpcnN0IGZvcm0sIGEgcmFuZ2Ugb2YgY29tbWFuZHMgZnJvbSBAdmFye2ZpcnN0fSB0bworQHZhcntsYXN0fSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBoaXN0b3J5IGxpc3QuICBCb3RoIEB2YXJ7Zmlyc3R9IGFuZAorQHZhcntsYXN0fSBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nICh0byBsb2NhdGUgdGhlIG1vc3QgcmVjZW50Citjb21tYW5kIGJlZ2lubmluZyB3aXRoIHRoYXQgc3RyaW5nKSBvciBhcyBhIG51bWJlciAoYW4gaW5kZXggaW50byB0aGUKK2hpc3RvcnkgbGlzdCwgd2hlcmUgYSBuZWdhdGl2ZSBudW1iZXIgaXMgdXNlZCBhcyBhbiBvZmZzZXQgZnJvbSB0aGUKK2N1cnJlbnQgY29tbWFuZCBudW1iZXIpLiAgSWYgQHZhcntsYXN0fSBpcyBub3Qgc3BlY2lmaWVkIGl0IGlzIHNldCB0bworQHZhcntmaXJzdH0uICBJZiBAdmFye2ZpcnN0fSBpcyBub3Qgc3BlY2lmaWVkIGl0IGlzIHNldCB0byB0aGUgcHJldmlvdXMKK2NvbW1hbmQgZm9yIGVkaXRpbmcgYW5kIEBtaW51c3t9MTYgZm9yIGxpc3RpbmcuICBJZiB0aGUgQG9wdGlvbnstbH0gZmxhZyBpcworZ2l2ZW4sIHRoZSBjb21tYW5kcyBhcmUgbGlzdGVkIG9uIHN0YW5kYXJkIG91dHB1dC4gIFRoZSBAb3B0aW9uey1ufSBmbGFnCitzdXBwcmVzc2VzIHRoZSBjb21tYW5kIG51bWJlcnMgd2hlbiBsaXN0aW5nLiAgVGhlIEBvcHRpb257LXJ9IGZsYWcKK3JldmVyc2VzIHRoZSBvcmRlciBvZiB0aGUgbGlzdGluZy4gIE90aGVyd2lzZSwgdGhlIGVkaXRvciBnaXZlbiBieQorQHZhcntlbmFtZX0gaXMgaW52b2tlZCBvbiBhIGZpbGUgY29udGFpbmluZyB0aG9zZSBjb21tYW5kcy4gIElmCitAdmFye2VuYW1lfSBpcyBub3QgZ2l2ZW4sIHRoZSB2YWx1ZSBvZiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIGV4cGFuc2lvbgoraXMgdXNlZDogQGNvZGV7JEB7RkNFRElUOi0kQHtFRElUT1I6LXZpQH1AfX0uICBUaGlzIHNheXMgdG8gdXNlIHRoZQordmFsdWUgb2YgdGhlIEBlbnZ7RkNFRElUfSB2YXJpYWJsZSBpZiBzZXQsIG9yIHRoZSB2YWx1ZSBvZiB0aGUKK0BlbnZ7RURJVE9SfSB2YXJpYWJsZSBpZiB0aGF0IGlzIHNldCwgb3IgQGNvZGV7dml9IGlmIG5laXRoZXIgaXMgc2V0LgorV2hlbiBlZGl0aW5nIGlzIGNvbXBsZXRlLCB0aGUgZWRpdGVkIGNvbW1hbmRzIGFyZSBlY2hvZWQgYW5kIGV4ZWN1dGVkLgorCitJbiB0aGUgc2Vjb25kIGZvcm0sIEB2YXJ7Y29tbWFuZH0gaXMgcmUtZXhlY3V0ZWQgYWZ0ZXIgZWFjaCBpbnN0YW5jZQorb2YgQHZhcntwYXR9IGluIHRoZSBzZWxlY3RlZCBjb21tYW5kIGlzIHJlcGxhY2VkIGJ5IEB2YXJ7cmVwfS4KKworQSB1c2VmdWwgYWxpYXMgdG8gdXNlIHdpdGggdGhlIEBjb2Rle2ZjfSBjb21tYW5kIGlzIEBjb2Rle3I9J2ZjIC1zJ30sIHNvCit0aGF0IHR5cGluZyBAc2FtcHtyIGNjfSBydW5zIHRoZSBsYXN0IGNvbW1hbmQgYmVnaW5uaW5nIHdpdGggQGNvZGV7Y2N9CithbmQgdHlwaW5nIEBzYW1we3J9IHJlLWV4ZWN1dGVzIHRoZSBsYXN0IGNvbW1hbmQgKEBweHJlZntBbGlhc2VzfSkuCisKK0BpdGVtIGhpc3RvcnkKK0BidGluZGV4IGhpc3RvcnkKK0BleGFtcGxlCitoaXN0b3J5IFtAdmFye259XQoraGlzdG9yeSAtYworaGlzdG9yeSAtZCBAdmFye29mZnNldH0KK2hpc3RvcnkgWy1hbnJ3XSBbQHZhcntmaWxlbmFtZX1dCitoaXN0b3J5IC1wcyBAdmFye2FyZ30KK0BlbmQgZXhhbXBsZQorCitXaXRoIG5vIG9wdGlvbnMsIGRpc3BsYXkgdGhlIGhpc3RvcnkgbGlzdCB3aXRoIGxpbmUgbnVtYmVycy4KK0xpbmVzIHByZWZpeGVkIHdpdGggYSBAc2FtcHsqfSBoYXZlIGJlZW4gbW9kaWZpZWQuCitBbiBhcmd1bWVudCBvZiBAdmFye259IGxpc3RzIG9ubHkgdGhlIGxhc3QgQHZhcntufSBsaW5lcy4KK0lmIHRoZSBzaGVsbCB2YXJpYWJsZSBAZW52e0hJU1RUSU1FRk9STUFUfSBpcyBzZXQgYW5kIG5vdCBudWxsLAoraXQgaXMgdXNlZCBhcyBhIGZvcm1hdCBzdHJpbmcgZm9yIEB2YXJ7c3RyZnRpbWV9IHRvIGRpc3BsYXkKK3RoZSB0aW1lIHN0YW1wIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGRpc3BsYXllZCBoaXN0b3J5IGVudHJ5LgorTm8gaW50ZXJ2ZW5pbmcgYmxhbmsgaXMgcHJpbnRlZCBiZXR3ZWVuIHRoZSBmb3JtYXR0ZWQgdGltZSBzdGFtcAorYW5kIHRoZSBoaXN0b3J5IGxpbmUuCisKK09wdGlvbnMsIGlmIHN1cHBsaWVkLCBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLWMKK0NsZWFyIHRoZSBoaXN0b3J5IGxpc3QuICBUaGlzIG1heSBiZSBjb21iaW5lZAord2l0aCB0aGUgb3RoZXIgb3B0aW9ucyB0byByZXBsYWNlIHRoZSBoaXN0b3J5IGxpc3QgY29tcGxldGVseS4KKworQGl0ZW0gLWQgQHZhcntvZmZzZXR9CitEZWxldGUgdGhlIGhpc3RvcnkgZW50cnkgYXQgcG9zaXRpb24gQHZhcntvZmZzZXR9LgorQHZhcntvZmZzZXR9IHNob3VsZCBiZSBzcGVjaWZpZWQgYXMgaXQgYXBwZWFycyB3aGVuIHRoZSBoaXN0b3J5IGlzCitkaXNwbGF5ZWQuCisKK0BpdGVtIC1hCitBcHBlbmQgdGhlIG5ldworaGlzdG9yeSBsaW5lcyAoaGlzdG9yeSBsaW5lcyBlbnRlcmVkIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlCitjdXJyZW50IEJhc2ggc2Vzc2lvbikgdG8gdGhlIGhpc3RvcnkgZmlsZS4KKworQGl0ZW0gLW4KK0FwcGVuZCB0aGUgaGlzdG9yeSBsaW5lcyBub3QgYWxyZWFkeSByZWFkIGZyb20gdGhlIGhpc3RvcnkgZmlsZQordG8gdGhlIGN1cnJlbnQgaGlzdG9yeSBsaXN0LiAgVGhlc2UgYXJlIGxpbmVzIGFwcGVuZGVkIHRvIHRoZSBoaXN0b3J5CitmaWxlIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgQmFzaCBzZXNzaW9uLgorCitAaXRlbSAtcgorUmVhZCB0aGUgY3VycmVudCBoaXN0b3J5IGZpbGUgYW5kIGFwcGVuZCBpdHMgY29udGVudHMgdG8KK3RoZSBoaXN0b3J5IGxpc3QuCisKK0BpdGVtIC13CitXcml0ZSBvdXQgdGhlIGN1cnJlbnQgaGlzdG9yeSB0byB0aGUgaGlzdG9yeSBmaWxlLgorCitAaXRlbSAtcAorUGVyZm9ybSBoaXN0b3J5IHN1YnN0aXR1dGlvbiBvbiB0aGUgQHZhcnthcmd9cyBhbmQgZGlzcGxheSB0aGUgcmVzdWx0CitvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCB3aXRob3V0IHN0b3JpbmcgdGhlIHJlc3VsdHMgaW4gdGhlIGhpc3RvcnkgbGlzdC4KKworQGl0ZW0gLXMKK1RoZSBAdmFye2FyZ31zIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mCit0aGUgaGlzdG9yeSBsaXN0IGFzIGEgc2luZ2xlIGVudHJ5LgorCitAZW5kIHRhYmxlCisKK1doZW4gYW55IG9mIHRoZSBAb3B0aW9uey13fSwgQG9wdGlvbnstcn0sIEBvcHRpb257LWF9LCBvciBAb3B0aW9uey1ufSBvcHRpb25zIGlzCit1c2VkLCBpZiBAdmFye2ZpbGVuYW1lfQoraXMgZ2l2ZW4sIHRoZW4gaXQgaXMgdXNlZCBhcyB0aGUgaGlzdG9yeSBmaWxlLiAgSWYgbm90LCB0aGVuCit0aGUgdmFsdWUgb2YgdGhlIEBlbnZ7SElTVEZJTEV9IHZhcmlhYmxlIGlzIHVzZWQuCisKK0BlbmQgdGFibGUKK0BlbmQgaWZzZXQKKworQG5vZGUgSGlzdG9yeSBJbnRlcmFjdGlvbgorQHNlY3Rpb24gSGlzdG9yeSBFeHBhbnNpb24KK0BjaW5kZXggaGlzdG9yeSBleHBhbnNpb24KKworVGhlIEhpc3RvcnkgbGlicmFyeSBwcm92aWRlcyBhIGhpc3RvcnkgZXhwYW5zaW9uIGZlYXR1cmUgdGhhdCBpcyBzaW1pbGFyCit0byB0aGUgaGlzdG9yeSBleHBhbnNpb24gcHJvdmlkZWQgYnkgQGNvZGV7Y3NofS4gIFRoaXMgc2VjdGlvbgorZGVzY3JpYmVzIHRoZSBzeW50YXggdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBoaXN0b3J5IGluZm9ybWF0aW9uLgorCitIaXN0b3J5IGV4cGFuc2lvbnMgaW50cm9kdWNlIHdvcmRzIGZyb20gdGhlIGhpc3RvcnkgbGlzdCBpbnRvCit0aGUgaW5wdXQgc3RyZWFtLCBtYWtpbmcgaXQgZWFzeSB0byByZXBlYXQgY29tbWFuZHMsIGluc2VydCB0aGUKK2FyZ3VtZW50cyB0byBhIHByZXZpb3VzIGNvbW1hbmQgaW50byB0aGUgY3VycmVudCBpbnB1dCBsaW5lLCBvcgorZml4IGVycm9ycyBpbiBwcmV2aW91cyBjb21tYW5kcyBxdWlja2x5LgorCitIaXN0b3J5IGV4cGFuc2lvbiB0YWtlcyBwbGFjZSBpbiB0d28gcGFydHMuICBUaGUgZmlyc3QgaXMgdG8gZGV0ZXJtaW5lCit3aGljaCBsaW5lIGZyb20gdGhlIGhpc3RvcnkgbGlzdCBzaG91bGQgYmUgdXNlZCBkdXJpbmcgc3Vic3RpdHV0aW9uLgorVGhlIHNlY29uZCBpcyB0byBzZWxlY3QgcG9ydGlvbnMgb2YgdGhhdCBsaW5lIGZvciBpbmNsdXNpb24gaW50byB0aGUKK2N1cnJlbnQgb25lLiAgVGhlIGxpbmUgc2VsZWN0ZWQgZnJvbSB0aGUgaGlzdG9yeSBpcyBjYWxsZWQgdGhlCitAZGZue2V2ZW50fSwgYW5kIHRoZSBwb3J0aW9ucyBvZiB0aGF0IGxpbmUgdGhhdCBhcmUgYWN0ZWQgdXBvbiBhcmUKK2NhbGxlZCBAZGZue3dvcmRzfS4gIFZhcmlvdXMgQGRmbnttb2RpZmllcnN9IGFyZSBhdmFpbGFibGUgdG8gbWFuaXB1bGF0ZQordGhlIHNlbGVjdGVkIHdvcmRzLiAgVGhlIGxpbmUgaXMgYnJva2VuIGludG8gd29yZHMgaW4gdGhlIHNhbWUgZmFzaGlvbgordGhhdCBCYXNoIGRvZXMsIHNvIHRoYXQgc2V2ZXJhbCB3b3Jkcworc3Vycm91bmRlZCBieSBxdW90ZXMgYXJlIGNvbnNpZGVyZWQgb25lIHdvcmQuCitIaXN0b3J5IGV4cGFuc2lvbnMgYXJlIGludHJvZHVjZWQgYnkgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlCitoaXN0b3J5IGV4cGFuc2lvbiBjaGFyYWN0ZXIsIHdoaWNoIGlzIEBzYW1weyF9IGJ5IGRlZmF1bHQuCitAaWZzZXQgQmFzaEZlYXR1cmVzCitPbmx5IEBzYW1we1x9IGFuZCBAc2FtcHsnfSBtYXkgYmUgdXNlZCB0byBlc2NhcGUgdGhlIGhpc3RvcnkgZXhwYW5zaW9uCitjaGFyYWN0ZXIuCitAZW5kIGlmc2V0CisKK0BpZnNldCBCYXNoRmVhdHVyZXMKK1NldmVyYWwgc2hlbGwgb3B0aW9ucyBzZXR0YWJsZSB3aXRoIHRoZSBAY29kZXtzaG9wdH0KK2J1aWx0aW4gKEBweHJlZntCYXNoIEJ1aWx0aW5zfSkgbWF5IGJlIHVzZWQgdG8gdGFpbG9yCit0aGUgYmVoYXZpb3Igb2YgaGlzdG9yeSBleHBhbnNpb24uICBJZiB0aGUKK0Bjb2Rle2hpc3R2ZXJpZnl9IHNoZWxsIG9wdGlvbiBpcyBlbmFibGVkLCBhbmQgUmVhZGxpbmUKK2lzIGJlaW5nIHVzZWQsIGhpc3Rvcnkgc3Vic3RpdHV0aW9ucyBhcmUgbm90IGltbWVkaWF0ZWx5IHBhc3NlZCB0bwordGhlIHNoZWxsIHBhcnNlci4KK0luc3RlYWQsIHRoZSBleHBhbmRlZCBsaW5lIGlzIHJlbG9hZGVkIGludG8gdGhlIFJlYWRsaW5lCitlZGl0aW5nIGJ1ZmZlciBmb3IgZnVydGhlciBtb2RpZmljYXRpb24uCitJZiBSZWFkbGluZSBpcyBiZWluZyB1c2VkLCBhbmQgdGhlIEBjb2Rle2hpc3RyZWVkaXR9CitzaGVsbCBvcHRpb24gaXMgZW5hYmxlZCwgYSBmYWlsZWQgaGlzdG9yeSBleHBhbnNpb24gd2lsbCBiZQorcmVsb2FkZWQgaW50byB0aGUgUmVhZGxpbmUgZWRpdGluZyBidWZmZXIgZm9yIGNvcnJlY3Rpb24uCitUaGUgQG9wdGlvbnstcH0gb3B0aW9uIHRvIHRoZSBAY29kZXtoaXN0b3J5fSBidWlsdGluIGNvbW1hbmQKK21heSBiZSB1c2VkIHRvIHNlZSB3aGF0IGEgaGlzdG9yeSBleHBhbnNpb24gd2lsbCBkbyBiZWZvcmUgdXNpbmcgaXQuCitUaGUgQG9wdGlvbnstc30gb3B0aW9uIHRvIHRoZSBAY29kZXtoaXN0b3J5fSBidWlsdGluIG1heSBiZSB1c2VkIHRvCithZGQgY29tbWFuZHMgdG8gdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSBsaXN0IHdpdGhvdXQgYWN0dWFsbHkgZXhlY3V0aW5nCit0aGVtLCBzbyB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSBmb3Igc3Vic2VxdWVudCByZWNhbGwuCitUaGlzIGlzIG1vc3QgdXNlZnVsIGluIGNvbmp1bmN0aW9uIHdpdGggUmVhZGxpbmUuCisKK1RoZSBzaGVsbCBhbGxvd3MgY29udHJvbCBvZiB0aGUgdmFyaW91cyBjaGFyYWN0ZXJzIHVzZWQgYnkgdGhlCitoaXN0b3J5IGV4cGFuc2lvbiBtZWNoYW5pc20gd2l0aCB0aGUgQGNvZGV7aGlzdGNoYXJzfSB2YXJpYWJsZS4KK0BlbmQgaWZzZXQKKworQG1lbnUKKyogRXZlbnQgRGVzaWduYXRvcnM6OglIb3cgdG8gc3BlY2lmeSB3aGljaCBoaXN0b3J5IGxpbmUgdG8gdXNlLgorKiBXb3JkIERlc2lnbmF0b3JzOjoJU3BlY2lmeWluZyB3aGljaCB3b3JkcyBhcmUgb2YgaW50ZXJlc3QuCisqIE1vZGlmaWVyczo6CQlNb2RpZnlpbmcgdGhlIHJlc3VsdHMgb2Ygc3Vic3RpdHV0aW9uLgorQGVuZCBtZW51CisKK0Bub2RlIEV2ZW50IERlc2lnbmF0b3JzCitAc3Vic2VjdGlvbiBFdmVudCBEZXNpZ25hdG9ycworQGNpbmRleCBldmVudCBkZXNpZ25hdG9ycworCitBbiBldmVudCBkZXNpZ25hdG9yIGlzIGEgcmVmZXJlbmNlIHRvIGEgY29tbWFuZCBsaW5lIGVudHJ5IGluIHRoZQoraGlzdG9yeSBsaXN0LgorQGNpbmRleCBoaXN0b3J5IGV2ZW50cworCitAdGFibGUgQGFzaXMKKworQGl0ZW0gQGNvZGV7IX0KK0BpZnNldCBCYXNoRmVhdHVyZXMKK1N0YXJ0IGEgaGlzdG9yeSBzdWJzdGl0dXRpb24sIGV4Y2VwdCB3aGVuIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIHRhYiwKK3RoZSBlbmQgb2YgdGhlIGxpbmUsIEBzYW1wez19IG9yIEBzYW1weyh9ICh3aGVuIHRoZQorQGNvZGV7ZXh0Z2xvYn0gc2hlbGwgb3B0aW9uIGlzIGVuYWJsZWQgdXNpbmcgdGhlIEBjb2Rle3Nob3B0fSBidWlsdGluKS4KK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEJhc2hGZWF0dXJlcworU3RhcnQgYSBoaXN0b3J5IHN1YnN0aXR1dGlvbiwgZXhjZXB0IHdoZW4gZm9sbG93ZWQgYnkgYSBzcGFjZSwgdGFiLAordGhlIGVuZCBvZiB0aGUgbGluZSwgb3IgQHNhbXB7PX0uCitAZW5kIGlmY2xlYXIKKworQGl0ZW0gQGNvZGV7IUB2YXJ7bn19CitSZWZlciB0byBjb21tYW5kIGxpbmUgQHZhcntufS4KKworQGl0ZW0gQGNvZGV7IS1AdmFye259fQorUmVmZXIgdG8gdGhlIGNvbW1hbmQgQHZhcntufSBsaW5lcyBiYWNrLgorCitAaXRlbSBAY29kZXshIX0KK1JlZmVyIHRvIHRoZSBwcmV2aW91cyBjb21tYW5kLiAgVGhpcyBpcyBhIHN5bm9ueW0gZm9yIEBzYW1weyEtMX0uCisKK0BpdGVtIEBjb2RleyFAdmFye3N0cmluZ319CitSZWZlciB0byB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBzdGFydGluZyB3aXRoIEB2YXJ7c3RyaW5nfS4KKworQGl0ZW0gQGNvZGV7IT9AdmFye3N0cmluZ31bP119CitSZWZlciB0byB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBjb250YWluaW5nIEB2YXJ7c3RyaW5nfS4gIFRoZSB0cmFpbGluZworQHNhbXB7P30gbWF5IGJlIG9taXR0ZWQgaWYgdGhlIEB2YXJ7c3RyaW5nfSBpcyBmb2xsb3dlZCBpbW1lZGlhdGVseSBieQorYSBuZXdsaW5lLgorCitAaXRlbSBAY29kZXteQHZhcntzdHJpbmcxfV5AdmFye3N0cmluZzJ9Xn0KK1F1aWNrIFN1YnN0aXR1dGlvbi4gIFJlcGVhdCB0aGUgbGFzdCBjb21tYW5kLCByZXBsYWNpbmcgQHZhcntzdHJpbmcxfQord2l0aCBAdmFye3N0cmluZzJ9LiAgRXF1aXZhbGVudCB0bworQGNvZGV7ISE6cy9AdmFye3N0cmluZzF9L0B2YXJ7c3RyaW5nMn0vfS4KKworQGl0ZW0gQGNvZGV7ISN9CitUaGUgZW50aXJlIGNvbW1hbmQgbGluZSB0eXBlZCBzbyBmYXIuCisKK0BlbmQgdGFibGUKKworQG5vZGUgV29yZCBEZXNpZ25hdG9ycworQHN1YnNlY3Rpb24gV29yZCBEZXNpZ25hdG9ycworCitXb3JkIGRlc2lnbmF0b3JzIGFyZSB1c2VkIHRvIHNlbGVjdCBkZXNpcmVkIHdvcmRzIGZyb20gdGhlIGV2ZW50LgorQSBAc2FtcHs6fSBzZXBhcmF0ZXMgdGhlIGV2ZW50IHNwZWNpZmljYXRpb24gZnJvbSB0aGUgd29yZCBkZXNpZ25hdG9yLiAgSXQKK21heSBiZSBvbWl0dGVkIGlmIHRoZSB3b3JkIGRlc2lnbmF0b3IgYmVnaW5zIHdpdGggYSBAc2FtcHtefSwgQHNhbXB7JH0sCitAc2FtcHsqfSwgQHNhbXB7LX0sIG9yIEBzYW1weyV9LiAgV29yZHMgYXJlIG51bWJlcmVkIGZyb20gdGhlIGJlZ2lubmluZworb2YgdGhlIGxpbmUsIHdpdGggdGhlIGZpcnN0IHdvcmQgYmVpbmcgZGVub3RlZCBieSAwICh6ZXJvKS4gIFdvcmRzIGFyZQoraW5zZXJ0ZWQgaW50byB0aGUgY3VycmVudCBsaW5lIHNlcGFyYXRlZCBieSBzaW5nbGUgc3BhY2VzLgorCitAbmVlZCAwLjc1CitGb3IgZXhhbXBsZSwKKworQHRhYmxlIEBjb2RlCitAaXRlbSAhIQorZGVzaWduYXRlcyB0aGUgcHJlY2VkaW5nIGNvbW1hbmQuICBXaGVuIHlvdSB0eXBlIHRoaXMsIHRoZSBwcmVjZWRpbmcKK2NvbW1hbmQgaXMgcmVwZWF0ZWQgaW4gdG90by4KKworQGl0ZW0gISE6JAorZGVzaWduYXRlcyB0aGUgbGFzdCBhcmd1bWVudCBvZiB0aGUgcHJlY2VkaW5nIGNvbW1hbmQuICBUaGlzIG1heSBiZQorc2hvcnRlbmVkIHRvIEBjb2RleyEkfS4KKworQGl0ZW0gIWZpOjIKK2Rlc2lnbmF0ZXMgdGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBzdGFydGluZyB3aXRoCit0aGUgbGV0dGVycyBAY29kZXtmaX0uCitAZW5kIHRhYmxlCisKK0BuZWVkIDAuNzUKK0hlcmUgYXJlIHRoZSB3b3JkIGRlc2lnbmF0b3JzOgorIAorQHRhYmxlIEBjb2RlCisKK0BpdGVtIDAgKHplcm8pCitUaGUgQGNvZGV7MH10aCB3b3JkLiAgRm9yIG1hbnkgYXBwbGljYXRpb25zLCB0aGlzIGlzIHRoZSBjb21tYW5kIHdvcmQuCisKK0BpdGVtIEB2YXJ7bn0KK1RoZSBAdmFye259dGggd29yZC4KKworQGl0ZW0gXgorVGhlIGZpcnN0IGFyZ3VtZW50OyB0aGF0IGlzLCB3b3JkIDEuCisKK0BpdGVtICQKK1RoZSBsYXN0IGFyZ3VtZW50LgorCitAaXRlbSAlCitUaGUgd29yZCBtYXRjaGVkIGJ5IHRoZSBtb3N0IHJlY2VudCBAc2FtcHs/QHZhcntzdHJpbmd9P30gc2VhcmNoLgorCitAaXRlbSBAdmFye3h9LUB2YXJ7eX0KK0EgcmFuZ2Ugb2Ygd29yZHM7IEBzYW1wey1AdmFye3l9fSBhYmJyZXZpYXRlcyBAc2FtcHswLUB2YXJ7eX19LgorCitAaXRlbSAqCitBbGwgb2YgdGhlIHdvcmRzLCBleGNlcHQgdGhlIEBjb2RlezB9dGguICBUaGlzIGlzIGEgc3lub255bSBmb3IgQHNhbXB7MS0kfS4KK0l0IGlzIG5vdCBhbiBlcnJvciB0byB1c2UgQHNhbXB7Kn0gaWYgdGhlcmUgaXMganVzdCBvbmUgd29yZCBpbiB0aGUgZXZlbnQ7Cit0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGluIHRoYXQgY2FzZS4KKworQGl0ZW0gQHZhcnt4fSoKK0FiYnJldmlhdGVzIEBzYW1we0B2YXJ7eH0tJH0KKworQGl0ZW0gQHZhcnt4fS0KK0FiYnJldmlhdGVzIEBzYW1we0B2YXJ7eH0tJH0gbGlrZSBAc2FtcHtAdmFye3h9Kn0sIGJ1dCBvbWl0cyB0aGUgbGFzdCB3b3JkLgorCitAZW5kIHRhYmxlCisKK0lmIGEgd29yZCBkZXNpZ25hdG9yIGlzIHN1cHBsaWVkIHdpdGhvdXQgYW4gZXZlbnQgc3BlY2lmaWNhdGlvbiwgdGhlCitwcmV2aW91cyBjb21tYW5kIGlzIHVzZWQgYXMgdGhlIGV2ZW50LgorCitAbm9kZSBNb2RpZmllcnMKK0BzdWJzZWN0aW9uIE1vZGlmaWVycworCitBZnRlciB0aGUgb3B0aW9uYWwgd29yZCBkZXNpZ25hdG9yLCB5b3UgY2FuIGFkZCBhIHNlcXVlbmNlIG9mIG9uZSBvciBtb3JlCitvZiB0aGUgZm9sbG93aW5nIG1vZGlmaWVycywgZWFjaCBwcmVjZWRlZCBieSBhIEBzYW1wezp9LgorCitAdGFibGUgQGNvZGUKKworQGl0ZW0gaAorUmVtb3ZlIGEgdHJhaWxpbmcgcGF0aG5hbWUgY29tcG9uZW50LCBsZWF2aW5nIG9ubHkgdGhlIGhlYWQuCisKK0BpdGVtIHQKK1JlbW92ZSBhbGwgbGVhZGluZyAgcGF0aG5hbWUgIGNvbXBvbmVudHMsIGxlYXZpbmcgdGhlIHRhaWwuCisKK0BpdGVtIHIKK1JlbW92ZSBhIHRyYWlsaW5nIHN1ZmZpeCBvZiB0aGUgZm9ybSBAc2FtcHsuQHZhcntzdWZmaXh9fSwgbGVhdmluZwordGhlIGJhc2VuYW1lLgorCitAaXRlbSBlCitSZW1vdmUgYWxsIGJ1dCB0aGUgdHJhaWxpbmcgc3VmZml4LgorCitAaXRlbSBwCitQcmludCB0aGUgbmV3IGNvbW1hbmQgYnV0IGRvIG5vdCBleGVjdXRlIGl0LgorCitAaWZzZXQgQmFzaEZlYXR1cmVzCitAaXRlbSBxCitRdW90ZSB0aGUgc3Vic3RpdHV0ZWQgd29yZHMsIGVzY2FwaW5nIGZ1cnRoZXIgc3Vic3RpdHV0aW9ucy4KKworQGl0ZW0geAorUXVvdGUgdGhlIHN1YnN0aXR1dGVkIHdvcmRzIGFzIHdpdGggQHNhbXB7cX0sCitidXQgYnJlYWsgaW50byB3b3JkcyBhdCBzcGFjZXMsIHRhYnMsIGFuZCBuZXdsaW5lcy4KK0BlbmQgaWZzZXQKKworQGl0ZW0gcy9AdmFye29sZH0vQHZhcntuZXd9LworU3Vic3RpdHV0ZSBAdmFye25ld30gZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIEB2YXJ7b2xkfSBpbiB0aGUKK2V2ZW50IGxpbmUuICBBbnkgZGVsaW1pdGVyIG1heSBiZSB1c2VkIGluIHBsYWNlIG9mIEBzYW1wey99LgorVGhlIGRlbGltaXRlciBtYXkgYmUgcXVvdGVkIGluIEB2YXJ7b2xkfSBhbmQgQHZhcntuZXd9Cit3aXRoIGEgc2luZ2xlIGJhY2tzbGFzaC4gIElmIEBzYW1weyZ9IGFwcGVhcnMgaW4gQHZhcntuZXd9LAoraXQgaXMgcmVwbGFjZWQgYnkgQHZhcntvbGR9LiAgQSBzaW5nbGUgYmFja3NsYXNoIHdpbGwgcXVvdGUKK3RoZSBAc2FtcHsmfS4gIFRoZSBmaW5hbCBkZWxpbWl0ZXIgaXMgb3B0aW9uYWwgaWYgaXQgaXMgdGhlIGxhc3QKK2NoYXJhY3RlciBvbiB0aGUgaW5wdXQgbGluZS4KKworQGl0ZW0gJgorUmVwZWF0IHRoZSBwcmV2aW91cyBzdWJzdGl0dXRpb24uCisKK0BpdGVtIGcKK0BpdGVteCBhCitDYXVzZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgb3ZlciB0aGUgZW50aXJlIGV2ZW50IGxpbmUuICBVc2VkIGluCitjb25qdW5jdGlvbiB3aXRoIEBzYW1we3N9LCBhcyBpbiBAY29kZXtncy9AdmFye29sZH0vQHZhcntuZXd9L30sCitvciB3aXRoIEBzYW1weyZ9LgorCitAaXRlbSBHCitBcHBseSB0aGUgZm9sbG93aW5nIEBzYW1we3N9IG1vZGlmaWVyIG9uY2UgdG8gZWFjaCB3b3JkIGluIHRoZSBldmVudC4KKworQGVuZCB0YWJsZQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL3JlYWRsaW5lLnBkZiBiL3JlYWRsaW5lL2RvYy9yZWFkbGluZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjMmRmZQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRsaW5lL2RvYy9yZWFkbGluZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL3JsbWFuLnRleGkgYi9yZWFkbGluZS9kb2MvcmxtYW4udGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODM0YjU4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZG9jL3JsbWFuLnRleGkKQEAgLTAsMCArMSwxMDEgQEAKK1xpbnB1dCB0ZXhpbmZvICAgIEBjIC0qLXRleGluZm8tKi0KK0Bjb21tZW50ICUqKnN0YXJ0IG9mIGhlYWRlciAoVGhpcyBpcyBmb3IgcnVubmluZyBUZXhpbmZvIG9uIGEgcmVnaW9uLikKK0BzZXRmaWxlbmFtZSByZWFkbGluZS5pbmZvCitAc2V0dGl0bGUgR05VIFJlYWRsaW5lIExpYnJhcnkKK0Bjb21tZW50ICUqKmVuZCBvZiBoZWFkZXIgKFRoaXMgaXMgZm9yIHJ1bm5pbmcgVGV4aW5mbyBvbiBhIHJlZ2lvbi4pCitAc3luaW5kZXggdnIgZm4KK0BzZXRjaGFwdGVybmV3cGFnZSBvZGQKKworQGluY2x1ZGUgdmVyc2lvbi50ZXhpCisKK0Bjb3B5aW5nCitUaGlzIG1hbnVhbCBkZXNjcmliZXMgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5CisodmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0sIEB2YWx1ZXtVUERBVEVEfSksIGEgbGlicmFyeSB3aGljaCBhaWRzIGluIHRoZQorY29uc2lzdGVuY3kgb2YgdXNlciBpbnRlcmZhY2UgYWNyb3NzIGRpc2NyZXRlIHByb2dyYW1zIHdoaWNoIHByb3ZpZGUKK2EgY29tbWFuZCBsaW5lIGludGVyZmFjZS4KKworQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTg4LTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworQHF1b3RhdGlvbgorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIGRvY3VtZW50Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbiAxLjEgb3IKK2FueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3aXRoIG5vCitJbnZhcmlhbnQgU2VjdGlvbnMsIHdpdGggdGhlIEZyb250LUNvdmVyIHRleHRzIGJlaW5nIGBgQSBHTlUgTWFudWFsLCcnCithbmQgd2l0aCB0aGUgQmFjay1Db3ZlciBUZXh0cyBhcyBpbiAoYSkgYmVsb3cuICBBIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMKK2luY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGVudGl0bGVkIGBgR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlLicnCisKKyhhKSBUaGUgRlNGJ3MgQmFjay1Db3ZlciBUZXh0IGlzOiBgYFlvdSBoYXZlIGZyZWVkb20gdG8gY29weSBhbmQgbW9kaWZ5Cit0aGlzIEdOVSBNYW51YWwsIGxpa2UgR05VIHNvZnR3YXJlLiAgQ29waWVzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiByYWlzZSBmdW5kcyBmb3IgR05VIGRldmVsb3BtZW50LicnCitAZW5kIHF1b3RhdGlvbgorQGVuZCBjb3B5aW5nCisKK0BkaXJjYXRlZ29yeSBMaWJyYXJpZXMKK0BkaXJlbnRyeQorKiBSZWFkbGluZTogKHJlYWRsaW5lKS4gICAgICAgVGhlIEdOVSByZWFkbGluZSBsaWJyYXJ5IEFQSS4KK0BlbmQgZGlyZW50cnkKKworQHRpdGxlcGFnZSAgCitAdGl0bGUgR05VIFJlYWRsaW5lIExpYnJhcnkKK0BzdWJ0aXRsZSBFZGl0aW9uIEB2YWx1ZXtFRElUSU9OfSwgZm9yIEBjb2Rle1JlYWRsaW5lIExpYnJhcnl9IFZlcnNpb24gQHZhbHVle1ZFUlNJT059LgorQHN1YnRpdGxlIEB2YWx1ZXtVUERBVEVELU1PTlRIfQorQGF1dGhvciBDaGV0IFJhbWV5LCBDYXNlIFdlc3Rlcm4gUmVzZXJ2ZSBVbml2ZXJzaXR5CitAYXV0aG9yIEJyaWFuIEZveCwgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK0BwYWdlCitAdnNraXAgMHB0IHBsdXMgMWZpbGxsCitAaW5zZXJ0Y29weWluZworCitAc3AgMQorUHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gQCoKKzU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBAKgorQm9zdG9uLCBNQSAwMjExMS0xMzA3IEAqCitVU0EgQCoKKworQGVuZCB0aXRsZXBhZ2UKKworQGNvbnRlbnRzCisKK0BpZm5vdHRleAorQG5vZGUgVG9wCitAdG9wIEdOVSBSZWFkbGluZSBMaWJyYXJ5CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSwgYSB1dGlsaXR5IHdoaWNoIGFpZHMKK2luIHRoZSBjb25zaXN0ZW5jeSBvZiB1c2VyIGludGVyZmFjZSBhY3Jvc3MgZGlzY3JldGUgcHJvZ3JhbXMgd2hpY2gKK3Byb3ZpZGUgYSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgorCitAbWVudQorKiBDb21tYW5kIExpbmUgRWRpdGluZzo6CSAgIEdOVSBSZWFkbGluZSBVc2VyJ3MgTWFudWFsLgorKiBQcm9ncmFtbWluZyB3aXRoIEdOVSBSZWFkbGluZTo6ICBHTlUgUmVhZGxpbmUgUHJvZ3JhbW1lcidzIE1hbnVhbC4KKyogQ29weWluZyBUaGlzIE1hbnVhbDo6CQkgICBDb3B5aW5nIHRoaXMgbWFudWFsLgorKiBDb25jZXB0IEluZGV4OjoJCSAgIEluZGV4IG9mIGNvbmNlcHRzIGRlc2NyaWJlZCBpbiB0aGlzIG1hbnVhbC4KKyogRnVuY3Rpb24gYW5kIFZhcmlhYmxlIEluZGV4OjoJICAgSW5kZXggb2YgZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9ucworCQkJCSAgIGFuZCB2YXJpYWJsZXMuCitAZW5kIG1lbnUKK0BlbmQgaWZub3R0ZXgKKworQGluY2x1ZGUgcmx1c2VyLnRleGkKK0BpbmNsdWRlIHJsdGVjaC50ZXhpCisKK0Bub2RlIENvcHlpbmcgVGhpcyBNYW51YWwKK0BhcHBlbmRpeCBDb3B5aW5nIFRoaXMgTWFudWFsCisKK0BtZW51CisqIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZTo6CUxpY2Vuc2UgZm9yIGNvcHlpbmcgdGhpcyBtYW51YWwuCitAZW5kIG1lbnUKKworQGluY2x1ZGUgZmRsLnRleGkKKworQG5vZGUgQ29uY2VwdCBJbmRleAorQHVubnVtYmVyZWQgQ29uY2VwdCBJbmRleAorQHByaW50aW5kZXggY3AKKworQG5vZGUgRnVuY3Rpb24gYW5kIFZhcmlhYmxlIEluZGV4CitAdW5udW1iZXJlZCBGdW5jdGlvbiBhbmQgVmFyaWFibGUgSW5kZXgKK0BwcmludGluZGV4IGZuCisKK0BieWUKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2RvYy9ybHRlY2gudGV4aSBiL3JlYWRsaW5lL2RvYy9ybHRlY2gudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjJlMmVlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZG9jL3JsdGVjaC50ZXhpCkBAIC0wLDAgKzEsMjI4NSBAQAorQGNvbW1lbnQgJSoqc3RhcnQgb2YgaGVhZGVyIChUaGlzIGlzIGZvciBydW5uaW5nIFRleGluZm8gb24gYSByZWdpb24uKQorQHNldGZpbGVuYW1lIHJsdGVjaC5pbmZvCitAY29tbWVudCAlKiplbmQgb2YgaGVhZGVyIChUaGlzIGlzIGZvciBydW5uaW5nIFRleGluZm8gb24gYSByZWdpb24uKQorQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAorCitAaWZpbmZvCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgdXRpbGl0eSBmb3IgYWlkaW5nCitpbiB0aGUgY29uc2lzdGVuY3kgb2YgdXNlciBpbnRlcmZhY2UgYWNyb3NzIGRpc2NyZXRlIHByb2dyYW1zIHRoYXQgbmVlZAordG8gcHJvdmlkZSBhIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UuCisKK0NvcHlyaWdodCAoQykgMTk4OC0yMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCitwYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitAaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAorKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgorQGVuZCBpZ25vcmUKKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKK3Jlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKK2V4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCitieSB0aGUgRm91bmRhdGlvbi4KK0BlbmQgaWZpbmZvCisKK0Bub2RlIFByb2dyYW1taW5nIHdpdGggR05VIFJlYWRsaW5lCitAY2hhcHRlciBQcm9ncmFtbWluZyB3aXRoIEdOVSBSZWFkbGluZQorCitUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgQHNje2dudX0gUmVhZGxpbmUgTGlicmFyeSBhbmQKK290aGVyIHByb2dyYW1zLiAgSWYgeW91IGFyZSBhIHByb2dyYW1tZXIsIGFuZCB5b3Ugd2lzaCB0byBpbmNsdWRlIHRoZQorZmVhdHVyZXMgZm91bmQgaW4gQHNje2dudX0gUmVhZGxpbmUKK3N1Y2ggYXMgY29tcGxldGlvbiwgbGluZSBlZGl0aW5nLCBhbmQgaW50ZXJhY3RpdmUgaGlzdG9yeSBtYW5pcHVsYXRpb24KK2luIHlvdXIgb3duIHByb2dyYW1zLCB0aGlzIHNlY3Rpb24gaXMgZm9yIHlvdS4KKworQG1lbnUKKyogQmFzaWMgQmVoYXZpb3I6OglVc2luZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBSZWFkbGluZS4KKyogQ3VzdG9tIEZ1bmN0aW9uczo6CUFkZGluZyB5b3VyIG93biBmdW5jdGlvbnMgdG8gUmVhZGxpbmUuCisqIFJlYWRsaW5lIFZhcmlhYmxlczo6CQkJVmFyaWFibGVzIGFjY2Vzc2libGUgdG8gY3VzdG9tCisJCQkJCWZ1bmN0aW9ucy4KKyogUmVhZGxpbmUgQ29udmVuaWVuY2UgRnVuY3Rpb25zOjoJRnVuY3Rpb25zIHdoaWNoIFJlYWRsaW5lIHN1cHBsaWVzIHRvCisJCQkJCWFpZCBpbiB3cml0aW5nIHlvdXIgb3duIGN1c3RvbQorCQkJCQlmdW5jdGlvbnMuCisqIFJlYWRsaW5lIFNpZ25hbCBIYW5kbGluZzo6CUhvdyBSZWFkbGluZSBiZWhhdmVzIHdoZW4gaXQgcmVjZWl2ZXMgc2lnbmFscy4KKyogQ3VzdG9tIENvbXBsZXRlcnM6OglTdXBwbGFudGluZyBvciBzdXBwbGVtZW50aW5nIFJlYWRsaW5lJ3MKKwkJCWNvbXBsZXRpb24gZnVuY3Rpb25zLgorQGVuZCBtZW51CisKK0Bub2RlIEJhc2ljIEJlaGF2aW9yCitAc2VjdGlvbiBCYXNpYyBCZWhhdmlvcgorCitNYW55IHByb2dyYW1zIHByb3ZpZGUgYSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLCBzdWNoIGFzIEBjb2Rle21haWx9LAorQGNvZGV7ZnRwfSwgYW5kIEBjb2Rle3NofS4gIEZvciBzdWNoIHByb2dyYW1zLCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YKK1JlYWRsaW5lIGlzIHN1ZmZpY2llbnQuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGhvdyB0byB1c2UgUmVhZGxpbmUgaW4KK3RoZSBzaW1wbGVzdCB3YXkgcG9zc2libGUsIHBlcmhhcHMgdG8gcmVwbGFjZSBjYWxscyBpbiB5b3VyIGNvZGUgdG8KK0Bjb2Rle2dldHMoKX0gb3IgQGNvZGV7ZmdldHMoKX0uCisKK0BmaW5kZXggcmVhZGxpbmUKK0BjaW5kZXggcmVhZGxpbmUsIGZ1bmN0aW9uCisKK1RoZSBmdW5jdGlvbiBAY29kZXtyZWFkbGluZSgpfSBwcmludHMgYSBwcm9tcHQgQHZhcntwcm9tcHR9CithbmQgdGhlbiByZWFkcyBhbmQgcmV0dXJucyBhIHNpbmdsZSBsaW5lIG9mIHRleHQgZnJvbSB0aGUgdXNlci4KK0lmIEB2YXJ7cHJvbXB0fSBpcyBAY29kZXtOVUxMfSBvciB0aGUgZW1wdHkgc3RyaW5nLCBubyBwcm9tcHQgaXMgZGlzcGxheWVkLgorVGhlIGxpbmUgQGNvZGV7cmVhZGxpbmV9IHJldHVybnMgaXMgYWxsb2NhdGVkIHdpdGggQGNvZGV7bWFsbG9jKCl9OwordGhlIGNhbGxlciBzaG91bGQgQGNvZGV7ZnJlZSgpfSB0aGUgbGluZSB3aGVuIGl0IGhhcyBmaW5pc2hlZCB3aXRoIGl0LgorVGhlIGRlY2xhcmF0aW9uIGZvciBAY29kZXtyZWFkbGluZX0gaW4gQU5TSSBDIGlzCisKK0BleGFtcGxlCitAY29kZXtjaGFyICpyZWFkbGluZSAoY29uc3QgY2hhciAqQHZhcntwcm9tcHR9KTt9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitTbywgb25lIG1pZ2h0IHNheQorQGV4YW1wbGUKK0Bjb2Rle2NoYXIgKmxpbmUgPSByZWFkbGluZSAoIkVudGVyIGEgbGluZTogIik7fQorQGVuZCBleGFtcGxlCitAbm9pbmRlbnQKK2luIG9yZGVyIHRvIHJlYWQgYSBsaW5lIG9mIHRleHQgZnJvbSB0aGUgdXNlci4KK1RoZSBsaW5lIHJldHVybmVkIGhhcyB0aGUgZmluYWwgbmV3bGluZSByZW1vdmVkLCBzbyBvbmx5IHRoZQordGV4dCByZW1haW5zLgorCitJZiBAY29kZXtyZWFkbGluZX0gZW5jb3VudGVycyBhbiBAY29kZXtFT0Z9IHdoaWxlIHJlYWRpbmcgdGhlIGxpbmUsIGFuZCB0aGUKK2xpbmUgaXMgZW1wdHkgYXQgdGhhdCBwb2ludCwgdGhlbiBAY29kZXsoY2hhciAqKU5VTEx9IGlzIHJldHVybmVkLgorT3RoZXJ3aXNlLCB0aGUgbGluZSBpcyBlbmRlZCBqdXN0IGFzIGlmIGEgbmV3bGluZSBoYWQgYmVlbiB0eXBlZC4KKworSWYgeW91IHdhbnQgdGhlIHVzZXIgdG8gYmUgYWJsZSB0byBnZXQgYXQgdGhlIGxpbmUgbGF0ZXIsICh3aXRoCitAa2V5e0MtcH0gZm9yIGV4YW1wbGUpLCB5b3UgbXVzdCBjYWxsIEBjb2Rle2FkZF9oaXN0b3J5KCl9IHRvIHNhdmUgdGhlCitsaW5lIGF3YXkgaW4gYSBAZGZue2hpc3Rvcnl9IGxpc3Qgb2Ygc3VjaCBsaW5lcy4KKworQGV4YW1wbGUKK0Bjb2Rle2FkZF9oaXN0b3J5IChsaW5lKX07CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitGb3IgZnVsbCBkZXRhaWxzIG9uIHRoZSBHTlUgSGlzdG9yeSBMaWJyYXJ5LCBzZWUgdGhlIGFzc29jaWF0ZWQgbWFudWFsLgorCitJdCBpcyBwcmVmZXJhYmxlIHRvIGF2b2lkIHNhdmluZyBlbXB0eSBsaW5lcyBvbiB0aGUgaGlzdG9yeSBsaXN0LCBzaW5jZQordXNlcnMgcmFyZWx5IGhhdmUgYSBidXJuaW5nIG5lZWQgdG8gcmV1c2UgYSBibGFuayBsaW5lLiAgSGVyZSBpcworYSBmdW5jdGlvbiB3aGljaCB1c2VmdWxseSByZXBsYWNlcyB0aGUgc3RhbmRhcmQgQGNvZGV7Z2V0cygpfSBsaWJyYXJ5CitmdW5jdGlvbiwgYW5kIGhhcyB0aGUgYWR2YW50YWdlIG9mIG5vIHN0YXRpYyBidWZmZXIgdG8gb3ZlcmZsb3c6CisKK0BleGFtcGxlCisvKiBBIHN0YXRpYyB2YXJpYWJsZSBmb3IgaG9sZGluZyB0aGUgbGluZS4gKi8KK3N0YXRpYyBjaGFyICpsaW5lX3JlYWQgPSAoY2hhciAqKU5VTEw7CisKKy8qIFJlYWQgYSBzdHJpbmcsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgorICAgUmV0dXJucyBOVUxMIG9uIEVPRi4gKi8KK2NoYXIgKgorcmxfZ2V0cyAoKQorQHsKKyAgLyogSWYgdGhlIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwKKyAgICAgcmV0dXJuIHRoZSBtZW1vcnkgdG8gdGhlIGZyZWUgcG9vbC4gKi8KKyAgaWYgKGxpbmVfcmVhZCkKKyAgICBAeworICAgICAgZnJlZSAobGluZV9yZWFkKTsKKyAgICAgIGxpbmVfcmVhZCA9IChjaGFyICopTlVMTDsKKyAgICBAfQorCisgIC8qIEdldCBhIGxpbmUgZnJvbSB0aGUgdXNlci4gKi8KKyAgbGluZV9yZWFkID0gcmVhZGxpbmUgKCIiKTsKKworICAvKiBJZiB0aGUgbGluZSBoYXMgYW55IHRleHQgaW4gaXQsCisgICAgIHNhdmUgaXQgb24gdGhlIGhpc3RvcnkuICovCisgIGlmIChsaW5lX3JlYWQgJiYgKmxpbmVfcmVhZCkKKyAgICBhZGRfaGlzdG9yeSAobGluZV9yZWFkKTsKKworICByZXR1cm4gKGxpbmVfcmVhZCk7CitAfQorQGVuZCBleGFtcGxlCisKK1RoaXMgZnVuY3Rpb24gZ2l2ZXMgdGhlIHVzZXIgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIEBrZXl7VEFCfQorY29tcGxldGlvbjogY29tcGxldGlvbiBvbiBmaWxlIG5hbWVzLiAgSWYgeW91IGRvIG5vdCB3YW50IFJlYWRsaW5lIHRvCitjb21wbGV0ZSBvbiBmaWxlbmFtZXMsIHlvdSBjYW4gY2hhbmdlIHRoZSBiaW5kaW5nIG9mIHRoZSBAa2V5e1RBQn0ga2V5Cit3aXRoIEBjb2Rle3JsX2JpbmRfa2V5KCl9LgorCitAZXhhbXBsZQorQGNvZGV7aW50IHJsX2JpbmRfa2V5IChpbnQgQHZhcntrZXl9LCBybF9jb21tYW5kX2Z1bmNfdCAqQHZhcntmdW5jdGlvbn0pO30KK0BlbmQgZXhhbXBsZQorCitAY29kZXtybF9iaW5kX2tleSgpfSB0YWtlcyB0d28gYXJndW1lbnRzOiBAdmFye2tleX0gaXMgdGhlIGNoYXJhY3RlciB0aGF0Cit5b3Ugd2FudCB0byBiaW5kLCBhbmQgQHZhcntmdW5jdGlvbn0gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIHRvCitjYWxsIHdoZW4gQHZhcntrZXl9IGlzIHByZXNzZWQuICBCaW5kaW5nIEBrZXl7VEFCfSB0byBAY29kZXtybF9pbnNlcnQoKX0KK21ha2VzIEBrZXl7VEFCfSBpbnNlcnQgaXRzZWxmLgorQGNvZGV7cmxfYmluZF9rZXkoKX0gcmV0dXJucyBub24temVybyBpZiBAdmFye2tleX0gaXMgbm90IGEgdmFsaWQKK0FTQ0lJIGNoYXJhY3RlciBjb2RlIChiZXR3ZWVuIDAgYW5kIDI1NSkuCisKK1RodXMsIHRvIGRpc2FibGUgdGhlIGRlZmF1bHQgQGtleXtUQUJ9IGJlaGF2aW9yLCB0aGUgZm9sbG93aW5nIHN1ZmZpY2VzOgorQGV4YW1wbGUKK0Bjb2Rle3JsX2JpbmRfa2V5ICgnXHQnLCBybF9pbnNlcnQpO30KK0BlbmQgZXhhbXBsZQorCitUaGlzIGNvZGUgc2hvdWxkIGJlIGV4ZWN1dGVkIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIHlvdXIgcHJvZ3JhbTsgeW91CittaWdodCB3cml0ZSBhIGZ1bmN0aW9uIGNhbGxlZCBAY29kZXtpbml0aWFsaXplX3JlYWRsaW5lKCl9IHdoaWNoCitwZXJmb3JtcyB0aGlzIGFuZCBvdGhlciBkZXNpcmVkIGluaXRpYWxpemF0aW9ucywgc3VjaCBhcyBpbnN0YWxsaW5nCitjdXN0b20gY29tcGxldGVycyAoQHB4cmVme0N1c3RvbSBDb21wbGV0ZXJzfSkuCisKK0Bub2RlIEN1c3RvbSBGdW5jdGlvbnMKK0BzZWN0aW9uIEN1c3RvbSBGdW5jdGlvbnMKKworUmVhZGxpbmUgcHJvdmlkZXMgbWFueSBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgdGV4dCBvZgordGhlIGxpbmUsIGJ1dCBpdCBpc24ndCBwb3NzaWJsZSB0byBhbnRpY2lwYXRlIHRoZSBuZWVkcyBvZiBhbGwKK3Byb2dyYW1zLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgdmFyaW91cyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcworZGVmaW5lZCB3aXRoaW4gdGhlIFJlYWRsaW5lIGxpYnJhcnkgd2hpY2ggYWxsb3cgYSB1c2VyIHByb2dyYW0gdG8gYWRkCitjdXN0b21pemVkIGZ1bmN0aW9uYWxpdHkgdG8gUmVhZGxpbmUuCisKK0JlZm9yZSBkZWNsYXJpbmcgYW55IGZ1bmN0aW9ucyB0aGF0IGN1c3RvbWl6ZSBSZWFkbGluZSdzIGJlaGF2aW9yLCBvcgordXNpbmcgYW55IGZ1bmN0aW9uYWxpdHkgUmVhZGxpbmUgcHJvdmlkZXMgaW4gb3RoZXIgY29kZSwgYW4KK2FwcGxpY2F0aW9uIHdyaXRlciBzaG91bGQgaW5jbHVkZSB0aGUgZmlsZSBAY29kZXs8cmVhZGxpbmUvcmVhZGxpbmUuaD59CitpbiBhbnkgZmlsZSB0aGF0IHVzZXMgUmVhZGxpbmUncyBmZWF0dXJlcy4gIFNpbmNlIHNvbWUgb2YgdGhlIGRlZmluaXRpb25zCitpbiBAY29kZXtyZWFkbGluZS5ofSB1c2UgdGhlIEBjb2Rle3N0ZGlvfSBsaWJyYXJ5LCB0aGUgZmlsZQorQGNvZGV7PHN0ZGlvLmg+fSBzaG91bGQgYmUgaW5jbHVkZWQgYmVmb3JlIEBjb2Rle3JlYWRsaW5lLmh9LgorCitAY29kZXtyZWFkbGluZS5ofSBkZWZpbmVzIGEgQyBwcmVwcm9jZXNzb3IgdmFyaWFibGUgdGhhdCBzaG91bGQKK2JlIHRyZWF0ZWQgYXMgYW4gaW50ZWdlciwgQGNvZGV7UkxfUkVBRExJTkVfVkVSU0lPTn0sIHdoaWNoIG1heQorYmUgdXNlZCB0byBjb25kaXRpb25hbGx5IGNvbXBpbGUgYXBwbGljYXRpb24gY29kZSBkZXBlbmRpbmcgb24KK3RoZSBpbnN0YWxsZWQgUmVhZGxpbmUgdmVyc2lvbi4gIFRoZSB2YWx1ZSBpcyBhIGhleGFkZWNpbWFsCitlbmNvZGluZyBvZiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgbGlicmFyeSwKK29mIHRoZSBmb3JtIDB4QHZhcntNTW1tfS4gIEB2YXJ7TU19IGlzIHRoZSB0d28tZGlnaXQgbWFqb3IKK3ZlcnNpb24gbnVtYmVyOyBAdmFye21tfSBpcyB0aGUgdHdvLWRpZ2l0IG1pbm9yIHZlcnNpb24gbnVtYmVyLiAKK0ZvciBSZWFkbGluZSA0LjIsIGZvciBleGFtcGxlLCB0aGUgdmFsdWUgb2YKK0Bjb2Rle1JMX1JFQURMSU5FX1ZFUlNJT059IHdvdWxkIGJlIEBjb2RlezB4MDQwMn0uIAorCitAbWVudQorKiBSZWFkbGluZSBUeXBlZGVmczo6CUMgZGVjbGFyYXRpb25zIHRvIG1ha2UgY29kZSByZWFkYWJsZS4KKyogRnVuY3Rpb24gV3JpdGluZzo6CVZhcmlhYmxlcyBhbmQgY2FsbGluZyBjb252ZW50aW9ucy4KK0BlbmQgbWVudQorCitAbm9kZSBSZWFkbGluZSBUeXBlZGVmcworQHN1YnNlY3Rpb24gUmVhZGxpbmUgVHlwZWRlZnMKKworRm9yIHJlYWRhYmlsdHksIHdlIGRlY2xhcmUgYSBudW1iZXIgb2YgbmV3IG9iamVjdCB0eXBlcywgYWxsIHBvaW50ZXJzCit0byBmdW5jdGlvbnMuCisKK1RoZSByZWFzb24gZm9yIGRlY2xhcmluZyB0aGVzZSBuZXcgdHlwZXMgaXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd3JpdGUKK2NvZGUgZGVzY3JpYmluZyBwb2ludGVycyB0byBDIGZ1bmN0aW9ucyB3aXRoIGFwcHJvcHJpYXRlbHkgcHJvdG90eXBlZAorYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWVzLgorCitGb3IgaW5zdGFuY2UsIHNheSB3ZSB3YW50IHRvIGRlY2xhcmUgYSB2YXJpYWJsZSBAdmFye2Z1bmN9IGFzIGEgcG9pbnRlcgordG8gYSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0d28gQGNvZGV7aW50fSBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4KK0Bjb2Rle2ludH0gKHRoaXMgaXMgdGhlIHR5cGUgb2YgYWxsIG9mIHRoZSBSZWFkbGluZSBiaW5kYWJsZSBmdW5jdGlvbnMpLgorSW5zdGVhZCBvZiB0aGUgY2xhc3NpYyBDIGRlY2xhcmF0aW9uCisKK0Bjb2Rle2ludCAoKmZ1bmMpKCk7fQorCitAbm9pbmRlbnQKK29yIHRoZSBBTlNJLUMgc3R5bGUgZGVjbGFyYXRpb24KKworQGNvZGV7aW50ICgqZnVuYykoaW50LCBpbnQpO30KKworQG5vaW5kZW50Cit3ZSBtYXkgd3JpdGUKKworQGNvZGV7cmxfY29tbWFuZF9mdW5jX3QgKmZ1bmM7fQorCitUaGUgZnVsbCBsaXN0IG9mIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZXMgYXZhaWxhYmxlIGlzCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gdHlwZWRlZiBpbnQgcmxfY29tbWFuZF9mdW5jX3QgKGludCwgaW50KTsKKworQGl0ZW0gdHlwZWRlZiBjaGFyICpybF9jb21wZW50cnlfZnVuY190IChjb25zdCBjaGFyICosIGludCk7CisKK0BpdGVtIHR5cGVkZWYgY2hhciAqKnJsX2NvbXBsZXRpb25fZnVuY190IChjb25zdCBjaGFyICosIGludCwgaW50KTsKKworQGl0ZW0gdHlwZWRlZiBjaGFyICpybF9xdW90ZV9mdW5jX3QgKGNoYXIgKiwgaW50LCBjaGFyICopOworCitAaXRlbSB0eXBlZGVmIGNoYXIgKnJsX2RlcXVvdGVfZnVuY190IChjaGFyICosIGludCk7CisKK0BpdGVtIHR5cGVkZWYgaW50IHJsX2NvbXBpZ25vcmVfZnVuY190IChjaGFyICoqKTsKKworQGl0ZW0gdHlwZWRlZiB2b2lkIHJsX2NvbXBkaXNwX2Z1bmNfdCAoY2hhciAqKiwgaW50LCBpbnQpOworCitAaXRlbSB0eXBlZGVmIGludCBybF9ob29rX2Z1bmNfdCAodm9pZCk7CisKK0BpdGVtIHR5cGVkZWYgaW50IHJsX2dldGNfZnVuY190IChGSUxFICopOworCitAaXRlbSB0eXBlZGVmIGludCBybF9saW5lYnVmX2Z1bmNfdCAoY2hhciAqLCBpbnQpOworCitAaXRlbSB0eXBlZGVmIGludCBybF9pbnRmdW5jX3QgKGludCk7CitAaXRlbSAjZGVmaW5lIHJsX2l2b2lkZnVuY190IHJsX2hvb2tfZnVuY190CitAaXRlbSB0eXBlZGVmIGludCBybF9pY3BmdW5jX3QgKGNoYXIgKik7CitAaXRlbSB0eXBlZGVmIGludCBybF9pY3BwZnVuY190IChjaGFyICoqKTsKKworQGl0ZW0gdHlwZWRlZiB2b2lkIHJsX3ZvaWRmdW5jX3QgKHZvaWQpOworQGl0ZW0gdHlwZWRlZiB2b2lkIHJsX3ZpbnRmdW5jX3QgKGludCk7CitAaXRlbSB0eXBlZGVmIHZvaWQgcmxfdmNwZnVuY190IChjaGFyICopOworQGl0ZW0gdHlwZWRlZiB2b2lkIHJsX3ZjcHBmdW5jX3QgKGNoYXIgKiopOworCitAZW5kIHRhYmxlCisKK0Bub2RlIEZ1bmN0aW9uIFdyaXRpbmcKK0BzdWJzZWN0aW9uIFdyaXRpbmcgYSBOZXcgRnVuY3Rpb24KKworSW4gb3JkZXIgdG8gd3JpdGUgbmV3IGZ1bmN0aW9ucyBmb3IgUmVhZGxpbmUsIHlvdSBuZWVkIHRvIGtub3cgdGhlCitjYWxsaW5nIGNvbnZlbnRpb25zIGZvciBrZXlib2FyZC1pbnZva2VkIGZ1bmN0aW9ucywgYW5kIHRoZSBuYW1lcyBvZiB0aGUKK3ZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBsaW5lIHJlYWQgc28gZmFyLgorCitUaGUgY2FsbGluZyBzZXF1ZW5jZSBmb3IgYSBjb21tYW5kIEBjb2Rle2Zvb30gbG9va3MgbGlrZQorCitAZXhhbXBsZQorQGNvZGV7aW50IGZvbyAoaW50IGNvdW50LCBpbnQga2V5KX0KK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK3doZXJlIEB2YXJ7Y291bnR9IGlzIHRoZSBudW1lcmljIGFyZ3VtZW50IChvciAxIGlmIGRlZmF1bHRlZCkgYW5kCitAdmFye2tleX0gaXMgdGhlIGtleSB0aGF0IGludm9rZWQgdGhpcyBmdW5jdGlvbi4KKworSXQgaXMgY29tcGxldGVseSB1cCB0byB0aGUgZnVuY3Rpb24gYXMgdG8gd2hhdCBzaG91bGQgYmUgZG9uZSB3aXRoIHRoZQorbnVtZXJpYyBhcmd1bWVudC4gIFNvbWUgZnVuY3Rpb25zIHVzZSBpdCBhcyBhIHJlcGVhdCBjb3VudCwgc29tZQorYXMgYSBmbGFnLCBhbmQgb3RoZXJzIHRvIGNob29zZSBhbHRlcm5hdGUgYmVoYXZpb3IgKHJlZnJlc2hpbmcgdGhlIGN1cnJlbnQKK2xpbmUgYXMgb3Bwb3NlZCB0byByZWZyZXNoaW5nIHRoZSBzY3JlZW4sIGZvciBleGFtcGxlKS4gIFNvbWUgY2hvb3NlIHRvCitpZ25vcmUgaXQuICBJbiBnZW5lcmFsLCBpZiBhCitmdW5jdGlvbiB1c2VzIHRoZSBudW1lcmljIGFyZ3VtZW50IGFzIGEgcmVwZWF0IGNvdW50LCBpdCBzaG91bGQgYmUgYWJsZQordG8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIGJvdGggbmVnYXRpdmUgYW5kIHBvc2l0aXZlIGFyZ3VtZW50cy4KK0F0IHRoZSB2ZXJ5IGxlYXN0LCBpdCBzaG91bGQgYmUgYXdhcmUgdGhhdCBpdCBjYW4gYmUgcGFzc2VkIGEKK25lZ2F0aXZlIGFyZ3VtZW50LgorCitBIGNvbW1hbmQgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAwIGlmIGl0cyBhY3Rpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwKK2FuZCBhIG5vbi16ZXJvIHZhbHVlIGlmIHNvbWUgZXJyb3Igb2NjdXJzLgorVGhpcyBpcyB0aGUgY29udmVudGlvbiBvYmV5ZWQgYnkgYWxsIG9mIHRoZSBidWlsdGluIFJlYWRsaW5lIGJpbmRhYmxlCitjb21tYW5kIGZ1bmN0aW9ucy4KKworQG5vZGUgUmVhZGxpbmUgVmFyaWFibGVzCitAc2VjdGlvbiBSZWFkbGluZSBWYXJpYWJsZXMKKworVGhlc2UgdmFyaWFibGVzIGFyZSBhdmFpbGFibGUgdG8gZnVuY3Rpb24gd3JpdGVycy4KKworQGRlZnR5cGV2YXIge2NoYXIgKn0gcmxfbGluZV9idWZmZXIKK1RoaXMgaXMgdGhlIGxpbmUgZ2F0aGVyZWQgc28gZmFyLiAgWW91IGFyZSB3ZWxjb21lIHRvIG1vZGlmeSB0aGUKK2NvbnRlbnRzIG9mIHRoZSBsaW5lLCBidXQgc2VlIEByZWZ7QWxsb3dpbmcgVW5kb2luZ30uICBUaGUKK2Z1bmN0aW9uIEBjb2Rle3JsX2V4dGVuZF9saW5lX2J1ZmZlcn0gaXMgYXZhaWxhYmxlIHRvIGluY3JlYXNlCit0aGUgbWVtb3J5IGFsbG9jYXRlZCB0byBAY29kZXtybF9saW5lX2J1ZmZlcn0uCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgaW50IHJsX3BvaW50CitUaGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpbiBAY29kZXtybF9saW5lX2J1ZmZlcn0KKyh0aGUgQGVtcGh7cG9pbnR9KS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgcmxfZW5kCitUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJlc2VudCBpbiBAY29kZXtybF9saW5lX2J1ZmZlcn0uICBXaGVuCitAY29kZXtybF9wb2ludH0gaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgQGNvZGV7cmxfcG9pbnR9IGFuZAorQGNvZGV7cmxfZW5kfSBhcmUgZXF1YWwuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgaW50IHJsX21hcmsKK1RoZSBAdmFye21hcmt9IChzYXZlZCBwb3NpdGlvbikgaW4gdGhlIGN1cnJlbnQgbGluZS4gIElmIHNldCwgdGhlIG1hcmsKK2FuZCBwb2ludCBkZWZpbmUgYSBAZW1waHtyZWdpb259LgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIGludCBybF9kb25lCitTZXR0aW5nIHRoaXMgdG8gYSBub24temVybyB2YWx1ZSBjYXVzZXMgUmVhZGxpbmUgdG8gcmV0dXJuIHRoZSBjdXJyZW50CitsaW5lIGltbWVkaWF0ZWx5LgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIGludCBybF9udW1fY2hhcnNfdG9fcmVhZAorU2V0dGluZyB0aGlzIHRvIGEgcG9zaXRpdmUgdmFsdWUgYmVmb3JlIGNhbGxpbmcgQGNvZGV7cmVhZGxpbmUoKX0gY2F1c2VzCitSZWFkbGluZSB0byByZXR1cm4gYWZ0ZXIgYWNjZXB0aW5nIHRoYXQgbWFueSBjaGFyYWN0ZXJzLCByYXRoZXIKK3RoYW4gcmVhZGluZyB1cCB0byBhIGNoYXJhY3RlciBib3VuZCB0byBAY29kZXthY2NlcHQtbGluZX0uCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgaW50IHJsX3BlbmRpbmdfaW5wdXQKK1NldHRpbmcgdGhpcyB0byBhIHZhbHVlIG1ha2VzIGl0IHRoZSBuZXh0IGtleXN0cm9rZSByZWFkLiAgVGhpcyBpcyBhCit3YXkgdG8gc3R1ZmYgYSBzaW5nbGUgY2hhcmFjdGVyIGludG8gdGhlIGlucHV0IHN0cmVhbS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgcmxfZGlzcGF0Y2hpbmcKK1NldCB0byBhIG5vbi16ZXJvIHZhbHVlIGlmIGEgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIGZyb20gYSBrZXkgYmluZGluZzsKK3plcm8gb3RoZXJ3aXNlLiAgQXBwbGljYXRpb24gZnVuY3Rpb25zIGNhbiB0ZXN0IHRoaXMgdG8gZGlzY292ZXIgd2hldGhlcgordGhleSB3ZXJlIGNhbGxlZCBkaXJlY3RseSBvciBieSBSZWFkbGluZSdzIGRpc3BhdGNoaW5nIG1lY2hhbmlzbS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgcmxfZXJhc2VfZW1wdHlfbGluZQorU2V0dGluZyB0aGlzIHRvIGEgbm9uLXplcm8gdmFsdWUgY2F1c2VzIFJlYWRsaW5lIHRvIGNvbXBsZXRlbHkgZXJhc2UKK3RoZSBjdXJyZW50IGxpbmUsIGluY2x1ZGluZyBhbnkgcHJvbXB0LCBhbnkgdGltZSBhIG5ld2xpbmUgaXMgdHlwZWQgYXMKK3RoZSBvbmx5IGNoYXJhY3RlciBvbiBhbiBvdGhlcndpc2UtZW1wdHkgbGluZS4gIFRoZSBjdXJzb3IgaXMgbW92ZWQgdG8KK3RoZSBiZWdpbm5pbmcgb2YgdGhlIG5ld2x5LWJsYW5rIGxpbmUuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIge2NoYXIgKn0gcmxfcHJvbXB0CitUaGUgcHJvbXB0IFJlYWRsaW5lIHVzZXMuICBUaGlzIGlzIHNldCBmcm9tIHRoZSBhcmd1bWVudCB0bworQGNvZGV7cmVhZGxpbmUoKX0sIGFuZCBzaG91bGQgbm90IGJlIGFzc2lnbmVkIHRvIGRpcmVjdGx5LgorVGhlIEBjb2Rle3JsX3NldF9wcm9tcHQoKX0gZnVuY3Rpb24gKEBweHJlZntSZWRpc3BsYXl9KSBtYXkKK2JlIHVzZWQgdG8gbW9kaWZ5IHRoZSBwcm9tcHQgc3RyaW5nIGFmdGVyIGNhbGxpbmcgQGNvZGV7cmVhZGxpbmUoKX0uCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgaW50IHJsX2FscmVhZHlfcHJvbXB0ZWQKK0lmIGFuIGFwcGxpY2F0aW9uIHdpc2hlcyB0byBkaXNwbGF5IHRoZSBwcm9tcHQgaXRzZWxmLCByYXRoZXIgdGhhbiBoYXZlCitSZWFkbGluZSBkbyBpdCB0aGUgZmlyc3QgdGltZSBAY29kZXtyZWFkbGluZSgpfSBpcyBjYWxsZWQsIGl0IHNob3VsZCBzZXQKK3RoaXMgdmFyaWFibGUgdG8gYSBub24temVybyB2YWx1ZSBhZnRlciBkaXNwbGF5aW5nIHRoZSBwcm9tcHQuCitUaGUgcHJvbXB0IG11c3QgYWxzbyBiZSBwYXNzZWQgYXMgdGhlIGFyZ3VtZW50IHRvIEBjb2Rle3JlYWRsaW5lKCl9IHNvCit0aGUgcmVkaXNwbGF5IGZ1bmN0aW9ucyBjYW4gdXBkYXRlIHRoZSBkaXNwbGF5IHByb3Blcmx5LgorVGhlIGNhbGxpbmcgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSB2YWx1ZTsgUmVhZGxpbmUKK25ldmVyIHNldHMgaXQuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIge2NvbnN0IGNoYXIgKn0gcmxfbGlicmFyeV92ZXJzaW9uCitUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyByZXZpc2lvbiBvZiB0aGUgbGlicmFyeS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgcmxfcmVhZGxpbmVfdmVyc2lvbgorQW4gaW50ZWdlciBlbmNvZGluZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgVGhlIGVuY29kaW5nIGlzCitvZiB0aGUgZm9ybSAweEB2YXJ7TU1tbX0sIHdoZXJlIEB2YXJ7TU19IGlzIHRoZSB0d28tZGlnaXQgbWFqb3IgdmVyc2lvbgorbnVtYmVyLCBhbmQgQHZhcnttbX0gaXMgdGhlIHR3by1kaWdpdCBtaW5vciB2ZXJzaW9uIG51bWJlci4KK0ZvciBleGFtcGxlLCBmb3IgUmVhZGxpbmUtNC4yLCBAY29kZXtybF9yZWFkbGluZV92ZXJzaW9ufSB3b3VsZCBoYXZlIHRoZQordmFsdWUgMHgwNDAyLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtpbnR9IHJsX2dudV9yZWFkbGluZV9wCitBbHdheXMgc2V0IHRvIDEsIGRlbm90aW5nIHRoYXQgdGhpcyBpcyBAc2N7Z251fSByZWFkbGluZSByYXRoZXIgdGhhbiBzb21lCitlbXVsYXRpb24uCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIge2NvbnN0IGNoYXIgKn0gcmxfdGVybWluYWxfbmFtZQorVGhlIHRlcm1pbmFsIHR5cGUsIHVzZWQgZm9yIGluaXRpYWxpemF0aW9uLiAgSWYgbm90IHNldCBieSB0aGUgYXBwbGljYXRpb24sCitSZWFkbGluZSBzZXRzIHRoaXMgdG8gdGhlIHZhbHVlIG9mIHRoZSBAZW52e1RFUk19IGVudmlyb25tZW50IHZhcmlhYmxlCit0aGUgZmlyc3QgdGltZSBpdCBpcyBjYWxsZWQuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIge2NvbnN0IGNoYXIgKn0gcmxfcmVhZGxpbmVfbmFtZQorVGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gYSB1bmlxdWUgbmFtZSBieSBlYWNoIGFwcGxpY2F0aW9uIHVzaW5nIFJlYWRsaW5lLgorVGhlIHZhbHVlIGFsbG93cyBjb25kaXRpb25hbCBwYXJzaW5nIG9mIHRoZSBpbnB1dHJjIGZpbGUKKyhAcHhyZWZ7Q29uZGl0aW9uYWwgSW5pdCBDb25zdHJ1Y3RzfSkuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIge0ZJTEUgKn0gcmxfaW5zdHJlYW0KK1RoZSBzdGRpbyBzdHJlYW0gZnJvbSB3aGljaCBSZWFkbGluZSByZWFkcyBpbnB1dC4KK0lmIEBjb2Rle05VTEx9LCBSZWFkbGluZSBkZWZhdWx0cyB0byBAdmFye3N0ZGlufS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7RklMRSAqfSBybF9vdXRzdHJlYW0KK1RoZSBzdGRpbyBzdHJlYW0gdG8gd2hpY2ggUmVhZGxpbmUgcGVyZm9ybXMgb3V0cHV0LgorSWYgQGNvZGV7TlVMTH0sIFJlYWRsaW5lIGRlZmF1bHRzIHRvIEB2YXJ7c3Rkb3V0fS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgcmxfcHJlZmVyX2Vudl93aW5zaXplCitJZiBub24temVybywgUmVhZGxpbmUgZ2l2ZXMgdmFsdWVzIGZvdW5kIGluIHRoZSBAZW52e0xJTkVTfSBhbmQKK0BlbnZ7Q09MVU1OU30gZW52aXJvbm1lbnQgdmFyaWFibGVzIGdyZWF0ZXIgcHJlY2VkZW5jZSB0aGFuIHZhbHVlcyBmZXRjaGVkCitmcm9tIHRoZSBrZXJuZWwgd2hlbiBjb21wdXRpbmcgdGhlIHNjcmVlbiBkaW1lbnNpb25zLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtybF9jb21tYW5kX2Z1bmNfdCAqfSBybF9sYXN0X2Z1bmMKK1RoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGNvbW1hbmQgZnVuY3Rpb24gUmVhZGxpbmUgZXhlY3V0ZWQuICBNYXkgYmUgdXNlZCB0bwordGVzdCB3aGV0aGVyIG9yIG5vdCBhIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkIHR3aWNlIGluIHN1Y2Nlc3Npb24sIGZvcgorZXhhbXBsZS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7cmxfaG9va19mdW5jX3QgKn0gcmxfc3RhcnR1cF9ob29rCitJZiBub24temVybywgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwganVzdAorYmVmb3JlIEBjb2Rle3JlYWRsaW5lfSBwcmludHMgdGhlIGZpcnN0IHByb21wdC4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7cmxfaG9va19mdW5jX3QgKn0gcmxfcHJlX2lucHV0X2hvb2sKK0lmIG5vbi16ZXJvLCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCBhZnRlcgordGhlIGZpcnN0IHByb21wdCBoYXMgYmVlbiBwcmludGVkIGFuZCBqdXN0IGJlZm9yZSBAY29kZXtyZWFkbGluZX0KK3N0YXJ0cyByZWFkaW5nIGlucHV0IGNoYXJhY3RlcnMuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIge3JsX2hvb2tfZnVuY190ICp9IHJsX2V2ZW50X2hvb2sKK0lmIG5vbi16ZXJvLCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCBwZXJpb2RpY2FsbHkKK3doZW4gUmVhZGxpbmUgaXMgd2FpdGluZyBmb3IgdGVybWluYWwgaW5wdXQuCitCeSBkZWZhdWx0LCB0aGlzIHdpbGwgYmUgY2FsbGVkIGF0IG1vc3QgdGVuIHRpbWVzIGEgc2Vjb25kIGlmIHRoZXJlCitpcyBubyBrZXlib2FyZCBpbnB1dC4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7cmxfZ2V0Y19mdW5jX3QgKn0gcmxfZ2V0Y19mdW5jdGlvbgorSWYgbm9uLXplcm8sIFJlYWRsaW5lIHdpbGwgY2FsbCBpbmRpcmVjdGx5IHRocm91Z2ggdGhpcyBwb2ludGVyCit0byBnZXQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgQnkgZGVmYXVsdCwgaXQgaXMgc2V0IHRvCitAY29kZXtybF9nZXRjfSwgdGhlIGRlZmF1bHQgUmVhZGxpbmUgY2hhcmFjdGVyIGlucHV0IGZ1bmN0aW9uCisoQHB4cmVme0NoYXJhY3RlciBJbnB1dH0pLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtybF92b2lkZnVuY190ICp9IHJsX3JlZGlzcGxheV9mdW5jdGlvbgorSWYgbm9uLXplcm8sIFJlYWRsaW5lIHdpbGwgY2FsbCBpbmRpcmVjdGx5IHRocm91Z2ggdGhpcyBwb2ludGVyCit0byB1cGRhdGUgdGhlIGRpc3BsYXkgd2l0aCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgZWRpdGluZyBidWZmZXIuCitCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gQGNvZGV7cmxfcmVkaXNwbGF5fSwgdGhlIGRlZmF1bHQgUmVhZGxpbmUKK3JlZGlzcGxheSBmdW5jdGlvbiAoQHB4cmVme1JlZGlzcGxheX0pLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtybF92aW50ZnVuY190ICp9IHJsX3ByZXBfdGVybV9mdW5jdGlvbgorSWYgbm9uLXplcm8sIFJlYWRsaW5lIHdpbGwgY2FsbCBpbmRpcmVjdGx5IHRocm91Z2ggdGhpcyBwb2ludGVyCit0byBpbml0aWFsaXplIHRoZSB0ZXJtaW5hbC4gIFRoZSBmdW5jdGlvbiB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCwgYW4KK0Bjb2Rle2ludH0gZmxhZyB0aGF0IHNheXMgd2hldGhlciBvciBub3QgdG8gdXNlIGVpZ2h0LWJpdCBjaGFyYWN0ZXJzLgorQnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gQGNvZGV7cmxfcHJlcF90ZXJtaW5hbH0KKyhAcHhyZWZ7VGVybWluYWwgTWFuYWdlbWVudH0pLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtybF92b2lkZnVuY190ICp9IHJsX2RlcHJlcF90ZXJtX2Z1bmN0aW9uCitJZiBub24temVybywgUmVhZGxpbmUgd2lsbCBjYWxsIGluZGlyZWN0bHkgdGhyb3VnaCB0aGlzIHBvaW50ZXIKK3RvIHJlc2V0IHRoZSB0ZXJtaW5hbC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHVuZG8gdGhlIGVmZmVjdHMgb2YKK0Bjb2Rle3JsX3ByZXBfdGVybV9mdW5jdGlvbn0uCitCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byBAY29kZXtybF9kZXByZXBfdGVybWluYWx9CisoQHB4cmVme1Rlcm1pbmFsIE1hbmFnZW1lbnR9KS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7S2V5bWFwfSBybF9leGVjdXRpbmdfa2V5bWFwCitUaGlzIHZhcmlhYmxlIGlzIHNldCB0byB0aGUga2V5bWFwIChAcHhyZWZ7S2V5bWFwc30pIGluIHdoaWNoIHRoZQorY3VycmVudGx5IGV4ZWN1dGluZyByZWFkbGluZSBmdW5jdGlvbiB3YXMgZm91bmQuCitAZW5kIGRlZnR5cGV2YXIgCisKK0BkZWZ0eXBldmFyIHtLZXltYXB9IHJsX2JpbmRpbmdfa2V5bWFwCitUaGlzIHZhcmlhYmxlIGlzIHNldCB0byB0aGUga2V5bWFwIChAcHhyZWZ7S2V5bWFwc30pIGluIHdoaWNoIHRoZQorbGFzdCBrZXkgYmluZGluZyBvY2N1cnJlZC4KK0BlbmQgZGVmdHlwZXZhciAKKworQGRlZnR5cGV2YXIge2NoYXIgKn0gcmxfZXhlY3V0aW5nX21hY3JvCitUaGlzIHZhcmlhYmxlIGlzIHNldCB0byB0aGUgdGV4dCBvZiBhbnkgY3VycmVudGx5LWV4ZWN1dGluZyBtYWNyby4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7aW50fSBybF9yZWFkbGluZV9zdGF0ZQorQSB2YXJpYWJsZSB3aXRoIGJpdCB2YWx1ZXMgdGhhdCBlbmNhcHN1bGF0ZSB0aGUgY3VycmVudCBSZWFkbGluZSBzdGF0ZS4KK0EgYml0IGlzIHNldCB3aXRoIHRoZSBAY29kZXtSTF9TRVRTVEFURX0gbWFjcm8sIGFuZCB1bnNldCB3aXRoIHRoZQorQGNvZGV7UkxfVU5TRVRTVEFURX0gbWFjcm8uICBVc2UgdGhlIEBjb2Rle1JMX0lTU1RBVEV9IG1hY3JvIHRvIHRlc3QKK3doZXRoZXIgYSBwYXJ0aWN1bGFyIHN0YXRlIGJpdCBpcyBzZXQuICBDdXJyZW50IHN0YXRlIGJpdHMgaW5jbHVkZToKKworQHRhYmxlIEBjb2RlCitAaXRlbSBSTF9TVEFURV9OT05FCitSZWFkbGluZSBoYXMgbm90IHlldCBiZWVuIGNhbGxlZCwgbm9yIGhhcyBpdCBiZWd1biB0byBpbnRpYWxpemUuCitAaXRlbSBSTF9TVEFURV9JTklUSUFMSVpJTkcKK1JlYWRsaW5lIGlzIGluaXRpYWxpemluZyBpdHMgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgorQGl0ZW0gUkxfU1RBVEVfSU5JVElBTElaRUQKK1JlYWRsaW5lIGhhcyBjb21wbGV0ZWQgaXRzIGluaXRpYWxpemF0aW9uLgorQGl0ZW0gUkxfU1RBVEVfVEVSTVBSRVBQRUQKK1JlYWRsaW5lIGhhcyBtb2RpZmllZCB0aGUgdGVybWluYWwgbW9kZXMgdG8gZG8gaXRzIG93biBpbnB1dCBhbmQgcmVkaXNwbGF5LgorQGl0ZW0gUkxfU1RBVEVfUkVBRENNRAorUmVhZGxpbmUgaXMgcmVhZGluZyBhIGNvbW1hbmQgZnJvbSB0aGUga2V5Ym9hcmQuCitAaXRlbSBSTF9TVEFURV9NRVRBTkVYVAorUmVhZGxpbmUgaXMgcmVhZGluZyBtb3JlIGlucHV0IGFmdGVyIHJlYWRpbmcgdGhlIG1ldGEtcHJlZml4IGNoYXJhY3Rlci4KK0BpdGVtIFJMX1NUQVRFX0RJU1BBVENISU5HCitSZWFkbGluZSBpcyBkaXNwYXRjaGluZyB0byBhIGNvbW1hbmQuCitAaXRlbSBSTF9TVEFURV9NT1JFSU5QVVQKK1JlYWRsaW5lIGlzIHJlYWRpbmcgbW9yZSBpbnB1dCB3aGlsZSBleGVjdXRpbmcgYW4gZWRpdGluZyBjb21tYW5kLgorQGl0ZW0gUkxfU1RBVEVfSVNFQVJDSAorUmVhZGxpbmUgaXMgcGVyZm9ybWluZyBhbiBpbmNyZW1lbnRhbCBoaXN0b3J5IHNlYXJjaC4KK0BpdGVtIFJMX1NUQVRFX05TRUFSQ0gKK1JlYWRsaW5lIGlzIHBlcmZvcm1pbmcgYSBub24taW5jcmVtZW50YWwgaGlzdG9yeSBzZWFyY2guCitAaXRlbSBSTF9TVEFURV9TRUFSQ0gKK1JlYWRsaW5lIGlzIHNlYXJjaGluZyBiYWNrd2FyZCBvciBmb3J3YXJkIHRocm91Z2ggdGhlIGhpc3RvcnkgZm9yIGEgc3RyaW5nLgorQGl0ZW0gUkxfU1RBVEVfTlVNRVJJQ0FSRworUmVhZGxpbmUgaXMgcmVhZGluZyBhIG51bWVyaWMgYXJndW1lbnQuCitAaXRlbSBSTF9TVEFURV9NQUNST0lOUFVUCitSZWFkbGluZSBpcyBjdXJyZW50bHkgZ2V0dGluZyBpdHMgaW5wdXQgZnJvbSBhIHByZXZpb3VzbHktZGVmaW5lZCBrZXlib2FyZAorbWFjcm8uCitAaXRlbSBSTF9TVEFURV9NQUNST0RFRgorUmVhZGxpbmUgaXMgY3VycmVudGx5IHJlYWRpbmcgY2hhcmFjdGVycyBkZWZpbmluZyBhIGtleWJvYXJkIG1hY3JvLgorQGl0ZW0gUkxfU1RBVEVfT1ZFUldSSVRFCitSZWFkbGluZSBpcyBpbiBvdmVyd3JpdGUgbW9kZS4KK0BpdGVtIFJMX1NUQVRFX0NPTVBMRVRJTkcKK1JlYWRsaW5lIGlzIHBlcmZvcm1pbmcgd29yZCBjb21wbGV0aW9uLgorQGl0ZW0gUkxfU1RBVEVfU0lHSEFORExFUgorUmVhZGxpbmUgaXMgY3VycmVudGx5IGV4ZWN1dGluZyB0aGUgcmVhZGxpbmUgc2lnbmFsIGhhbmRsZXIuCitAaXRlbSBSTF9TVEFURV9VTkRPSU5HCitSZWFkbGluZSBpcyBwZXJmb3JtaW5nIGFuIHVuZG8uCitAaXRlbSBSTF9TVEFURV9ET05FCitSZWFkbGluZSBoYXMgcmVhZCBhIGtleSBzZXF1ZW5jZSBib3VuZCB0byBAY29kZXthY2NlcHQtbGluZX0KK2FuZCBpcyBhYm91dCB0byByZXR1cm4gdGhlIGxpbmUgdG8gdGhlIGNhbGxlci4KK0BlbmQgdGFibGUKKworQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtpbnR9IHJsX2V4cGxpY2l0X2FyZworU2V0IHRvIGEgbm9uLXplcm8gdmFsdWUgaWYgYW4gZXhwbGljaXQgbnVtZXJpYyBhcmd1bWVudCB3YXMgc3BlY2lmaWVkIGJ5Cit0aGUgdXNlci4gIE9ubHkgdmFsaWQgaW4gYSBiaW5kYWJsZSBjb21tYW5kIGZ1bmN0aW9uLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtpbnR9IHJsX251bWVyaWNfYXJnCitTZXQgdG8gdGhlIHZhbHVlIG9mIGFueSBudW1lcmljIGFyZ3VtZW50IGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCitiZWZvcmUgZXhlY3V0aW5nIHRoZSBjdXJyZW50IFJlYWRsaW5lIGZ1bmN0aW9uLiAgT25seSB2YWxpZCBpbiBhIGJpbmRhYmxlCitjb21tYW5kIGZ1bmN0aW9uLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtpbnR9IHJsX2VkaXRpbmdfbW9kZQorU2V0IHRvIGEgdmFsdWUgZGVub3RpbmcgUmVhZGxpbmUncyBjdXJyZW50IGVkaXRpbmcgbW9kZS4gIEEgdmFsdWUgb2YKK0B2YXJ7MX0gbWVhbnMgUmVhZGxpbmUgaXMgY3VycmVudGx5IGluIGVtYWNzIG1vZGU7IEB2YXJ7MH0KK21lYW5zIHRoYXQgdmkgbW9kZSBpcyBhY3RpdmUuCitAZW5kIGRlZnR5cGV2YXIKKworCitAbm9kZSBSZWFkbGluZSBDb252ZW5pZW5jZSBGdW5jdGlvbnMKK0BzZWN0aW9uIFJlYWRsaW5lIENvbnZlbmllbmNlIEZ1bmN0aW9ucworCitAbWVudQorKiBGdW5jdGlvbiBOYW1pbmc6OglIb3cgdG8gZ2l2ZSBhIGZ1bmN0aW9uIHlvdSB3cml0ZSBhIG5hbWUuCisqIEtleW1hcHM6OgkJTWFraW5nIGtleW1hcHMuCisqIEJpbmRpbmcgS2V5czo6CUNoYW5naW5nIEtleW1hcHMuCisqIEFzc29jaWF0aW5nIEZ1bmN0aW9uIE5hbWVzIGFuZCBCaW5kaW5nczo6CVRyYW5zbGF0ZSBmdW5jdGlvbiBuYW1lcyB0bworCQkJCQkJa2V5IHNlcXVlbmNlcy4KKyogQWxsb3dpbmcgVW5kb2luZzo6CUhvdyB0byBtYWtlIHlvdXIgZnVuY3Rpb25zIHVuZG9hYmxlLgorKiBSZWRpc3BsYXk6OgkJRnVuY3Rpb25zIHRvIGNvbnRyb2wgbGluZSBkaXNwbGF5LgorKiBNb2RpZnlpbmcgVGV4dDo6CUZ1bmN0aW9ucyB0byBtb2RpZnkgQGNvZGV7cmxfbGluZV9idWZmZXJ9LgorKiBDaGFyYWN0ZXIgSW5wdXQ6OglGdW5jdGlvbnMgdG8gcmVhZCBrZXlib2FyZCBpbnB1dC4KKyogVGVybWluYWwgTWFuYWdlbWVudDo6CUZ1bmN0aW9ucyB0byBtYW5hZ2UgdGVybWluYWwgc2V0dGluZ3MuCisqIFV0aWxpdHkgRnVuY3Rpb25zOjoJR2VuZXJhbGx5IHVzZWZ1bCBmdW5jdGlvbnMgYW5kIGhvb2tzLgorKiBNaXNjZWxsYW5lb3VzIEZ1bmN0aW9uczo6CUZ1bmN0aW9ucyB0aGF0IGRvbid0IGZhbGwgaW50byBhbnkgY2F0ZWdvcnkuCisqIEFsdGVybmF0ZSBJbnRlcmZhY2U6OglVc2luZyBSZWFkbGluZSBpbiBhIGBjYWxsYmFjaycgZmFzaGlvbi4KKyogQSBSZWFkbGluZSBFeGFtcGxlOjoJCUFuIGV4YW1wbGUgUmVhZGxpbmUgZnVuY3Rpb24uCitAZW5kIG1lbnUKKworQG5vZGUgRnVuY3Rpb24gTmFtaW5nCitAc3Vic2VjdGlvbiBOYW1pbmcgYSBGdW5jdGlvbgorCitUaGUgdXNlciBjYW4gZHluYW1pY2FsbHkgY2hhbmdlIHRoZSBiaW5kaW5ncyBvZiBrZXlzIHdoaWxlIHVzaW5nCitSZWFkbGluZS4gIFRoaXMgaXMgZG9uZSBieSByZXByZXNlbnRpbmcgdGhlIGZ1bmN0aW9uIHdpdGggYSBkZXNjcmlwdGl2ZQorbmFtZS4gIFRoZSB1c2VyIGlzIGFibGUgdG8gdHlwZSB0aGUgZGVzY3JpcHRpdmUgbmFtZSB3aGVuIHJlZmVycmluZyB0bwordGhlIGZ1bmN0aW9uLiAgVGh1cywgaW4gYW4gaW5pdCBmaWxlLCBvbmUgbWlnaHQgZmluZAorCitAZXhhbXBsZQorTWV0YS1SdWJvdXQ6CWJhY2t3YXJkLWtpbGwtd29yZAorQGVuZCBleGFtcGxlCisKK1RoaXMgYmluZHMgdGhlIGtleXN0cm9rZSBAa2V5e01ldGEtUnVib3V0fSB0byB0aGUgZnVuY3Rpb24KK0BlbXBoe2Rlc2NyaXB0aXZlbHl9IG5hbWVkIEBjb2Rle2JhY2t3YXJkLWtpbGwtd29yZH0uICBZb3UsIGFzIHRoZQorcHJvZ3JhbW1lciwgc2hvdWxkIGJpbmQgdGhlIGZ1bmN0aW9ucyB5b3Ugd3JpdGUgdG8gZGVzY3JpcHRpdmUgbmFtZXMgYXMKK3dlbGwuICBSZWFkbGluZSBwcm92aWRlcyBhIGZ1bmN0aW9uIGZvciBkb2luZyB0aGF0OgorCitAZGVmdHlwZWZ1biBpbnQgcmxfYWRkX2RlZnVuIChjb25zdCBjaGFyICpuYW1lLCBybF9jb21tYW5kX2Z1bmNfdCAqZnVuY3Rpb24sIGludCBrZXkpCitBZGQgQHZhcntuYW1lfSB0byB0aGUgbGlzdCBvZiBuYW1lZCBmdW5jdGlvbnMuICBNYWtlIEB2YXJ7ZnVuY3Rpb259IGJlCit0aGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZC4gIElmIEB2YXJ7a2V5fSBpcyBub3QgLTEsIHRoZW4gYmluZCBpdCB0bworQHZhcntmdW5jdGlvbn0gdXNpbmcgQGNvZGV7cmxfYmluZF9rZXkoKX0uCitAZW5kIGRlZnR5cGVmdW4KKworVXNpbmcgdGhpcyBmdW5jdGlvbiBhbG9uZSBpcyBzdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucy4KK0l0IGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gYWRkIGEgZmV3IGZ1bmN0aW9ucyB0byB0aGUgZGVmYXVsdAorZnVuY3Rpb25zIHRoYXQgUmVhZGxpbmUgaGFzIGJ1aWx0IGluLgorSWYgeW91IG5lZWQgdG8gZG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYWRkaW5nIGEgZnVuY3Rpb24gdG8gUmVhZGxpbmUsCit5b3UgbWF5IG5lZWQgdG8gdXNlIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9ucyBkZXNjcmliZWQgYmVsb3cuCisKK0Bub2RlIEtleW1hcHMKK0BzdWJzZWN0aW9uIFNlbGVjdGluZyBhIEtleW1hcAorCitLZXkgYmluZGluZ3MgdGFrZSBwbGFjZSBvbiBhIEBkZm57a2V5bWFwfS4gIFRoZSBrZXltYXAgaXMgdGhlCithc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBrZXlzIHRoYXQgdGhlIHVzZXIgdHlwZXMgYW5kIHRoZSBmdW5jdGlvbnMgdGhhdAorZ2V0IHJ1bi4gIFlvdSBjYW4gbWFrZSB5b3VyIG93biBrZXltYXBzLCBjb3B5IGV4aXN0aW5nIGtleW1hcHMsIGFuZCB0ZWxsCitSZWFkbGluZSB3aGljaCBrZXltYXAgdG8gdXNlLgorCitAZGVmdHlwZWZ1biBLZXltYXAgcmxfbWFrZV9iYXJlX2tleW1hcCAodm9pZCkKK1JldHVybnMgYSBuZXcsIGVtcHR5IGtleW1hcC4gIFRoZSBzcGFjZSBmb3IgdGhlIGtleW1hcCBpcyBhbGxvY2F0ZWQgd2l0aAorQGNvZGV7bWFsbG9jKCl9OyB0aGUgY2FsbGVyIHNob3VsZCBmcmVlIGl0IGJ5IGNhbGxpbmcKK0Bjb2Rle3JsX2Rpc2NhcmRfa2V5bWFwKCl9IHdoZW4gZG9uZS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBLZXltYXAgcmxfY29weV9rZXltYXAgKEtleW1hcCBtYXApCitSZXR1cm4gYSBuZXcga2V5bWFwIHdoaWNoIGlzIGEgY29weSBvZiBAdmFye21hcH0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gS2V5bWFwIHJsX21ha2Vfa2V5bWFwICh2b2lkKQorUmV0dXJuIGEgbmV3IGtleW1hcCB3aXRoIHRoZSBwcmludGluZyBjaGFyYWN0ZXJzIGJvdW5kIHRvIHJsX2luc2VydCwKK3RoZSBsb3dlcmNhc2UgTWV0YSBjaGFyYWN0ZXJzIGJvdW5kIHRvIHJ1biB0aGVpciBlcXVpdmFsZW50cywgYW5kCit0aGUgTWV0YSBkaWdpdHMgYm91bmQgdG8gcHJvZHVjZSBudW1lcmljIGFyZ3VtZW50cy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIHJsX2Rpc2NhcmRfa2V5bWFwIChLZXltYXAga2V5bWFwKQorRnJlZSB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggQHZhcntrZXltYXB9LgorQGVuZCBkZWZ0eXBlZnVuCisKK1JlYWRsaW5lIGhhcyBzZXZlcmFsIGludGVybmFsIGtleW1hcHMuICBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgeW91IHRvCitjaGFuZ2Ugd2hpY2gga2V5bWFwIGlzIGFjdGl2ZS4KKworQGRlZnR5cGVmdW4gS2V5bWFwIHJsX2dldF9rZXltYXAgKHZvaWQpCitSZXR1cm5zIHRoZSBjdXJyZW50bHkgYWN0aXZlIGtleW1hcC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIHJsX3NldF9rZXltYXAgKEtleW1hcCBrZXltYXApCitNYWtlcyBAdmFye2tleW1hcH0gdGhlIGN1cnJlbnRseSBhY3RpdmUga2V5bWFwLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIEtleW1hcCBybF9nZXRfa2V5bWFwX2J5X25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCitSZXR1cm4gdGhlIGtleW1hcCBtYXRjaGluZyBAdmFye25hbWV9LiAgQHZhcntuYW1lfSBpcyBvbmUgd2hpY2ggd291bGQKK2JlIHN1cHBsaWVkIGluIGEgQGNvZGV7c2V0IGtleW1hcH0gaW5wdXRyYyBsaW5lIChAcHhyZWZ7UmVhZGxpbmUgSW5pdCBGaWxlfSkuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge2NoYXIgKn0gcmxfZ2V0X2tleW1hcF9uYW1lIChLZXltYXAga2V5bWFwKQorUmV0dXJuIHRoZSBuYW1lIG1hdGNoaW5nIEB2YXJ7a2V5bWFwfS4gIEB2YXJ7bmFtZX0gaXMgb25lIHdoaWNoIHdvdWxkCitiZSBzdXBwbGllZCBpbiBhIEBjb2Rle3NldCBrZXltYXB9IGlucHV0cmMgbGluZSAoQHB4cmVme1JlYWRsaW5lIEluaXQgRmlsZX0pLgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIEJpbmRpbmcgS2V5cworQHN1YnNlY3Rpb24gQmluZGluZyBLZXlzCisKK0tleSBzZXF1ZW5jZXMgYXJlIGFzc29jaWF0ZSB3aXRoIGZ1bmN0aW9ucyB0aHJvdWdoIHRoZSBrZXltYXAuCitSZWFkbGluZSBoYXMgc2V2ZXJhbCBpbnRlcm5hbCBrZXltYXBzOiBAY29kZXtlbWFjc19zdGFuZGFyZF9rZXltYXB9LAorQGNvZGV7ZW1hY3NfbWV0YV9rZXltYXB9LCBAY29kZXtlbWFjc19jdGx4X2tleW1hcH0sCitAY29kZXt2aV9tb3ZlbWVudF9rZXltYXB9LCBhbmQgQGNvZGV7dmlfaW5zZXJ0aW9uX2tleW1hcH0uCitAY29kZXtlbWFjc19zdGFuZGFyZF9rZXltYXB9IGlzIHRoZSBkZWZhdWx0LCBhbmQgdGhlIGV4YW1wbGVzIGluCit0aGlzIG1hbnVhbCBhc3N1bWUgdGhhdC4KKworU2luY2UgQGNvZGV7cmVhZGxpbmUoKX0gaW5zdGFsbHMgYSBzZXQgb2YgZGVmYXVsdCBrZXkgYmluZGluZ3MgdGhlIGZpcnN0Cit0aW1lIGl0IGlzIGNhbGxlZCwgdGhlcmUgaXMgYWx3YXlzIHRoZSBkYW5nZXIgdGhhdCBhIGN1c3RvbSBiaW5kaW5nCitpbnN0YWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIEBjb2Rle3JlYWRsaW5lKCl9IHdpbGwgYmUgb3ZlcnJpZGRlbi4KK0FuIGFsdGVybmF0ZSBtZWNoYW5pc20gaXMgdG8gaW5zdGFsbCBjdXN0b20ga2V5IGJpbmRpbmdzIGluIGFuCitpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBhc3NpZ25lZCB0byB0aGUgQGNvZGV7cmxfc3RhcnR1cF9ob29rfSB2YXJpYWJsZQorKEBweHJlZntSZWFkbGluZSBWYXJpYWJsZXN9KS4KKworVGhlc2UgZnVuY3Rpb25zIG1hbmFnZSBrZXkgYmluZGluZ3MuCisKK0BkZWZ0eXBlZnVuIGludCBybF9iaW5kX2tleSAoaW50IGtleSwgcmxfY29tbWFuZF9mdW5jX3QgKmZ1bmN0aW9uKQorQmluZHMgQHZhcntrZXl9IHRvIEB2YXJ7ZnVuY3Rpb259IGluIHRoZSBjdXJyZW50bHkgYWN0aXZlIGtleW1hcC4KK1JldHVybnMgbm9uLXplcm8gaW4gdGhlIGNhc2Ugb2YgYW4gaW52YWxpZCBAdmFye2tleX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX2JpbmRfa2V5X2luX21hcCAoaW50IGtleSwgcmxfY29tbWFuZF9mdW5jX3QgKmZ1bmN0aW9uLCBLZXltYXAgbWFwKQorQmluZCBAdmFye2tleX0gdG8gQHZhcntmdW5jdGlvbn0gaW4gQHZhcnttYXB9LgorUmV0dXJucyBub24temVybyBpbiB0aGUgY2FzZSBvZiBhbiBpbnZhbGlkIEB2YXJ7a2V5fS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfYmluZF9rZXlfaWZfdW5ib3VuZCAoaW50IGtleSwgcmxfY29tbWFuZF9mdW5jX3QgKmZ1bmN0aW9uKQorQmluZHMgQHZhcntrZXl9IHRvIEB2YXJ7ZnVuY3Rpb259IGlmIGl0IGlzIG5vdCBhbHJlYWR5IGJvdW5kIGluIHRoZQorY3VycmVudGx5IGFjdGl2ZSBrZXltYXAuCitSZXR1cm5zIG5vbi16ZXJvIGluIHRoZSBjYXNlIG9mIGFuIGludmFsaWQgQHZhcntrZXl9IG9yIGlmIEB2YXJ7a2V5fSBpcworYWxyZWFkeSBib3VuZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfYmluZF9rZXlfaWZfdW5ib3VuZF9pbl9tYXAgKGludCBrZXksIHJsX2NvbW1hbmRfZnVuY190ICpmdW5jdGlvbiwgS2V5bWFwIG1hcCkKK0JpbmRzIEB2YXJ7a2V5fSB0byBAdmFye2Z1bmN0aW9ufSBpZiBpdCBpcyBub3QgYWxyZWFkeSBib3VuZCBpbiBAdmFye21hcH0uCitSZXR1cm5zIG5vbi16ZXJvIGluIHRoZSBjYXNlIG9mIGFuIGludmFsaWQgQHZhcntrZXl9IG9yIGlmIEB2YXJ7a2V5fSBpcworYWxyZWFkeSBib3VuZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfdW5iaW5kX2tleSAoaW50IGtleSkKK0JpbmQgQHZhcntrZXl9IHRvIHRoZSBudWxsIGZ1bmN0aW9uIGluIHRoZSBjdXJyZW50bHkgYWN0aXZlIGtleW1hcC4KK1JldHVybnMgbm9uLXplcm8gaW4gY2FzZSBvZiBlcnJvci4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfdW5iaW5kX2tleV9pbl9tYXAgKGludCBrZXksIEtleW1hcCBtYXApCitCaW5kIEB2YXJ7a2V5fSB0byB0aGUgbnVsbCBmdW5jdGlvbiBpbiBAdmFye21hcH0uCitSZXR1cm5zIG5vbi16ZXJvIGluIGNhc2Ugb2YgZXJyb3IuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX3VuYmluZF9mdW5jdGlvbl9pbl9tYXAgKHJsX2NvbW1hbmRfZnVuY190ICpmdW5jdGlvbiwgS2V5bWFwIG1hcCkKK1VuYmluZCBhbGwga2V5cyB0aGF0IGV4ZWN1dGUgQHZhcntmdW5jdGlvbn0gaW4gQHZhcnttYXB9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF91bmJpbmRfY29tbWFuZF9pbl9tYXAgKGNvbnN0IGNoYXIgKmNvbW1hbmQsIEtleW1hcCBtYXApCitVbmJpbmQgYWxsIGtleXMgdGhhdCBhcmUgYm91bmQgdG8gQHZhcntjb21tYW5kfSBpbiBAdmFye21hcH0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX2JpbmRfa2V5c2VxIChjb25zdCBjaGFyICprZXlzZXEsIHJsX2NvbW1hbmRfZnVuY190ICpmdW5jdGlvbikKK0JpbmQgdGhlIGtleSBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIEB2YXJ7a2V5c2VxfSB0byB0aGUgZnVuY3Rpb24KK0B2YXJ7ZnVuY3Rpb259LCBiZWdpbm5pbmcgaW4gdGhlIGN1cnJlbnQga2V5bWFwLgorVGhpcyBtYWtlcyBuZXcga2V5bWFwcyBhcyBuZWNlc3NhcnkuCitUaGUgcmV0dXJuIHZhbHVlIGlzIG5vbi16ZXJvIGlmIEB2YXJ7a2V5c2VxfSBpcyBpbnZhbGlkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9iaW5kX2tleXNlcV9pbl9tYXAgKGNvbnN0IGNoYXIgKmtleXNlcSwgcmxfY29tbWFuZF9mdW5jX3QgKmZ1bmN0aW9uLCBLZXltYXAgbWFwKQorQmluZCB0aGUga2V5IHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgQHZhcntrZXlzZXF9IHRvIHRoZSBmdW5jdGlvbgorQHZhcntmdW5jdGlvbn0uICBUaGlzIG1ha2VzIG5ldyBrZXltYXBzIGFzIG5lY2Vzc2FyeS4KK0luaXRpYWwgYmluZGluZ3MgYXJlIHBlcmZvcm1lZCBpbiBAdmFye21hcH0uCitUaGUgcmV0dXJuIHZhbHVlIGlzIG5vbi16ZXJvIGlmIEB2YXJ7a2V5c2VxfSBpcyBpbnZhbGlkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9zZXRfa2V5IChjb25zdCBjaGFyICprZXlzZXEsIHJsX2NvbW1hbmRfZnVuY190ICpmdW5jdGlvbiwgS2V5bWFwIG1hcCkKK0VxdWl2YWxlbnQgdG8gQGNvZGV7cmxfYmluZF9rZXlzZXFfaW5fbWFwfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfYmluZF9rZXlzZXFfaWZfdW5ib3VuZCAoY29uc3QgY2hhciAqa2V5c2VxLCBybF9jb21tYW5kX2Z1bmNfdCAqZnVuY3Rpb24pCitCaW5kcyBAdmFye2tleXNlcX0gdG8gQHZhcntmdW5jdGlvbn0gaWYgaXQgaXMgbm90IGFscmVhZHkgYm91bmQgaW4gdGhlCitjdXJyZW50bHkgYWN0aXZlIGtleW1hcC4KK1JldHVybnMgbm9uLXplcm8gaW4gdGhlIGNhc2Ugb2YgYW4gaW52YWxpZCBAdmFye2tleXNlcX0gb3IgaWYgQHZhcntrZXlzZXF9IGlzCithbHJlYWR5IGJvdW5kLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9iaW5kX2tleXNlcV9pZl91bmJvdW5kX2luX21hcCAoY29uc3QgY2hhciAqa2V5c2VxLCBybF9jb21tYW5kX2Z1bmNfdCAqZnVuY3Rpb24sIEtleW1hcCBtYXApCitCaW5kcyBAdmFye2tleXNlcX0gdG8gQHZhcntmdW5jdGlvbn0gaWYgaXQgaXMgbm90IGFscmVhZHkgYm91bmQgaW4gQHZhcnttYXB9LgorUmV0dXJucyBub24temVybyBpbiB0aGUgY2FzZSBvZiBhbiBpbnZhbGlkIEB2YXJ7a2V5c2VxfSBvciBpZiBAdmFye2tleXNlcX0gaXMKK2FscmVhZHkgYm91bmQuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX2dlbmVyaWNfYmluZCAoaW50IHR5cGUsIGNvbnN0IGNoYXIgKmtleXNlcSwgY2hhciAqZGF0YSwgS2V5bWFwIG1hcCkKK0JpbmQgdGhlIGtleSBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIEB2YXJ7a2V5c2VxfSB0byB0aGUgYXJiaXRyYXJ5Citwb2ludGVyIEB2YXJ7ZGF0YX0uICBAdmFye3R5cGV9IHNheXMgd2hhdCBraW5kIG9mIGRhdGEgaXMgcG9pbnRlZCB0byBieQorQHZhcntkYXRhfTsgdGhpcyBjYW4gYmUgYSBmdW5jdGlvbiAoQGNvZGV7SVNGVU5DfSksIGEgbWFjcm8KKyhAY29kZXtJU01BQ1J9KSwgb3IgYSBrZXltYXAgKEBjb2Rle0lTS01BUH0pLiAgVGhpcyBtYWtlcyBuZXcga2V5bWFwcyBhcworbmVjZXNzYXJ5LiAgVGhlIGluaXRpYWwga2V5bWFwIGluIHdoaWNoIHRvIGRvIGJpbmRpbmdzIGlzIEB2YXJ7bWFwfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfcGFyc2VfYW5kX2JpbmQgKGNoYXIgKmxpbmUpCitQYXJzZSBAdmFye2xpbmV9IGFzIGlmIGl0IGhhZCBiZWVuIHJlYWQgZnJvbSB0aGUgQGNvZGV7aW5wdXRyY30gZmlsZSBhbmQKK3BlcmZvcm0gYW55IGtleSBiaW5kaW5ncyBhbmQgdmFyaWFibGUgYXNzaWdubWVudHMgZm91bmQKKyhAcHhyZWZ7UmVhZGxpbmUgSW5pdCBGaWxlfSkuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX3JlYWRfaW5pdF9maWxlIChjb25zdCBjaGFyICpmaWxlbmFtZSkKK1JlYWQga2V5YmluZGluZ3MgYW5kIHZhcmlhYmxlIGFzc2lnbm1lbnRzIGZyb20gQHZhcntmaWxlbmFtZX0KKyhAcHhyZWZ7UmVhZGxpbmUgSW5pdCBGaWxlfSkuCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgQXNzb2NpYXRpbmcgRnVuY3Rpb24gTmFtZXMgYW5kIEJpbmRpbmdzCitAc3Vic2VjdGlvbiBBc3NvY2lhdGluZyBGdW5jdGlvbiBOYW1lcyBhbmQgQmluZGluZ3MKKworVGhlc2UgZnVuY3Rpb25zIGFsbG93IHlvdSB0byBmaW5kIG91dCB3aGF0IGtleXMgaW52b2tlIG5hbWVkIGZ1bmN0aW9ucworYW5kIHRoZSBmdW5jdGlvbnMgaW52b2tlZCBieSBhIHBhcnRpY3VsYXIga2V5IHNlcXVlbmNlLiAgWW91IG1heSBhbHNvCithc3NvY2lhdGUgYSBuZXcgZnVuY3Rpb24gbmFtZSB3aXRoIGFuIGFyYml0cmFyeSBmdW5jdGlvbi4KKworQGRlZnR5cGVmdW4ge3JsX2NvbW1hbmRfZnVuY190ICp9IHJsX25hbWVkX2Z1bmN0aW9uIChjb25zdCBjaGFyICpuYW1lKQorUmV0dXJuIHRoZSBmdW5jdGlvbiB3aXRoIG5hbWUgQHZhcntuYW1lfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7cmxfY29tbWFuZF9mdW5jX3QgKn0gcmxfZnVuY3Rpb25fb2Zfa2V5c2VxIChjb25zdCBjaGFyICprZXlzZXEsIEtleW1hcCBtYXAsIGludCAqdHlwZSkKK1JldHVybiB0aGUgZnVuY3Rpb24gaW52b2tlZCBieSBAdmFye2tleXNlcX0gaW4ga2V5bWFwIEB2YXJ7bWFwfS4KK0lmIEB2YXJ7bWFwfSBpcyBAY29kZXtOVUxMfSwgdGhlIGN1cnJlbnQga2V5bWFwIGlzIHVzZWQuICBJZiBAdmFye3R5cGV9IGlzCitub3QgQGNvZGV7TlVMTH0sIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaXMgcmV0dXJuZWQgaW4gdGhlIEBjb2Rle2ludH0gdmFyaWFibGUKK2l0IHBvaW50cyB0byAob25lIG9mIEBjb2Rle0lTRlVOQ30sIEBjb2Rle0lTS01BUH0sIG9yIEBjb2Rle0lTTUFDUn0pLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHtjaGFyICoqfSBybF9pbnZva2luZ19rZXlzZXFzIChybF9jb21tYW5kX2Z1bmNfdCAqZnVuY3Rpb24pCitSZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIGtleSBzZXF1ZW5jZXMgdXNlZCB0bworaW52b2tlIEB2YXJ7ZnVuY3Rpb259IGluIHRoZSBjdXJyZW50IGtleW1hcC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7Y2hhciAqKn0gcmxfaW52b2tpbmdfa2V5c2Vxc19pbl9tYXAgKHJsX2NvbW1hbmRfZnVuY190ICpmdW5jdGlvbiwgS2V5bWFwIG1hcCkKK1JldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUga2V5IHNlcXVlbmNlcyB1c2VkIHRvCitpbnZva2UgQHZhcntmdW5jdGlvbn0gaW4gdGhlIGtleW1hcCBAdmFye21hcH0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBybF9mdW5jdGlvbl9kdW1wZXIgKGludCByZWFkYWJsZSkKK1ByaW50IHRoZSByZWFkbGluZSBmdW5jdGlvbiBuYW1lcyBhbmQgdGhlIGtleSBzZXF1ZW5jZXMgY3VycmVudGx5Citib3VuZCB0byB0aGVtIHRvIEBjb2Rle3JsX291dHN0cmVhbX0uICBJZiBAdmFye3JlYWRhYmxlfSBpcyBub24temVybywKK3RoZSBsaXN0IGlzIGZvcm1hdHRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuIGJlIG1hZGUgcGFydCBvZiBhbgorQGNvZGV7aW5wdXRyY30gZmlsZSBhbmQgcmUtcmVhZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIHJsX2xpc3RfZnVubWFwX25hbWVzICh2b2lkKQorUHJpbnQgdGhlIG5hbWVzIG9mIGFsbCBiaW5kYWJsZSBSZWFkbGluZSBmdW5jdGlvbnMgdG8gQGNvZGV7cmxfb3V0c3RyZWFtfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7Y29uc3QgY2hhciAqKn0gcmxfZnVubWFwX25hbWVzICh2b2lkKQorUmV0dXJuIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGtub3duIGZ1bmN0aW9uIG5hbWVzLiAgVGhlIGFycmF5IGlzCitzb3J0ZWQuICBUaGUgYXJyYXkgaXRzZWxmIGlzIGFsbG9jYXRlZCwgYnV0IG5vdCB0aGUgc3RyaW5ncyBpbnNpZGUuICBZb3UKK3Nob3VsZCBAY29kZXtmcmVlKCl9IHRoZSBhcnJheSB3aGVuIHlvdSBhcmUgZG9uZSwgYnV0IG5vdCB0aGUgcG9pbnRlcnMuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX2FkZF9mdW5tYXBfZW50cnkgKGNvbnN0IGNoYXIgKm5hbWUsIHJsX2NvbW1hbmRfZnVuY190ICpmdW5jdGlvbikKK0FkZCBAdmFye25hbWV9IHRvIHRoZSBsaXN0IG9mIGJpbmRhYmxlIFJlYWRsaW5lIGNvbW1hbmQgbmFtZXMsIGFuZCBtYWtlCitAdmFye2Z1bmN0aW9ufSB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gQHZhcntuYW1lfSBpcyBpbnZva2VkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIEFsbG93aW5nIFVuZG9pbmcKK0BzdWJzZWN0aW9uIEFsbG93aW5nIFVuZG9pbmcKKworU3VwcG9ydGluZyB0aGUgdW5kbyBjb21tYW5kIGlzIGEgcGFpbmxlc3MgdGhpbmcsIGFuZCBtYWtlcyB5b3VyCitmdW5jdGlvbnMgbXVjaCBtb3JlIHVzZWZ1bC4gIEl0IGlzIGNlcnRhaW5seSBlYXN5IHRvIHRyeQorc29tZXRoaW5nIGlmIHlvdSBrbm93IHlvdSBjYW4gdW5kbyBpdC4KKworSWYgeW91ciBmdW5jdGlvbiBzaW1wbHkgaW5zZXJ0cyB0ZXh0IG9uY2UsIG9yIGRlbGV0ZXMgdGV4dCBvbmNlLCBhbmQKK3VzZXMgQGNvZGV7cmxfaW5zZXJ0X3RleHQoKX0gb3IgQGNvZGV7cmxfZGVsZXRlX3RleHQoKX0gdG8gZG8gaXQsIHRoZW4KK3VuZG9pbmcgaXMgYWxyZWFkeSBkb25lIGZvciB5b3UgYXV0b21hdGljYWxseS4KKworSWYgeW91IGRvIG11bHRpcGxlIGluc2VydGlvbnMgb3IgbXVsdGlwbGUgZGVsZXRpb25zLCBvciBhbnkgY29tYmluYXRpb24KK29mIHRoZXNlIG9wZXJhdGlvbnMsIHlvdSBzaG91bGQgZ3JvdXAgdGhlbSB0b2dldGhlciBpbnRvIG9uZSBvcGVyYXRpb24uCitUaGlzIGlzIGRvbmUgd2l0aCBAY29kZXtybF9iZWdpbl91bmRvX2dyb3VwKCl9IGFuZAorQGNvZGV7cmxfZW5kX3VuZG9fZ3JvdXAoKX0uCisKK1RoZSB0eXBlcyBvZiBldmVudHMgdGhhdCBjYW4gYmUgdW5kb25lIGFyZToKKworQHNtYWxsZXhhbXBsZQorZW51bSB1bmRvX2NvZGUgQHsgVU5ET19ERUxFVEUsIFVORE9fSU5TRVJULCBVTkRPX0JFR0lOLCBVTkRPX0VORCBAfTsgCitAZW5kIHNtYWxsZXhhbXBsZQorCitOb3RpY2UgdGhhdCBAY29kZXtVTkRPX0RFTEVURX0gbWVhbnMgdG8gaW5zZXJ0IHNvbWUgdGV4dCwgYW5kCitAY29kZXtVTkRPX0lOU0VSVH0gbWVhbnMgdG8gZGVsZXRlIHNvbWUgdGV4dC4gIFRoYXQgaXMsIHRoZSB1bmRvIGNvZGUKK3RlbGxzIHdoYXQgdG8gdW5kbywgbm90IGhvdyB0byB1bmRvIGl0LiAgQGNvZGV7VU5ET19CRUdJTn0gYW5kCitAY29kZXtVTkRPX0VORH0gYXJlIHRhZ3MgYWRkZWQgYnkgQGNvZGV7cmxfYmVnaW5fdW5kb19ncm91cCgpfSBhbmQKK0Bjb2Rle3JsX2VuZF91bmRvX2dyb3VwKCl9LgorCitAZGVmdHlwZWZ1biBpbnQgcmxfYmVnaW5fdW5kb19ncm91cCAodm9pZCkKK0JlZ2lucyBzYXZpbmcgdW5kbyBpbmZvcm1hdGlvbiBpbiBhIGdyb3VwIGNvbnN0cnVjdC4gIFRoZSB1bmRvCitpbmZvcm1hdGlvbiB1c3VhbGx5IGNvbWVzIGZyb20gY2FsbHMgdG8gQGNvZGV7cmxfaW5zZXJ0X3RleHQoKX0gYW5kCitAY29kZXtybF9kZWxldGVfdGV4dCgpfSwgYnV0IGNvdWxkIGJlIHRoZSByZXN1bHQgb2YgY2FsbHMgdG8KK0Bjb2Rle3JsX2FkZF91bmRvKCl9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9lbmRfdW5kb19ncm91cCAodm9pZCkKK0Nsb3NlcyB0aGUgY3VycmVudCB1bmRvIGdyb3VwIHN0YXJ0ZWQgd2l0aCBAY29kZXtybF9iZWdpbl91bmRvX2dyb3VwCisoKX0uICBUaGVyZSBzaG91bGQgYmUgb25lIGNhbGwgdG8gQGNvZGV7cmxfZW5kX3VuZG9fZ3JvdXAoKX0KK2ZvciBlYWNoIGNhbGwgdG8gQGNvZGV7cmxfYmVnaW5fdW5kb19ncm91cCgpfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIHJsX2FkZF91bmRvIChlbnVtIHVuZG9fY29kZSB3aGF0LCBpbnQgc3RhcnQsIGludCBlbmQsIGNoYXIgKnRleHQpCitSZW1lbWJlciBob3cgdG8gdW5kbyBhbiBldmVudCAoYWNjb3JkaW5nIHRvIEB2YXJ7d2hhdH0pLiAgVGhlIGFmZmVjdGVkCit0ZXh0IHJ1bnMgZnJvbSBAdmFye3N0YXJ0fSB0byBAdmFye2VuZH0sIGFuZCBlbmNvbXBhc3NlcyBAdmFye3RleHR9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgcmxfZnJlZV91bmRvX2xpc3QgKHZvaWQpCitGcmVlIHRoZSBleGlzdGluZyB1bmRvIGxpc3QuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX2RvX3VuZG8gKHZvaWQpCitVbmRvIHRoZSBmaXJzdCB0aGluZyBvbiB0aGUgdW5kbyBsaXN0LiAgUmV0dXJucyBAY29kZXswfSBpZiB0aGVyZSB3YXMKK25vdGhpbmcgdG8gdW5kbywgbm9uLXplcm8gaWYgc29tZXRoaW5nIHdhcyB1bmRvbmUuCitAZW5kIGRlZnR5cGVmdW4KKworRmluYWxseSwgaWYgeW91IG5laXRoZXIgaW5zZXJ0IG5vciBkZWxldGUgdGV4dCwgYnV0IGRpcmVjdGx5IG1vZGlmeSB0aGUKK2V4aXN0aW5nIHRleHQgKGUuZy4sIGNoYW5nZSBpdHMgY2FzZSksIGNhbGwgQGNvZGV7cmxfbW9kaWZ5aW5nKCl9CitvbmNlLCBqdXN0IGJlZm9yZSB5b3UgbW9kaWZ5IHRoZSB0ZXh0LiAgWW91IG11c3Qgc3VwcGx5IHRoZSBpbmRpY2VzIG9mCit0aGUgdGV4dCByYW5nZSB0aGF0IHlvdSBhcmUgZ29pbmcgdG8gbW9kaWZ5LgorCitAZGVmdHlwZWZ1biBpbnQgcmxfbW9kaWZ5aW5nIChpbnQgc3RhcnQsIGludCBlbmQpCitUZWxsIFJlYWRsaW5lIHRvIHNhdmUgdGhlIHRleHQgYmV0d2VlbiBAdmFye3N0YXJ0fSBhbmQgQHZhcntlbmR9IGFzIGEKK3NpbmdsZSB1bmRvIHVuaXQuICBJdCBpcyBhc3N1bWVkIHRoYXQgeW91IHdpbGwgc3Vic2VxdWVudGx5IG1vZGlmeQordGhhdCB0ZXh0LgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIFJlZGlzcGxheQorQHN1YnNlY3Rpb24gUmVkaXNwbGF5CisKK0BkZWZ0eXBlZnVuIHZvaWQgcmxfcmVkaXNwbGF5ICh2b2lkKQorQ2hhbmdlIHdoYXQncyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbiB0byByZWZsZWN0IHRoZSBjdXJyZW50IGNvbnRlbnRzCitvZiBAY29kZXtybF9saW5lX2J1ZmZlcn0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX2ZvcmNlZF91cGRhdGVfZGlzcGxheSAodm9pZCkKK0ZvcmNlIHRoZSBsaW5lIHRvIGJlIHVwZGF0ZWQgYW5kIHJlZGlzcGxheWVkLCB3aGV0aGVyIG9yIG5vdAorUmVhZGxpbmUgdGhpbmtzIHRoZSBzY3JlZW4gZGlzcGxheSBpcyBjb3JyZWN0LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9vbl9uZXdfbGluZSAodm9pZCkKK1RlbGwgdGhlIHVwZGF0ZSBmdW5jdGlvbnMgdGhhdCB3ZSBoYXZlIG1vdmVkIG9udG8gYSBuZXcgKGVtcHR5KSBsaW5lLAordXN1YWxseSBhZnRlciBvdXB1dHRpbmcgYSBuZXdsaW5lLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9vbl9uZXdfbGluZV93aXRoX3Byb21wdCAodm9pZCkKK1RlbGwgdGhlIHVwZGF0ZSBmdW5jdGlvbnMgdGhhdCB3ZSBoYXZlIG1vdmVkIG9udG8gYSBuZXcgbGluZSwgd2l0aAorQHZhcntybF9wcm9tcHR9IGFscmVhZHkgZGlzcGxheWVkLgorVGhpcyBjb3VsZCBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gb3V0cHV0IHRoZSBwcm9tcHQgc3RyaW5nCit0aGVtc2VsdmVzLCBidXQgc3RpbGwgbmVlZCBSZWFkbGluZSB0byBrbm93IHRoZSBwcm9tcHQgc3RyaW5nIGxlbmd0aCBmb3IKK3JlZGlzcGxheS4KK0l0IHNob3VsZCBiZSB1c2VkIGFmdGVyIHNldHRpbmcgQHZhcntybF9hbHJlYWR5X3Byb21wdGVkfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfcmVzZXRfbGluZV9zdGF0ZSAodm9pZCkKK1Jlc2V0IHRoZSBkaXNwbGF5IHN0YXRlIHRvIGEgY2xlYW4gc3RhdGUgYW5kIHJlZGlzcGxheSB0aGUgY3VycmVudCBsaW5lCitzdGFydGluZyBvbiBhIG5ldyBsaW5lLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9jcmxmICh2b2lkKQorTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzY3JlZW4gbGluZS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfc2hvd19jaGFyIChpbnQgYykKK0Rpc3BsYXkgY2hhcmFjdGVyIEB2YXJ7Y30gb24gQGNvZGV7cmxfb3V0c3RyZWFtfS4KK0lmIFJlYWRsaW5lIGhhcyBub3QgYmVlbiBzZXQgdG8gZGlzcGxheSBtZXRhIGNoYXJhY3RlcnMgZGlyZWN0bHksIHRoaXMKK3dpbGwgY29udmVydCBtZXRhIGNoYXJhY3RlcnMgdG8gYSBtZXRhLXByZWZpeGVkIGtleSBzZXF1ZW5jZS4KK1RoaXMgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMgd2hpY2ggd2lzaCB0byBkbyB0aGVpciBvd24KK3JlZGlzcGxheS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfbWVzc2FnZSAoY29uc3QgY2hhciAqLCBAZG90c3t9KQorVGhlIGFyZ3VtZW50cyBhcmUgYSBmb3JtYXQgc3RyaW5nIGFzIHdvdWxkIGJlIHN1cHBsaWVkIHRvIEBjb2Rle3ByaW50Zn0sCitwb3NzaWJseSBjb250YWluaW5nIGNvbnZlcnNpb24gc3BlY2lmaWNhdGlvbnMgc3VjaCBhcyBAc2FtcHslZH0sIGFuZAorYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIG5lY2Vzc2FyeSB0byBzYXRpc2Z5IHRoZSBjb252ZXJzaW9uIHNwZWNpZmljYXRpb25zLgorVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgZGlzcGxheWVkIGluIHRoZSBAZGZue2VjaG8gYXJlYX0uICBUaGUgZWNobyBhcmVhCitpcyBhbHNvIHVzZWQgdG8gZGlzcGxheSBudW1lcmljIGFyZ3VtZW50cyBhbmQgc2VhcmNoIHN0cmluZ3MuCitZb3Ugc2hvdWxkIGNhbGwgQGNvZGV7cmxfc2F2ZV9wcm9tcHR9IHRvIHNhdmUgdGhlIHByb21wdCBpbmZvcm1hdGlvbgorYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfY2xlYXJfbWVzc2FnZSAodm9pZCkKK0NsZWFyIHRoZSBtZXNzYWdlIGluIHRoZSBlY2hvIGFyZWEuICBJZiB0aGUgcHJvbXB0IHdhcyBzYXZlZCB3aXRoIGEgY2FsbCB0bworQGNvZGV7cmxfc2F2ZV9wcm9tcHR9IGJlZm9yZSB0aGUgbGFzdCBjYWxsIHRvIEBjb2Rle3JsX21lc3NhZ2V9LAorY2FsbCBAY29kZXtybF9yZXN0b3JlX3Byb21wdH0gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIHJsX3NhdmVfcHJvbXB0ICh2b2lkKQorU2F2ZSB0aGUgbG9jYWwgUmVhZGxpbmUgcHJvbXB0IGRpc3BsYXkgc3RhdGUgaW4gcHJlcGFyYXRpb24gZm9yCitkaXNwbGF5aW5nIGEgbmV3IG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2UgYXJlYSB3aXRoIEBjb2Rle3JsX21lc3NhZ2UoKX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBybF9yZXN0b3JlX3Byb21wdCAodm9pZCkKK1Jlc3RvcmUgdGhlIGxvY2FsIFJlYWRsaW5lIHByb21wdCBkaXNwbGF5IHN0YXRlIHNhdmVkIGJ5IHRoZSBtb3N0CityZWNlbnQgY2FsbCB0byBAY29kZXtybF9zYXZlX3Byb21wdH0uCitpZiBAY29kZXtybF9zYXZlX3Byb21wdH0gd2FzIGNhbGxlZCB0byBzYXZlIHRoZSBwcm9tcHQgYmVmb3JlIGEgY2FsbAordG8gQGNvZGV7cmxfbWVzc2FnZX0sIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdGhlCitjb3JyZXNwb25kaW5nIGNhbGwgdG8gQGNvZGV7cmxfY2xlYXJfbWVzc2FnZX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX2V4cGFuZF9wcm9tcHQgKGNoYXIgKnByb21wdCkKK0V4cGFuZCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXIgc2VxdWVuY2VzIGluIEB2YXJ7cHJvbXB0fSBhbmQgc2V0IHVwIHRoZQorbG9jYWwgUmVhZGxpbmUgcHJvbXB0IHJlZGlzcGxheSB2YXJpYWJsZXMuCitUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBAY29kZXtyZWFkbGluZSgpfS4gIEl0IG1heSBhbHNvIGJlIGNhbGxlZCB0bworZXhwYW5kIHRoZSBwcmltYXJ5IHByb21wdCBpZiB0aGUgQGNvZGV7cmxfb25fbmV3X2xpbmVfd2l0aF9wcm9tcHQoKX0KK2Z1bmN0aW9uIG9yIEBjb2Rle3JsX2FscmVhZHlfcHJvbXB0ZWR9IHZhcmlhYmxlIGlzIHVzZWQuCitJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdmlzaWJsZSBjaGFyYWN0ZXJzIG9uIHRoZSBsYXN0IGxpbmUgb2YgdGhlCisocG9zc2libHkgbXVsdGktbGluZSkgcHJvbXB0LgorQXBwbGljYXRpb25zIG1heSBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9tcHQgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IHRha2UKK3VwIG5vIHBoeXNpY2FsIHNjcmVlbiBzcGFjZSB3aGVuIGRpc3BsYXllZCBieSBicmFja2V0aW5nIGEgc2VxdWVuY2Ugb2YKK3N1Y2ggY2hhcmFjdGVycyB3aXRoIHRoZSBzcGVjaWFsIG1hcmtlcnMgQGNvZGV7UkxfUFJPTVBUX1NUQVJUX0lHTk9SRX0KK2FuZCBAY29kZXtSTF9QUk9NUFRfRU5EX0lHTk9SRX0gKGRlY2xhcmVkIGluIEBmaWxle3JlYWRsaW5lLmh9LiAgVGhpcyBtYXkKK2JlIHVzZWQgdG8gZW1iZWQgdGVybWluYWwtc3BlY2lmaWMgZXNjYXBlIHNlcXVlbmNlcyBpbiBwcm9tcHRzLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9zZXRfcHJvbXB0IChjb25zdCBjaGFyICpwcm9tcHQpCitNYWtlIFJlYWRsaW5lIHVzZSBAdmFye3Byb21wdH0gZm9yIHN1YnNlcXVlbnQgcmVkaXNwbGF5LiAgVGhpcyBjYWxscworQGNvZGV7cmxfZXhwYW5kX3Byb21wdCgpfSB0byBleHBhbmQgdGhlIHByb21wdCBhbmQgc2V0cyBAY29kZXtybF9wcm9tcHR9Cit0byB0aGUgcmVzdWx0LgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIE1vZGlmeWluZyBUZXh0CitAc3Vic2VjdGlvbiBNb2RpZnlpbmcgVGV4dAorCitAZGVmdHlwZWZ1biBpbnQgcmxfaW5zZXJ0X3RleHQgKGNvbnN0IGNoYXIgKnRleHQpCitJbnNlcnQgQHZhcnt0ZXh0fSBpbnRvIHRoZSBsaW5lIGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4KK1JldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluc2VydGVkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9kZWxldGVfdGV4dCAoaW50IHN0YXJ0LCBpbnQgZW5kKQorRGVsZXRlIHRoZSB0ZXh0IGJldHdlZW4gQHZhcntzdGFydH0gYW5kIEB2YXJ7ZW5kfSBpbiB0aGUgY3VycmVudCBsaW5lLgorUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZGVsZXRlZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7Y2hhciAqfSBybF9jb3B5X3RleHQgKGludCBzdGFydCwgaW50IGVuZCkKK1JldHVybiBhIGNvcHkgb2YgdGhlIHRleHQgYmV0d2VlbiBAdmFye3N0YXJ0fSBhbmQgQHZhcntlbmR9IGluCit0aGUgY3VycmVudCBsaW5lLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9raWxsX3RleHQgKGludCBzdGFydCwgaW50IGVuZCkKK0NvcHkgdGhlIHRleHQgYmV0d2VlbiBAdmFye3N0YXJ0fSBhbmQgQHZhcntlbmR9IGluIHRoZSBjdXJyZW50IGxpbmUKK3RvIHRoZSBraWxsIHJpbmcsIGFwcGVuZGluZyBvciBwcmVwZW5kaW5nIHRvIHRoZSBsYXN0IGtpbGwgaWYgdGhlCitsYXN0IGNvbW1hbmQgd2FzIGEga2lsbCBjb21tYW5kLiAgVGhlIHRleHQgaXMgZGVsZXRlZC4KK0lmIEB2YXJ7c3RhcnR9IGlzIGxlc3MgdGhhbiBAdmFye2VuZH0sCit0aGUgdGV4dCBpcyBhcHBlbmRlZCwgb3RoZXJ3aXNlIHByZXBlbmRlZC4gIElmIHRoZSBsYXN0IGNvbW1hbmQgd2FzCitub3QgYSBraWxsLCBhIG5ldyBraWxsIHJpbmcgc2xvdCBpcyB1c2VkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9wdXNoX21hY3JvX2lucHV0IChjaGFyICptYWNybykKK0NhdXNlIEB2YXJ7bWFjcm99IHRvIGJlIGluc2VydGVkIGludG8gdGhlIGxpbmUsIGFzIGlmIGl0IGhhZCBiZWVuIGludm9rZWQKK2J5IGEga2V5IGJvdW5kIHRvIGEgbWFjcm8uICBOb3QgZXNwZWNpYWxseSB1c2VmdWw7IHVzZQorQGNvZGV7cmxfaW5zZXJ0X3RleHQoKX0gaW5zdGVhZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBDaGFyYWN0ZXIgSW5wdXQKK0BzdWJzZWN0aW9uIENoYXJhY3RlciBJbnB1dAorCitAZGVmdHlwZWZ1biBpbnQgcmxfcmVhZF9rZXkgKHZvaWQpCitSZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGF2YWlsYWJsZSBmcm9tIFJlYWRsaW5lJ3MgY3VycmVudCBpbnB1dCBzdHJlYW0uCitUaGlzIGhhbmRsZXMgaW5wdXQgaW5zZXJ0ZWQgaW50bwordGhlIGlucHV0IHN0cmVhbSB2aWEgQHZhcntybF9wZW5kaW5nX2lucHV0fSAoQHB4cmVme1JlYWRsaW5lIFZhcmlhYmxlc30pCithbmQgQGNvZGV7cmxfc3R1ZmZfY2hhcigpfSwgbWFjcm9zLCBhbmQgY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGtleWJvYXJkLgorV2hpbGUgd2FpdGluZyBmb3IgaW5wdXQsIHRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIGFueSBmdW5jdGlvbiBhc3NpZ25lZCB0bwordGhlIEBjb2Rle3JsX2V2ZW50X2hvb2t9IHZhcmlhYmxlLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9nZXRjIChGSUxFICpzdHJlYW0pCitSZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGF2YWlsYWJsZSBmcm9tIEB2YXJ7c3RyZWFtfSwgd2hpY2ggaXMgYXNzdW1lZCB0bworYmUgdGhlIGtleWJvYXJkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9zdHVmZl9jaGFyIChpbnQgYykKK0luc2VydCBAdmFye2N9IGludG8gdGhlIFJlYWRsaW5lIGlucHV0IHN0cmVhbS4gIEl0IHdpbGwgYmUgInJlYWQiCitiZWZvcmUgUmVhZGxpbmUgYXR0ZW1wdHMgdG8gcmVhZCBjaGFyYWN0ZXJzIGZyb20gdGhlIHRlcm1pbmFsIHdpdGgKK0Bjb2Rle3JsX3JlYWRfa2V5KCl9LiAgVXAgdG8gNTEyIGNoYXJhY3RlcnMgbWF5IGJlIHB1c2hlZCBiYWNrLgorQGNvZGV7cmxfc3R1ZmZfY2hhcn0gcmV0dXJucyAxIGlmIHRoZSBjaGFyYWN0ZXIgd2FzIHN1Y2Nlc3NmdWxseSBpbnNlcnRlZDsKKzAgb3RoZXJ3aXNlLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9leGVjdXRlX25leHQgKGludCBjKQorTWFrZSBAdmFye2N9IGJlIHRoZSBuZXh0IGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgd2hlbiBAY29kZXtybF9yZWFkX2tleSgpfQoraXMgY2FsbGVkLiAgVGhpcyBzZXRzIEB2YXJ7cmxfcGVuZGluZ19pbnB1dH0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX2NsZWFyX3BlbmRpbmdfaW5wdXQgKHZvaWQpCitVbnNldCBAdmFye3JsX3BlbmRpbmdfaW5wdXR9LCBlZmZlY3RpdmVseSBuZWdhdGluZyB0aGUgZWZmZWN0IG9mIGFueQorcHJldmlvdXMgY2FsbCB0byBAY29kZXtybF9leGVjdXRlX25leHQoKX0uICBUaGlzIHdvcmtzIG9ubHkgaWYgdGhlCitwZW5kaW5nIGlucHV0IGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlYWQgd2l0aCBAY29kZXtybF9yZWFkX2tleSgpfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfc2V0X2tleWJvYXJkX2lucHV0X3RpbWVvdXQgKGludCB1KQorV2hpbGUgd2FpdGluZyBmb3Iga2V5Ym9hcmQgaW5wdXQgaW4gQGNvZGV7cmxfcmVhZF9rZXkoKX0sIFJlYWRsaW5lIHdpbGwKK3dhaXQgZm9yIEB2YXJ7dX0gbWljcm9zZWNvbmRzIGZvciBpbnB1dCBiZWZvcmUgY2FsbGluZyBhbnkgZnVuY3Rpb24KK2Fzc2lnbmVkIHRvIEBjb2Rle3JsX2V2ZW50X2hvb2t9LiAgVGhlIGRlZmF1bHQgd2FpdGluZyBwZXJpb2QgaXMKK29uZS10ZW50aCBvZiBhIHNlY29uZC4gIFJldHVybnMgdGhlIG9sZCB0aW1lb3V0IHZhbHVlLgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIFRlcm1pbmFsIE1hbmFnZW1lbnQKK0BzdWJzZWN0aW9uIFRlcm1pbmFsIE1hbmFnZW1lbnQKKworQGRlZnR5cGVmdW4gdm9pZCBybF9wcmVwX3Rlcm1pbmFsIChpbnQgbWV0YV9mbGFnKQorTW9kaWZ5IHRoZSB0ZXJtaW5hbCBzZXR0aW5ncyBmb3IgUmVhZGxpbmUncyB1c2UsIHNvIEBjb2Rle3JlYWRsaW5lKCl9CitjYW4gcmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIgYXQgYSB0aW1lIGZyb20gdGhlIGtleWJvYXJkLgorVGhlIEB2YXJ7bWV0YV9mbGFnfSBhcmd1bWVudCBzaG91bGQgYmUgbm9uLXplcm8gaWYgUmVhZGxpbmUgc2hvdWxkCityZWFkIGVpZ2h0LWJpdCBpbnB1dC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIHJsX2RlcHJlcF90ZXJtaW5hbCAodm9pZCkKK1VuZG8gdGhlIGVmZmVjdHMgb2YgQGNvZGV7cmxfcHJlcF90ZXJtaW5hbCgpfSwgbGVhdmluZyB0aGUgdGVybWluYWwgaW4KK3RoZSBzdGF0ZSBpbiB3aGljaCBpdCB3YXMgYmVmb3JlIHRoZSBtb3N0IHJlY2VudCBjYWxsIHRvCitAY29kZXtybF9wcmVwX3Rlcm1pbmFsKCl9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgcmxfdHR5X3NldF9kZWZhdWx0X2JpbmRpbmdzIChLZXltYXAga21hcCkKK1JlYWQgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyB0ZXJtaW5hbCBlZGl0aW5nIGNoYXJhY3RlcnMgKGFzIHdvdWxkIGJlCitkaXNwbGF5ZWQgYnkgQGNvZGV7c3R0eX0pIHRvIHRoZWlyIFJlYWRsaW5lIGVxdWl2YWxlbnRzLgorVGhlIGJpbmRpbmdzIGFyZSBwZXJmb3JtZWQgaW4gQHZhcntrbWFwfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIHJsX3R0eV91bnNldF9kZWZhdWx0X2JpbmRpbmdzIChLZXltYXAga21hcCkKK1Jlc2V0IHRoZSBiaW5kaW5ncyBtYW5pcHVsYXRlZCBieSBAY29kZXtybF90dHlfc2V0X2RlZmF1bHRfYmluZGluZ3N9IHNvCit0aGF0IHRoZSB0ZXJtaW5hbCBlZGl0aW5nIGNoYXJhY3RlcnMgYXJlIGJvdW5kIHRvIEBjb2Rle3JsX2luc2VydH0uCitUaGUgYmluZGluZ3MgYXJlIHBlcmZvcm1lZCBpbiBAdmFye2ttYXB9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9yZXNldF90ZXJtaW5hbCAoY29uc3QgY2hhciAqdGVybWluYWxfbmFtZSkKK1JlaW5pdGlhbGl6ZSBSZWFkbGluZSdzIGlkZWEgb2YgdGhlIHRlcm1pbmFsIHNldHRpbmdzIHVzaW5nCitAdmFye3Rlcm1pbmFsX25hbWV9IGFzIHRoZSB0ZXJtaW5hbCB0eXBlIChlLmcuLCBAY29kZXt2dDEwMH0pLgorSWYgQHZhcnt0ZXJtaW5hbF9uYW1lfSBpcyBAY29kZXtOVUxMfSwgdGhlIHZhbHVlIG9mIHRoZSBAY29kZXtURVJNfQorZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBVdGlsaXR5IEZ1bmN0aW9ucworQHN1YnNlY3Rpb24gVXRpbGl0eSBGdW5jdGlvbnMKKworQGRlZnR5cGVmdW4gdm9pZCBybF9yZXBsYWNlX2xpbmUgKGNvbnN0IGNoYXIgKnRleHQsIGludCBjbGVhcl91bmRvKQorUmVwbGFjZSB0aGUgY29udGVudHMgb2YgQGNvZGV7cmxfbGluZV9idWZmZXJ9IHdpdGggQHZhcnt0ZXh0fS4KK1RoZSBwb2ludCBhbmQgbWFyayBhcmUgcHJlc2VydmVkLCBpZiBwb3NzaWJsZS4KK0lmIEB2YXJ7Y2xlYXJfdW5kb30gaXMgbm9uLXplcm8sIHRoZSB1bmRvIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZQorY3VycmVudCBsaW5lIGlzIGNsZWFyZWQuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX2V4dGVuZF9saW5lX2J1ZmZlciAoaW50IGxlbikKK0Vuc3VyZSB0aGF0IEBjb2Rle3JsX2xpbmVfYnVmZmVyfSBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQgQHZhcntsZW59CitjaGFyYWN0ZXJzLCBwb3NzaWJseSByZWFsbG9jYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9pbml0aWFsaXplICh2b2lkKQorSW5pdGlhbGl6ZSBvciByZS1pbml0aWFsaXplIFJlYWRsaW5lJ3MgaW50ZXJuYWwgc3RhdGUuCitJdCdzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgdG8gY2FsbCB0aGlzOyBAY29kZXtyZWFkbGluZSgpfSBjYWxscyBpdCBiZWZvcmUKK3JlYWRpbmcgYW55IGlucHV0LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9kaW5nICh2b2lkKQorUmluZyB0aGUgdGVybWluYWwgYmVsbCwgb2JleWluZyB0aGUgc2V0dGluZyBvZiBAY29kZXtiZWxsLXN0eWxlfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfYWxwaGFiZXRpYyAoaW50IGMpCitSZXR1cm4gMSBpZiBAdmFye2N9IGlzIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgcmxfZGlzcGxheV9tYXRjaF9saXN0IChjaGFyICoqbWF0Y2hlcywgaW50IGxlbiwgaW50IG1heCkKK0EgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGRpc3BsYXlpbmcgYSBsaXN0IG9mIHN0cmluZ3MgaW4KK2NvbHVtbmFyIGZvcm1hdCBvbiBSZWFkbGluZSdzIG91dHB1dCBzdHJlYW0uICBAY29kZXttYXRjaGVzfSBpcyB0aGUgbGlzdAorb2Ygc3RyaW5ncywgaW4gYXJndiBmb3JtYXQsIHN1Y2ggYXMgYSBsaXN0IG9mIGNvbXBsZXRpb24gbWF0Y2hlcy4KK0Bjb2Rle2xlbn0gaXMgdGhlIG51bWJlciBvZiBzdHJpbmdzIGluIEBjb2Rle21hdGNoZXN9LCBhbmQgQGNvZGV7bWF4fQoraXMgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBzdHJpbmcgaW4gQGNvZGV7bWF0Y2hlc30uICBUaGlzIGZ1bmN0aW9uIHVzZXMKK3RoZSBzZXR0aW5nIG9mIEBjb2Rle3ByaW50LWNvbXBsZXRpb25zLWhvcml6b250YWxseX0gdG8gc2VsZWN0IGhvdyB0aGUKK21hdGNoZXMgYXJlIGRpc3BsYXllZCAoQHB4cmVme1JlYWRsaW5lIEluaXQgRmlsZSBTeW50YXh9KS4KK0BlbmQgZGVmdHlwZWZ1bgorCitUaGUgZm9sbG93aW5nIGFyZSBpbXBsZW1lbnRlZCBhcyBtYWNyb3MsIGRlZmluZWQgaW4gQGNvZGV7Y2hhcmRlZnMuaH0uCitBcHBsaWNhdGlvbnMgc2hvdWxkIHJlZnJhaW4gZnJvbSB1c2luZyB0aGVtLgorCitAZGVmdHlwZWZ1biBpbnQgX3JsX3VwcGVyY2FzZV9wIChpbnQgYykKK1JldHVybiAxIGlmIEB2YXJ7Y30gaXMgYW4gdXBwZXJjYXNlIGFscGhhYmV0aWMgY2hhcmFjdGVyLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBfcmxfbG93ZXJjYXNlX3AgKGludCBjKQorUmV0dXJuIDEgaWYgQHZhcntjfSBpcyBhIGxvd2VyY2FzZSBhbHBoYWJldGljIGNoYXJhY3Rlci4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgX3JsX2RpZ2l0X3AgKGludCBjKQorUmV0dXJuIDEgaWYgQHZhcntjfSBpcyBhIG51bWVyaWMgY2hhcmFjdGVyLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBfcmxfdG9fdXBwZXIgKGludCBjKQorSWYgQHZhcntjfSBpcyBhIGxvd2VyY2FzZSBhbHBoYWJldGljIGNoYXJhY3RlciwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCit1cHBlcmNhc2UgY2hhcmFjdGVyLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBfcmxfdG9fbG93ZXIgKGludCBjKQorSWYgQHZhcntjfSBpcyBhbiB1cHBlcmNhc2UgYWxwaGFiZXRpYyBjaGFyYWN0ZXIsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZworbG93ZXJjYXNlIGNoYXJhY3Rlci4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgX3JsX2RpZ2l0X3ZhbHVlIChpbnQgYykKK0lmIEB2YXJ7Y30gaXMgYSBudW1iZXIsIHJldHVybiB0aGUgdmFsdWUgaXQgcmVwcmVzZW50cy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBNaXNjZWxsYW5lb3VzIEZ1bmN0aW9ucworQHN1YnNlY3Rpb24gTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMKKworQGRlZnR5cGVmdW4gaW50IHJsX21hY3JvX2JpbmQgKGNvbnN0IGNoYXIgKmtleXNlcSwgY29uc3QgY2hhciAqbWFjcm8sIEtleW1hcCBtYXApCitCaW5kIHRoZSBrZXkgc2VxdWVuY2UgQHZhcntrZXlzZXF9IHRvIGludm9rZSB0aGUgbWFjcm8gQHZhcnttYWNyb30uCitUaGUgYmluZGluZyBpcyBwZXJmb3JtZWQgaW4gQHZhcnttYXB9LiAgV2hlbiBAdmFye2tleXNlcX0gaXMgaW52b2tlZCwgdGhlCitAdmFye21hY3JvfSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGxpbmUuICBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQ7Cit1c2UgQGNvZGV7cmxfZ2VuZXJpY19iaW5kKCl9IGluc3RlYWQuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBybF9tYWNyb19kdW1wZXIgKGludCByZWFkYWJsZSkKK1ByaW50IHRoZSBrZXkgc2VxdWVuY2VzIGJvdW5kIHRvIG1hY3JvcyBhbmQgdGhlaXIgdmFsdWVzLCB1c2luZwordGhlIGN1cnJlbnQga2V5bWFwLCB0byBAY29kZXtybF9vdXRzdHJlYW19LgorSWYgQHZhcntyZWFkYWJsZX0gaXMgbm9uLXplcm8sIHRoZSBsaXN0IGlzIGZvcm1hdHRlZCBpbiBzdWNoIGEgd2F5Cit0aGF0IGl0IGNhbiBiZSBtYWRlIHBhcnQgb2YgYW4gQGNvZGV7aW5wdXRyY30gZmlsZSBhbmQgcmUtcmVhZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfdmFyaWFibGVfYmluZCAoY29uc3QgY2hhciAqdmFyaWFibGUsIGNvbnN0IGNoYXIgKnZhbHVlKQorTWFrZSB0aGUgUmVhZGxpbmUgdmFyaWFibGUgQHZhcnt2YXJpYWJsZX0gaGF2ZSBAdmFye3ZhbHVlfS4KK1RoaXMgYmVoYXZlcyBhcyBpZiB0aGUgcmVhZGxpbmUgY29tbWFuZAorQHNhbXB7c2V0IEB2YXJ7dmFyaWFibGV9IEB2YXJ7dmFsdWV9fSBoYWQgYmVlbiBleGVjdXRlZCBpbiBhbiBAY29kZXtpbnB1dHJjfQorZmlsZSAoQHB4cmVme1JlYWRsaW5lIEluaXQgRmlsZSBTeW50YXh9KS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7Y2hhciAqfSBybF92YXJpYWJsZV92YWx1ZSAoY29uc3QgY2hhciAqdmFyaWFibGUpCitSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgUmVhZGxpbmUgdmFyaWFibGUgQHZhcnt2YXJpYWJsZX0uCitGb3IgYm9vbGVhbiB2YXJpYWJsZXMsIHRoaXMgc3RyaW5nIGlzIGVpdGhlciBAc2FtcHtvbn0gb3IgQHNhbXB7b2ZmfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIHJsX3ZhcmlhYmxlX2R1bXBlciAoaW50IHJlYWRhYmxlKQorUHJpbnQgdGhlIHJlYWRsaW5lIHZhcmlhYmxlIG5hbWVzIGFuZCB0aGVpciBjdXJyZW50IHZhbHVlcwordG8gQGNvZGV7cmxfb3V0c3RyZWFtfS4KK0lmIEB2YXJ7cmVhZGFibGV9IGlzIG5vbi16ZXJvLCB0aGUgbGlzdCBpcyBmb3JtYXR0ZWQgaW4gc3VjaCBhIHdheQordGhhdCBpdCBjYW4gYmUgbWFkZSBwYXJ0IG9mIGFuIEBjb2Rle2lucHV0cmN9IGZpbGUgYW5kIHJlLXJlYWQuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX3NldF9wYXJlbl9ibGlua190aW1lb3V0IChpbnQgdSkKK1NldCB0aGUgdGltZSBpbnRlcnZhbCAoaW4gbWljcm9zZWNvbmRzKSB0aGF0IFJlYWRsaW5lIHdhaXRzIHdoZW4gc2hvd2luZworYSBiYWxhbmNpbmcgY2hhcmFjdGVyIHdoZW4gQGNvZGV7YmxpbmstbWF0Y2hpbmctcGFyZW59IGhhcyBiZWVuIGVuYWJsZWQuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge2NoYXIgKn0gcmxfZ2V0X3Rlcm1jYXAgKGNvbnN0IGNoYXIgKmNhcCkKK1JldHJpZXZlIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHRlcm1jYXAgY2FwYWJpbGl0eSBAdmFye2NhcH0uCitSZWFkbGluZSBmZXRjaGVzIHRoZSB0ZXJtY2FwIGVudHJ5IGZvciB0aGUgY3VycmVudCB0ZXJtaW5hbCBuYW1lIGFuZAordXNlcyB0aG9zZSBjYXBhYmlsaXRpZXMgdG8gbW92ZSBhcm91bmQgdGhlIHNjcmVlbiBsaW5lIGFuZCBwZXJmb3JtIG90aGVyCit0ZXJtaW5hbC1zcGVjaWZpYyBvcGVyYXRpb25zLCBsaWtlIGVyYXNpbmcgYSBsaW5lLiAgUmVhZGxpbmUgZG9lcyBub3QKK3VzZSBhbGwgb2YgYSB0ZXJtaW5hbCdzIGNhcGFiaWxpdGllcywgYW5kIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KK3ZhbHVlcyBmb3Igb25seSB0aG9zZSBjYXBhYmlsaXRpZXMgUmVhZGxpbmUgdXNlcy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBBbHRlcm5hdGUgSW50ZXJmYWNlCitAc3Vic2VjdGlvbiBBbHRlcm5hdGUgSW50ZXJmYWNlCisKK0FuIGFsdGVybmF0ZSBpbnRlcmZhY2UgaXMgYXZhaWxhYmxlIHRvIHBsYWluIEBjb2Rle3JlYWRsaW5lKCl9LiAgU29tZQorYXBwbGljYXRpb25zIG5lZWQgdG8gaW50ZXJsZWF2ZSBrZXlib2FyZCBJL08gd2l0aCBmaWxlLCBkZXZpY2UsIG9yCit3aW5kb3cgc3lzdGVtIEkvTywgdHlwaWNhbGx5IGJ5IHVzaW5nIGEgbWFpbiBsb29wIHRvIEBjb2Rle3NlbGVjdCgpfQorb24gdmFyaW91cyBmaWxlIGRlc2NyaXB0b3JzLiAgVG8gYWNjb21vZGF0ZSB0aGlzIG5lZWQsIHJlYWRsaW5lIGNhbgorYWxzbyBiZSBpbnZva2VkIGFzIGEgYGNhbGxiYWNrJyBmdW5jdGlvbiBmcm9tIGFuIGV2ZW50IGxvb3AuICBUaGVyZQorYXJlIGZ1bmN0aW9ucyBhdmFpbGFibGUgdG8gbWFrZSB0aGlzIGVhc3kuCisKK0BkZWZ0eXBlZnVuIHZvaWQgcmxfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsIChjb25zdCBjaGFyICpwcm9tcHQsIHJsX3ZjcGZ1bmNfdCAqbGhhbmRsZXIpCitTZXQgdXAgdGhlIHRlcm1pbmFsIGZvciByZWFkbGluZSBJL08gYW5kIGRpc3BsYXkgdGhlIGluaXRpYWwKK2V4cGFuZGVkIHZhbHVlIG9mIEB2YXJ7cHJvbXB0fS4gIFNhdmUgdGhlIHZhbHVlIG9mIEB2YXJ7bGhhbmRsZXJ9IHRvCit1c2UgYXMgYSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYSBjb21wbGV0ZSBsaW5lIG9mIGlucHV0IGhhcyBiZWVuIGVudGVyZWQuCitUaGUgZnVuY3Rpb24gdGFrZXMgdGhlIHRleHQgb2YgdGhlIGxpbmUgYXMgYW4gYXJndW1lbnQuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBybF9jYWxsYmFja19yZWFkX2NoYXIgKHZvaWQpCitXaGVuZXZlciBhbiBhcHBsaWNhdGlvbiBkZXRlcm1pbmVzIHRoYXQga2V5Ym9hcmQgaW5wdXQgaXMgYXZhaWxhYmxlLCBpdAorc2hvdWxkIGNhbGwgQGNvZGV7cmxfY2FsbGJhY2tfcmVhZF9jaGFyKCl9LCB3aGljaCB3aWxsIHJlYWQgdGhlIG5leHQKK2NoYXJhY3RlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHNvdXJjZS4KK0lmIHRoYXQgY2hhcmFjdGVyIGNvbXBsZXRlcyB0aGUgbGluZSwgQGNvZGV7cmxfY2FsbGJhY2tfcmVhZF9jaGFyfSB3aWxsCitpbnZva2UgdGhlIEB2YXJ7bGhhbmRsZXJ9IGZ1bmN0aW9uIHNhdmVkIGJ5IEBjb2Rle3JsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbH0KK3RvIHByb2Nlc3MgdGhlIGxpbmUuCitCZWZvcmUgY2FsbGluZyB0aGUgQHZhcntsaGFuZGxlcn0gZnVuY3Rpb24sIHRoZSB0ZXJtaW5hbCBzZXR0aW5ncyBhcmUKK3Jlc2V0IHRvIHRoZSB2YWx1ZXMgdGhleSBoYWQgYmVmb3JlIGNhbGxpbmcKK0Bjb2Rle3JsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbH0uCitJZiB0aGUgQHZhcntsaGFuZGxlcn0gZnVuY3Rpb24gcmV0dXJucywKK3RoZSB0ZXJtaW5hbCBzZXR0aW5ncyBhcmUgbW9kaWZpZWQgZm9yIFJlYWRsaW5lJ3MgdXNlIGFnYWluLgorQGNvZGV7RU9GfSBpcyAgaW5kaWNhdGVkIGJ5IGNhbGxpbmcgQHZhcntsaGFuZGxlcn0gd2l0aCBhCitAY29kZXtOVUxMfSBsaW5lLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgcmxfY2FsbGJhY2tfaGFuZGxlcl9yZW1vdmUgKHZvaWQpCitSZXN0b3JlIHRoZSB0ZXJtaW5hbCB0byBpdHMgaW5pdGlhbCBzdGF0ZSBhbmQgcmVtb3ZlIHRoZSBsaW5lIGhhbmRsZXIuCitUaGlzIG1heSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBjYWxsYmFjayBhcyB3ZWxsIGFzIGluZGVwZW5kZW50bHkuCitJZiB0aGUgQHZhcntsaGFuZGxlcn0gaW5zdGFsbGVkIGJ5IEBjb2Rle3JsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbH0KK2RvZXMgbm90IGV4aXQgdGhlIHByb2dyYW0sIGVpdGhlciB0aGlzIGZ1bmN0aW9uIG9yIHRoZSBmdW5jdGlvbiByZWZlcnJlZAordG8gYnkgdGhlIHZhbHVlIG9mIEBjb2Rle3JsX2RlcHJlcF90ZXJtX2Z1bmN0aW9ufSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZQordGhlIHByb2dyYW0gZXhpdHMgdG8gcmVzZXQgdGhlIHRlcm1pbmFsIHNldHRpbmdzLgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIEEgUmVhZGxpbmUgRXhhbXBsZQorQHN1YnNlY3Rpb24gQSBSZWFkbGluZSBFeGFtcGxlCisKK0hlcmUgaXMgYSBmdW5jdGlvbiB3aGljaCBjaGFuZ2VzIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIHRvIHRoZWlyIHVwcGVyY2FzZQorZXF1aXZhbGVudHMsIGFuZCB1cHBlcmNhc2UgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UuICBJZgordGhpcyBmdW5jdGlvbiB3YXMgYm91bmQgdG8gQHNhbXB7TS1jfSwgdGhlbiB0eXBpbmcgQHNhbXB7TS1jfSB3b3VsZAorY2hhbmdlIHRoZSBjYXNlIG9mIHRoZSBjaGFyYWN0ZXIgdW5kZXIgcG9pbnQuICBUeXBpbmcgQHNhbXB7TS0xIDAgTS1jfQord291bGQgY2hhbmdlIHRoZSBjYXNlIG9mIHRoZSBmb2xsb3dpbmcgMTAgY2hhcmFjdGVycywgbGVhdmluZyB0aGUgY3Vyc29yIG9uCit0aGUgbGFzdCBjaGFyYWN0ZXIgY2hhbmdlZC4KKworQGV4YW1wbGUKKy8qIEludmVydCB0aGUgY2FzZSBvZiB0aGUgQ09VTlQgZm9sbG93aW5nIGNoYXJhY3RlcnMuICovCitpbnQKK2ludmVydF9jYXNlX2xpbmUgKGNvdW50LCBrZXkpCisgICAgIGludCBjb3VudCwga2V5OworQHsKKyAgcmVnaXN0ZXIgaW50IHN0YXJ0LCBlbmQsIGk7CisKKyAgc3RhcnQgPSBybF9wb2ludDsKKworICBpZiAocmxfcG9pbnQgPj0gcmxfZW5kKQorICAgIHJldHVybiAoMCk7CisKKyAgaWYgKGNvdW50IDwgMCkKKyAgICBAeworICAgICAgZGlyZWN0aW9uID0gLTE7CisgICAgICBjb3VudCA9IC1jb3VudDsKKyAgICBAfQorICBlbHNlCisgICAgZGlyZWN0aW9uID0gMTsKKyAgICAgIAorICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIG1vZGlmeS4gKi8KKyAgZW5kID0gc3RhcnQgKyAoY291bnQgKiBkaXJlY3Rpb24pOworCisgIC8qIEZvcmNlIGl0IHRvIGJlIHdpdGhpbiByYW5nZS4gKi8KKyAgaWYgKGVuZCA+IHJsX2VuZCkKKyAgICBlbmQgPSBybF9lbmQ7CisgIGVsc2UgaWYgKGVuZCA8IDApCisgICAgZW5kID0gMDsKKworICBpZiAoc3RhcnQgPT0gZW5kKQorICAgIHJldHVybiAoMCk7CisKKyAgaWYgKHN0YXJ0ID4gZW5kKQorICAgIEB7CisgICAgICBpbnQgdGVtcCA9IHN0YXJ0OworICAgICAgc3RhcnQgPSBlbmQ7CisgICAgICBlbmQgPSB0ZW1wOworICAgIEB9CisKKyAgLyogVGVsbCByZWFkbGluZSB0aGF0IHdlIGFyZSBtb2RpZnlpbmcgdGhlIGxpbmUsCisgICAgIHNvIGl0IHdpbGwgc2F2ZSB0aGUgdW5kbyBpbmZvcm1hdGlvbi4gKi8KKyAgcmxfbW9kaWZ5aW5nIChzdGFydCwgZW5kKTsKKworICBmb3IgKGkgPSBzdGFydDsgaSAhPSBlbmQ7IGkrKykKKyAgICBAeworICAgICAgaWYgKF9ybF91cHBlcmNhc2VfcCAocmxfbGluZV9idWZmZXJbaV0pKQorICAgICAgICBybF9saW5lX2J1ZmZlcltpXSA9IF9ybF90b19sb3dlciAocmxfbGluZV9idWZmZXJbaV0pOworICAgICAgZWxzZSBpZiAoX3JsX2xvd2VyY2FzZV9wIChybF9saW5lX2J1ZmZlcltpXSkpCisgICAgICAgIHJsX2xpbmVfYnVmZmVyW2ldID0gX3JsX3RvX3VwcGVyIChybF9saW5lX2J1ZmZlcltpXSk7CisgICAgQH0KKyAgLyogTW92ZSBwb2ludCB0byBvbiB0b3Agb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGNoYW5nZWQuICovCisgIHJsX3BvaW50ID0gKGRpcmVjdGlvbiA9PSAxKSA/IGVuZCAtIDEgOiBzdGFydDsKKyAgcmV0dXJuICgwKTsKK0B9CitAZW5kIGV4YW1wbGUKKworQG5vZGUgUmVhZGxpbmUgU2lnbmFsIEhhbmRsaW5nCitAc2VjdGlvbiBSZWFkbGluZSBTaWduYWwgSGFuZGxpbmcKKworU2lnbmFscyBhcmUgYXN5bmNocm9ub3VzIGV2ZW50cyBzZW50IHRvIGEgcHJvY2VzcyBieSB0aGUgVW5peCBrZXJuZWwsCitzb21ldGltZXMgb24gYmVoYWxmIG9mIGFub3RoZXIgcHJvY2Vzcy4gIFRoZXkgYXJlIGludGVuZGVkIHRvIGluZGljYXRlCitleGNlcHRpb25hbCBldmVudHMsIGxpa2UgYSB1c2VyIHByZXNzaW5nIHRoZSBpbnRlcnJ1cHQga2V5IG9uIGhpcyB0ZXJtaW5hbCwKK29yIGEgbmV0d29yayBjb25uZWN0aW9uIGJlaW5nIGJyb2tlbi4gIFRoZXJlIGlzIGEgY2xhc3Mgb2Ygc2lnbmFscyB0aGF0IGNhbgorYmUgc2VudCB0byB0aGUgcHJvY2VzcyBjdXJyZW50bHkgcmVhZGluZyBpbnB1dCBmcm9tIHRoZSBrZXlib2FyZC4gIFNpbmNlCitSZWFkbGluZSBjaGFuZ2VzIHRoZSB0ZXJtaW5hbCBhdHRyaWJ1dGVzIHdoZW4gaXQgaXMgY2FsbGVkLCBpdCBuZWVkcyB0bworcGVyZm9ybSBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiBzdWNoIGEgc2lnbmFsIGlzIHJlY2VpdmVkIGluIG9yZGVyIHRvCityZXN0b3JlIHRoZSB0ZXJtaW5hbCB0byBhIHNhbmUgc3RhdGUsIG9yIHByb3ZpZGUgYXBwbGljYXRpb24gd3JpdGVycyB3aXRoCitmdW5jdGlvbnMgdG8gZG8gc28gbWFudWFsbHkuIAorCitSZWFkbGluZSBjb250YWlucyBhbiBpbnRlcm5hbCBzaWduYWwgaGFuZGxlciB0aGF0IGlzIGluc3RhbGxlZCBmb3IgYQorbnVtYmVyIG9mIHNpZ25hbHMgKEBjb2Rle1NJR0lOVH0sIEBjb2Rle1NJR1FVSVR9LCBAY29kZXtTSUdURVJNfSwKK0Bjb2Rle1NJR0FMUk19LCBAY29kZXtTSUdUU1RQfSwgQGNvZGV7U0lHVFRJTn0sIGFuZCBAY29kZXtTSUdUVE9VfSkuCitXaGVuIG9uZSBvZiB0aGVzZSBzaWduYWxzIGlzIHJlY2VpdmVkLCB0aGUgc2lnbmFsIGhhbmRsZXIKK3dpbGwgcmVzZXQgdGhlIHRlcm1pbmFsIGF0dHJpYnV0ZXMgdG8gdGhvc2UgdGhhdCB3ZXJlIGluIGVmZmVjdCBiZWZvcmUKK0Bjb2Rle3JlYWRsaW5lKCl9IHdhcyBjYWxsZWQsIHJlc2V0IHRoZSBzaWduYWwgaGFuZGxpbmcgdG8gd2hhdCBpdCB3YXMKK2JlZm9yZSBAY29kZXtyZWFkbGluZSgpfSB3YXMgY2FsbGVkLCBhbmQgcmVzZW5kIHRoZSBzaWduYWwgdG8gdGhlIGNhbGxpbmcKK2FwcGxpY2F0aW9uLgorSWYgYW5kIHdoZW4gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24ncyBzaWduYWwgaGFuZGxlciByZXR1cm5zLCBSZWFkbGluZQord2lsbCByZWluaXRpYWxpemUgdGhlIHRlcm1pbmFsIGFuZCBjb250aW51ZSB0byBhY2NlcHQgaW5wdXQuCitXaGVuIGEgQGNvZGV7U0lHSU5UfSBpcyByZWNlaXZlZCwgdGhlIFJlYWRsaW5lIHNpZ25hbCBoYW5kbGVyIHBlcmZvcm1zCitzb21lIGFkZGl0aW9uYWwgd29yaywgd2hpY2ggd2lsbCBjYXVzZSBhbnkgcGFydGlhbGx5LWVudGVyZWQgbGluZSB0byBiZQorYWJvcnRlZCAoc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBAY29kZXtybF9mcmVlX2xpbmVfc3RhdGUoKX0gYmVsb3cpLgorCitUaGVyZSBpcyBhbiBhZGRpdGlvbmFsIFJlYWRsaW5lIHNpZ25hbCBoYW5kbGVyLCBmb3IgQGNvZGV7U0lHV0lOQ0h9LCB3aGljaAordGhlIGtlcm5lbCBzZW5kcyB0byBhIHByb2Nlc3Mgd2hlbmV2ZXIgdGhlIHRlcm1pbmFsJ3Mgc2l6ZSBjaGFuZ2VzIChmb3IKK2V4YW1wbGUsIGlmIGEgdXNlciByZXNpemVzIGFuIEBjb2Rle3h0ZXJtfSkuICBUaGUgUmVhZGxpbmUgQGNvZGV7U0lHV0lOQ0h9CitoYW5kbGVyIHVwZGF0ZXMgUmVhZGxpbmUncyBpbnRlcm5hbCBzY3JlZW4gc2l6ZSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gY2FsbHMKK2FueSBAY29kZXtTSUdXSU5DSH0gc2lnbmFsIGhhbmRsZXIgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gaGFzIGluc3RhbGxlZC4gCitSZWFkbGluZSBjYWxscyB0aGUgYXBwbGljYXRpb24ncyBAY29kZXtTSUdXSU5DSH0gc2lnbmFsIGhhbmRsZXIgd2l0aG91dAorcmVzZXR0aW5nIHRoZSB0ZXJtaW5hbCB0byBpdHMgb3JpZ2luYWwgc3RhdGUuICBJZiB0aGUgYXBwbGljYXRpb24ncyBzaWduYWwKK2hhbmRsZXIgZG9lcyBtb3JlIHRoYW4gdXBkYXRlIGl0cyBpZGVhIG9mIHRoZSB0ZXJtaW5hbCBzaXplIGFuZCByZXR1cm4gKGZvcgorZXhhbXBsZSwgYSBAY29kZXtsb25nam1wfSBiYWNrIHRvIGEgbWFpbiBwcm9jZXNzaW5nIGxvb3ApLCBpdCBAZW1waHttdXN0fQorY2FsbCBAY29kZXtybF9jbGVhbnVwX2FmdGVyX3NpZ25hbCgpfSAoZGVzY3JpYmVkIGJlbG93KSwgdG8gcmVzdG9yZSB0aGUKK3Rlcm1pbmFsIHN0YXRlLiAKKworUmVhZGxpbmUgcHJvdmlkZXMgdHdvIHZhcmlhYmxlcyB0aGF0IGFsbG93IGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8KK2NvbnRyb2wgd2hldGhlciBvciBub3QgaXQgd2lsbCBjYXRjaCBjZXJ0YWluIHNpZ25hbHMgYW5kIGFjdCBvbiB0aGVtCit3aGVuIHRoZXkgYXJlIHJlY2VpdmVkLiAgSXQgaXMgaW1wb3J0YW50IHRoYXQgYXBwbGljYXRpb25zIGNoYW5nZSB0aGUKK3ZhbHVlcyBvZiB0aGVzZSB2YXJpYWJsZXMgb25seSB3aGVuIGNhbGxpbmcgQGNvZGV7cmVhZGxpbmUoKX0sIG5vdCBpbgorYSBzaWduYWwgaGFuZGxlciwgc28gUmVhZGxpbmUncyBpbnRlcm5hbCBzaWduYWwgc3RhdGUgaXMgbm90IGNvcnJ1cHRlZC4KKworQGRlZnR5cGV2YXIgaW50IHJsX2NhdGNoX3NpZ25hbHMKK0lmIHRoaXMgdmFyaWFibGUgaXMgbm9uLXplcm8sIFJlYWRsaW5lIHdpbGwgaW5zdGFsbCBzaWduYWwgaGFuZGxlcnMgZm9yCitAY29kZXtTSUdJTlR9LCBAY29kZXtTSUdRVUlUfSwgQGNvZGV7U0lHVEVSTX0sIEBjb2Rle1NJR0FMUk19LAorQGNvZGV7U0lHVFNUUH0sIEBjb2Rle1NJR1RUSU59LCBhbmQgQGNvZGV7U0lHVFRPVX0uCisKK1RoZSBkZWZhdWx0IHZhbHVlIG9mIEBjb2Rle3JsX2NhdGNoX3NpZ25hbHN9IGlzIDEuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgaW50IHJsX2NhdGNoX3NpZ3dpbmNoCitJZiB0aGlzIHZhcmlhYmxlIGlzIG5vbi16ZXJvLCBSZWFkbGluZSB3aWxsIGluc3RhbGwgYSBzaWduYWwgaGFuZGxlciBmb3IKK0Bjb2Rle1NJR1dJTkNIfS4KKworVGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7cmxfY2F0Y2hfc2lnd2luY2h9IGlzIDEuCitAZW5kIGRlZnR5cGV2YXIKKworSWYgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgd2lzaCB0byBoYXZlIFJlYWRsaW5lIGNhdGNoIGFueSBzaWduYWxzLCBvcgordG8gaGFuZGxlIHNpZ25hbHMgb3RoZXIgdGhhbiB0aG9zZSBSZWFkbGluZSBjYXRjaGVzIChAY29kZXtTSUdIVVB9LAorZm9yIGV4YW1wbGUpLCAKK1JlYWRsaW5lIHByb3ZpZGVzIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBkbyB0aGUgbmVjZXNzYXJ5IHRlcm1pbmFsCithbmQgaW50ZXJuYWwgc3RhdGUgY2xlYW51cCB1cG9uIHJlY2VpcHQgb2YgYSBzaWduYWwuCisKK0BkZWZ0eXBlZnVuIHZvaWQgcmxfY2xlYW51cF9hZnRlcl9zaWduYWwgKHZvaWQpCitUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSB0ZXJtaW5hbCB0byB3aGF0IGl0IHdhcyBiZWZvcmUKK0Bjb2Rle3JlYWRsaW5lKCl9IHdhcyBjYWxsZWQsIGFuZCByZW1vdmUgdGhlIFJlYWRsaW5lIHNpZ25hbCBoYW5kbGVycyBmb3IKK2FsbCBzaWduYWxzLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZiBAY29kZXtybF9jYXRjaF9zaWduYWxzfSBhbmQKK0Bjb2Rle3JsX2NhdGNoX3NpZ3dpbmNofS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIHJsX2ZyZWVfbGluZV9zdGF0ZSAodm9pZCkKK1RoaXMgd2lsbCBmcmVlIGFueSBwYXJ0aWFsIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBpbnB1dCBsaW5lCisodW5kbyBpbmZvcm1hdGlvbiwgYW55IHBhcnRpYWwgaGlzdG9yeSBlbnRyeSwgYW55IHBhcnRpYWxseS1lbnRlcmVkCitrZXlib2FyZCBtYWNybywgYW5kIGFueSBwYXJ0aWFsbHktZW50ZXJlZCBudW1lcmljIGFyZ3VtZW50KS4gIFRoaXMKK3Nob3VsZCBiZSBjYWxsZWQgYmVmb3JlIEBjb2Rle3JsX2NsZWFudXBfYWZ0ZXJfc2lnbmFsKCl9LiAgVGhlCitSZWFkbGluZSBzaWduYWwgaGFuZGxlciBmb3IgQGNvZGV7U0lHSU5UfSBjYWxscyB0aGlzIHRvIGFib3J0IHRoZQorY3VycmVudCBpbnB1dCBsaW5lLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgcmxfcmVzZXRfYWZ0ZXJfc2lnbmFsICh2b2lkKQorVGhpcyB3aWxsIHJlaW5pdGlhbGl6ZSB0aGUgdGVybWluYWwgYW5kIHJlaW5zdGFsbCBhbnkgUmVhZGxpbmUgc2lnbmFsCitoYW5kbGVycywgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgQGNvZGV7cmxfY2F0Y2hfc2lnbmFsc30gYW5kCitAY29kZXtybF9jYXRjaF9zaWd3aW5jaH0uCitAZW5kIGRlZnR5cGVmdW4KKworSWYgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgd2lzaCBSZWFkbGluZSB0byBjYXRjaCBAY29kZXtTSUdXSU5DSH0sIGl0IG1heQorY2FsbCBAY29kZXtybF9yZXNpemVfdGVybWluYWwoKX0gb3IgQGNvZGV7cmxfc2V0X3NjcmVlbl9zaXplKCl9IHRvIGZvcmNlCitSZWFkbGluZSB0byB1cGRhdGUgaXRzIGlkZWEgb2YgdGhlIHRlcm1pbmFsIHNpemUgd2hlbiBhIEBjb2Rle1NJR1dJTkNIfQoraXMgcmVjZWl2ZWQuCisKK0BkZWZ0eXBlZnVuIHZvaWQgcmxfcmVzaXplX3Rlcm1pbmFsICh2b2lkKQorVXBkYXRlIFJlYWRsaW5lJ3MgaW50ZXJuYWwgc2NyZWVuIHNpemUgYnkgcmVhZGluZyB2YWx1ZXMgZnJvbSB0aGUga2VybmVsLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgcmxfc2V0X3NjcmVlbl9zaXplIChpbnQgcm93cywgaW50IGNvbHMpCitTZXQgUmVhZGxpbmUncyBpZGVhIG9mIHRoZSB0ZXJtaW5hbCBzaXplIHRvIEB2YXJ7cm93c30gcm93cyBhbmQKK0B2YXJ7Y29sc30gY29sdW1ucy4gIElmIGVpdGhlciBAdmFye3Jvd3N9IG9yIEB2YXJ7Y29sdW1uc30gaXMgbGVzcyB0aGFuCitvciBlcXVhbCB0byAwLCBSZWFkbGluZSdzIGlkZWEgb2YgdGhhdCB0ZXJtaW5hbCBkaW1lbnNpb24gaXMgdW5jaGFuZ2VkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0lmIGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHdhbnQgdG8gaW5zdGFsbCBhIEBjb2Rle1NJR1dJTkNIfSBoYW5kbGVyLCBidXQKK2lzIHN0aWxsIGludGVyZXN0ZWQgaW4gdGhlIHNjcmVlbiBkaW1lbnNpb25zLCBSZWFkbGluZSdzIGlkZWEgb2YgdGhlIHNjcmVlbgorc2l6ZSBtYXkgYmUgcXVlcmllZC4KKworQGRlZnR5cGVmdW4gdm9pZCBybF9nZXRfc2NyZWVuX3NpemUgKGludCAqcm93cywgaW50ICpjb2xzKQorUmV0dXJuIFJlYWRsaW5lJ3MgaWRlYSBvZiB0aGUgdGVybWluYWwncyBzaXplIGluIHRoZQordmFyaWFibGVzIHBvaW50ZWQgdG8gYnkgdGhlIGFyZ3VtZW50cy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIHJsX3Jlc2V0X3NjcmVlbl9zaXplICh2b2lkKQorQ2F1c2UgUmVhZGxpbmUgdG8gcmVvYnRhaW4gdGhlIHNjcmVlbiBzaXplIGFuZCByZWNhbGN1bGF0ZSBpdHMgZGltZW5zaW9ucy4KK0BlbmQgZGVmdHlwZWZ1bgorCitUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbnN0YWxsIGFuZCByZW1vdmUgUmVhZGxpbmUncyBzaWduYWwgaGFuZGxlcnMuCisKK0BkZWZ0eXBlZnVuIGludCBybF9zZXRfc2lnbmFscyAodm9pZCkKK0luc3RhbGwgUmVhZGxpbmUncyBzaWduYWwgaGFuZGxlciBmb3IgQGNvZGV7U0lHSU5UfSwgQGNvZGV7U0lHUVVJVH0sCitAY29kZXtTSUdURVJNfSwgQGNvZGV7U0lHQUxSTX0sIEBjb2Rle1NJR1RTVFB9LCBAY29kZXtTSUdUVElOfSwKK0Bjb2Rle1NJR1RUT1V9LCBhbmQgQGNvZGV7U0lHV0lOQ0h9LCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZgorQGNvZGV7cmxfY2F0Y2hfc2lnbmFsc30gYW5kIEBjb2Rle3JsX2NhdGNoX3NpZ3dpbmNofS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfY2xlYXJfc2lnbmFscyAodm9pZCkKK1JlbW92ZSBhbGwgb2YgdGhlIFJlYWRsaW5lIHNpZ25hbCBoYW5kbGVycyBpbnN0YWxsZWQgYnkKK0Bjb2Rle3JsX3NldF9zaWduYWxzKCl9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0Bub2RlIEN1c3RvbSBDb21wbGV0ZXJzCitAc2VjdGlvbiBDdXN0b20gQ29tcGxldGVycworQGNpbmRleCBhcHBsaWNhdGlvbi1zcGVjaWZpYyBjb21wbGV0aW9uIGZ1bmN0aW9ucworCitUeXBpY2FsbHksIGEgcHJvZ3JhbSB0aGF0IHJlYWRzIGNvbW1hbmRzIGZyb20gdGhlIHVzZXIgaGFzIGEgd2F5IG9mCitkaXNhbWJpZ3VhdGluZyBjb21tYW5kcyBhbmQgZGF0YS4gIElmIHlvdXIgcHJvZ3JhbSBpcyBvbmUgb2YgdGhlc2UsIHRoZW4KK2l0IGNhbiBwcm92aWRlIGNvbXBsZXRpb24gZm9yIGNvbW1hbmRzLCBkYXRhLCBvciBib3RoLgorVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZXNjcmliZSBob3cgeW91ciBwcm9ncmFtIGFuZCBSZWFkbGluZQorY29vcGVyYXRlIHRvIHByb3ZpZGUgdGhpcyBzZXJ2aWNlLgorCitAbWVudQorKiBIb3cgQ29tcGxldGluZyBXb3Jrczo6CVRoZSBsb2dpYyB1c2VkIHRvIGRvIGNvbXBsZXRpb24uCisqIENvbXBsZXRpb24gRnVuY3Rpb25zOjoJRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IFJlYWRsaW5lLgorKiBDb21wbGV0aW9uIFZhcmlhYmxlczo6CVZhcmlhYmxlcyB3aGljaCBjb250cm9sIGNvbXBsZXRpb24uCisqIEEgU2hvcnQgQ29tcGxldGlvbiBFeGFtcGxlOjoJQW4gZXhhbXBsZSBvZiB3cml0aW5nIGNvbXBsZXRlciBzdWJyb3V0aW5lcy4KK0BlbmQgbWVudQorCitAbm9kZSBIb3cgQ29tcGxldGluZyBXb3JrcworQHN1YnNlY3Rpb24gSG93IENvbXBsZXRpbmcgV29ya3MKKworSW4gb3JkZXIgdG8gY29tcGxldGUgc29tZSB0ZXh0LCB0aGUgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zCittdXN0IGJlIGF2YWlsYWJsZS4gIFRoYXQgaXMsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBhY2N1cmF0ZWx5CitleHBhbmQgYSBwYXJ0aWFsIHdvcmQgd2l0aG91dCBrbm93aW5nIGFsbCBvZiB0aGUgcG9zc2libGUgd29yZHMKK3doaWNoIG1ha2Ugc2Vuc2UgaW4gdGhhdCBjb250ZXh0LiAgVGhlIFJlYWRsaW5lIGxpYnJhcnkgcHJvdmlkZXMKK3RoZSB1c2VyIGludGVyZmFjZSB0byBjb21wbGV0aW9uLCBhbmQgdHdvIG9mIHRoZSBtb3N0IGNvbW1vbgorY29tcGxldGlvbiBmdW5jdGlvbnM6ICBmaWxlbmFtZSBhbmQgdXNlcm5hbWUuICBGb3IgY29tcGxldGluZyBvdGhlciB0eXBlcworb2YgdGV4dCwgeW91IG11c3Qgd3JpdGUgeW91ciBvd24gY29tcGxldGlvbiBmdW5jdGlvbi4gIFRoaXMgc2VjdGlvbgorZGVzY3JpYmVzIGV4YWN0bHkgd2hhdCBzdWNoIGZ1bmN0aW9ucyBtdXN0IGRvLCBhbmQgcHJvdmlkZXMgYW4gZXhhbXBsZS4KKworVGhlcmUgYXJlIHRocmVlIG1ham9yIGZ1bmN0aW9ucyB1c2VkIHRvIHBlcmZvcm0gY29tcGxldGlvbjoKKworQGVudW1lcmF0ZQorQGl0ZW0KK1RoZSB1c2VyLWludGVyZmFjZSBmdW5jdGlvbiBAY29kZXtybF9jb21wbGV0ZSgpfS4gIFRoaXMgZnVuY3Rpb24gaXMKK2NhbGxlZCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBvdGhlciBiaW5kYWJsZSBSZWFkbGluZSBmdW5jdGlvbnM6CitAdmFye2NvdW50fSBhbmQgQHZhcntpbnZva2luZ19rZXl9LgorSXQgaXNvbGF0ZXMgdGhlIHdvcmQgdG8gYmUgY29tcGxldGVkIGFuZCBjYWxscworQGNvZGV7cmxfY29tcGxldGlvbl9tYXRjaGVzKCl9IHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucy4KK0l0IHRoZW4gZWl0aGVyIGxpc3RzIHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucywgaW5zZXJ0cyB0aGUgcG9zc2libGUKK2NvbXBsZXRpb25zLCBvciBhY3R1YWxseSBwZXJmb3JtcyB0aGUKK2NvbXBsZXRpb24sIGRlcGVuZGluZyBvbiB3aGljaCBiZWhhdmlvciBpcyBkZXNpcmVkLgorCitAaXRlbQorVGhlIGludGVybmFsIGZ1bmN0aW9uIEBjb2Rle3JsX2NvbXBsZXRpb25fbWF0Y2hlcygpfSB1c2VzIGFuCithcHBsaWNhdGlvbi1zdXBwbGllZCBAZGZue2dlbmVyYXRvcn0gZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGxpc3Qgb2YKK3Bvc3NpYmxlIG1hdGNoZXMsIGFuZCB0aGVuIHJldHVybnMgdGhlIGFycmF5IG9mIHRoZXNlIG1hdGNoZXMuCitUaGUgY2FsbGVyIHNob3VsZCBwbGFjZSB0aGUgYWRkcmVzcyBvZiBpdHMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGluCitAY29kZXtybF9jb21wbGV0aW9uX2VudHJ5X2Z1bmN0aW9ufS4KKworQGl0ZW0KK1RoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIHJlcGVhdGVkbHkgZnJvbQorQGNvZGV7cmxfY29tcGxldGlvbl9tYXRjaGVzKCl9LCByZXR1cm5pbmcgYSBzdHJpbmcgZWFjaCB0aW1lLiAgVGhlCithcmd1bWVudHMgdG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBhcmUgQHZhcnt0ZXh0fSBhbmQgQHZhcntzdGF0ZX0uCitAdmFye3RleHR9IGlzIHRoZSBwYXJ0aWFsIHdvcmQgdG8gYmUgY29tcGxldGVkLiAgQHZhcntzdGF0ZX0gaXMgemVybyB0aGUKK2ZpcnN0IHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYWxsb3dpbmcgdGhlIGdlbmVyYXRvciB0byBwZXJmb3JtCithbnkgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLCBhbmQgYSBwb3NpdGl2ZSBub24temVybyBpbnRlZ2VyIGZvcgorZWFjaCBzdWJzZXF1ZW50IGNhbGwuICBUaGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIHJldHVybnMKK0Bjb2RleyhjaGFyICopTlVMTH0gdG8gaW5mb3JtIEBjb2Rle3JsX2NvbXBsZXRpb25fbWF0Y2hlcygpfSB0aGF0IHRoZXJlIGFyZQorbm8gbW9yZSBwb3NzaWJpbGl0aWVzIGxlZnQuICBVc3VhbGx5IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gY29tcHV0ZXMgdGhlCitsaXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zIHdoZW4gQHZhcntzdGF0ZX0gaXMgemVybywgYW5kIHJldHVybnMgdGhlbQorb25lIGF0IGEgdGltZSBvbiBzdWJzZXF1ZW50IGNhbGxzLiAgRWFjaCBzdHJpbmcgdGhlIGdlbmVyYXRvciBmdW5jdGlvbgorcmV0dXJucyBhcyBhIG1hdGNoIG11c3QgYmUgYWxsb2NhdGVkIHdpdGggQGNvZGV7bWFsbG9jKCl9OyBSZWFkbGluZQorZnJlZXMgdGhlIHN0cmluZ3Mgd2hlbiBpdCBoYXMgZmluaXNoZWQgd2l0aCB0aGVtLgorU3VjaCBhIGdlbmVyYXRvciBmdW5jdGlvbiBpcyByZWZlcnJlZCB0byBhcyBhbgorQGRmbnthcHBsaWNhdGlvbi1zcGVjaWZpYyBjb21wbGV0aW9uIGZ1bmN0aW9ufS4KKworQGVuZCBlbnVtZXJhdGUKKworQGRlZnR5cGVmdW4gaW50IHJsX2NvbXBsZXRlIChpbnQgaWdub3JlLCBpbnQgaW52b2tpbmdfa2V5KQorQ29tcGxldGUgdGhlIHdvcmQgYXQgb3IgYmVmb3JlIHBvaW50LiAgWW91IGhhdmUgc3VwcGxpZWQgdGhlIGZ1bmN0aW9uCit0aGF0IGRvZXMgdGhlIGluaXRpYWwgc2ltcGxlIG1hdGNoaW5nIHNlbGVjdGlvbiBhbGdvcml0aG0gKHNlZQorQGNvZGV7cmxfY29tcGxldGlvbl9tYXRjaGVzKCl9KS4gIFRoZSBkZWZhdWx0IGlzIHRvIGRvIGZpbGVuYW1lIGNvbXBsZXRpb24uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGV2YXIge3JsX2NvbXBlbnRyeV9mdW5jX3QgKn0gcmxfY29tcGxldGlvbl9lbnRyeV9mdW5jdGlvbgorVGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBmb3IKK0Bjb2Rle3JsX2NvbXBsZXRpb25fbWF0Y2hlcygpfS4KK0lmIHRoZSB2YWx1ZSBvZiBAY29kZXtybF9jb21wbGV0aW9uX2VudHJ5X2Z1bmN0aW9ufSBpcworQGNvZGV7TlVMTH0gdGhlbiB0aGUgZGVmYXVsdCBmaWxlbmFtZSBnZW5lcmF0b3IKK2Z1bmN0aW9uLCBAY29kZXtybF9maWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uKCl9LCBpcyB1c2VkLgorQW4gQGRmbnthcHBsaWNhdGlvbi1zcGVjaWZpYyBjb21wbGV0aW9uIGZ1bmN0aW9ufSBpcyBhIGZ1bmN0aW9uIHdob3NlCithZGRyZXNzIGlzIGFzc2lnbmVkIHRvIEBjb2Rle3JsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb259IGFuZCB3aG9zZQorcmV0dXJuIHZhbHVlcyBhcmUgdXNlZCB0byAgZ2VuZXJhdGUgcG9zc2libGUgY29tcGxldGlvbnMuCitAZW5kIGRlZnR5cGV2YXIKKworQG5vZGUgQ29tcGxldGlvbiBGdW5jdGlvbnMKK0BzdWJzZWN0aW9uIENvbXBsZXRpb24gRnVuY3Rpb25zCisKK0hlcmUgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgY2FsbGFibGUgY29tcGxldGlvbiBmdW5jdGlvbnMgcHJlc2VudCBpbgorUmVhZGxpbmUuCisKK0BkZWZ0eXBlZnVuIGludCBybF9jb21wbGV0ZV9pbnRlcm5hbCAoaW50IHdoYXRfdG9fZG8pCitDb21wbGV0ZSB0aGUgd29yZCBhdCBvciBiZWZvcmUgcG9pbnQuICBAdmFye3doYXRfdG9fZG99IHNheXMgd2hhdCB0byBkbword2l0aCB0aGUgY29tcGxldGlvbi4gIEEgdmFsdWUgb2YgQHNhbXB7P30gbWVhbnMgbGlzdCB0aGUgcG9zc2libGUKK2NvbXBsZXRpb25zLiAgQHNhbXB7VEFCfSBtZWFucyBkbyBzdGFuZGFyZCBjb21wbGV0aW9uLiAgQHNhbXB7Kn0gbWVhbnMKK2luc2VydCBhbGwgb2YgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zLiAgQHNhbXB7IX0gbWVhbnMgdG8gZGlzcGxheQorYWxsIG9mIHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucywgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSwgYXMgd2VsbCBhcworcGVyZm9ybWluZyBwYXJ0aWFsIGNvbXBsZXRpb24uICBAc2FtcHtAQH0gaXMgc2ltaWxhciB0byBAc2FtcHshfSwgYnV0Citwb3NzaWJsZSBjb21wbGV0aW9ucyBhcmUgbm90IGxpc3RlZCBpZiB0aGUgcG9zc2libGUgY29tcGxldGlvbnMgc2hhcmUKK2EgY29tbW9uIHByZWZpeC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgcmxfY29tcGxldGUgKGludCBpZ25vcmUsIGludCBpbnZva2luZ19rZXkpCitDb21wbGV0ZSB0aGUgd29yZCBhdCBvciBiZWZvcmUgcG9pbnQuICBZb3UgaGF2ZSBzdXBwbGllZCB0aGUgZnVuY3Rpb24KK3RoYXQgZG9lcyB0aGUgaW5pdGlhbCBzaW1wbGUgbWF0Y2hpbmcgc2VsZWN0aW9uIGFsZ29yaXRobSAoc2VlCitAY29kZXtybF9jb21wbGV0aW9uX21hdGNoZXMoKX0gYW5kIEBjb2Rle3JsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb259KS4KK1RoZSBkZWZhdWx0IGlzIHRvIGRvIGZpbGVuYW1lCitjb21wbGV0aW9uLiAgVGhpcyBjYWxscyBAY29kZXtybF9jb21wbGV0ZV9pbnRlcm5hbCgpfSB3aXRoIGFuCithcmd1bWVudCBkZXBlbmRpbmcgb24gQHZhcntpbnZva2luZ19rZXl9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9wb3NzaWJsZV9jb21wbGV0aW9ucyAoaW50IGNvdW50LCBpbnQgaW52b2tpbmdfa2V5KQorTGlzdCB0aGUgcG9zc2libGUgY29tcGxldGlvbnMuICBTZWUgZGVzY3JpcHRpb24gb2YgQGNvZGV7cmxfY29tcGxldGUKKygpfS4gIFRoaXMgY2FsbHMgQGNvZGV7cmxfY29tcGxldGVfaW50ZXJuYWwoKX0gd2l0aCBhbiBhcmd1bWVudCBvZgorQHNhbXB7P30uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IHJsX2luc2VydF9jb21wbGV0aW9ucyAoaW50IGNvdW50LCBpbnQgaW52b2tpbmdfa2V5KQorSW5zZXJ0IHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zIGludG8gdGhlIGxpbmUsIGRlbGV0aW5nIHRoZQorcGFydGlhbGx5LWNvbXBsZXRlZCB3b3JkLiAgU2VlIGRlc2NyaXB0aW9uIG9mIEBjb2Rle3JsX2NvbXBsZXRlKCl9LgorVGhpcyBjYWxscyBAY29kZXtybF9jb21wbGV0ZV9pbnRlcm5hbCgpfSB3aXRoIGFuIGFyZ3VtZW50IG9mIEBzYW1weyp9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBybF9jb21wbGV0aW9uX21vZGUgKHJsX2NvbW1hbmRfZnVuY190ICpjZnVuYykKK1JldHVybnMgdGhlIGFwcHByaWF0ZSB2YWx1ZSB0byBwYXNzIHRvIEBjb2Rle3JsX2NvbXBsZXRlX2ludGVybmFsKCl9CitkZXBlbmRpbmcgb24gd2hldGhlciBAdmFye2NmdW5jfSB3YXMgY2FsbGVkIHR3aWNlIGluIHN1Y2Nlc3Npb24gYW5kCit0aGUgdmFsdWVzIG9mIHRoZSBAY29kZXtzaG93LWFsbC1pZi1hbWJpZ3VvdXN9IGFuZAorQGNvZGV7c2hvdy1hbGwtaWYtdW5tb2RpZmllZH0gdmFyaWFibGVzLgorQXBwbGljYXRpb24tc3BlY2lmaWMgY29tcGxldGlvbiBmdW5jdGlvbnMgbWF5IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByZXNlbnQKK3RoZSBzYW1lIGludGVyZmFjZSBhcyBAY29kZXtybF9jb21wbGV0ZSgpfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB7Y2hhciAqKn0gcmxfY29tcGxldGlvbl9tYXRjaGVzIChjb25zdCBjaGFyICp0ZXh0LCBybF9jb21wZW50cnlfZnVuY190ICplbnRyeV9mdW5jKQorUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGlzIGEgbGlzdCBvZiBjb21wbGV0aW9ucyBmb3IKK0B2YXJ7dGV4dH0uICBJZiB0aGVyZSBhcmUgbm8gY29tcGxldGlvbnMsIHJldHVybnMgQGNvZGV7TlVMTH0uCitUaGUgZmlyc3QgZW50cnkgaW4gdGhlIHJldHVybmVkIGFycmF5IGlzIHRoZSBzdWJzdGl0dXRpb24gZm9yIEB2YXJ7dGV4dH0uCitUaGUgcmVtYWluaW5nIGVudHJpZXMgYXJlIHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucy4gIFRoZSBhcnJheSBpcwordGVybWluYXRlZCB3aXRoIGEgQGNvZGV7TlVMTH0gcG9pbnRlci4KKworQHZhcntlbnRyeV9mdW5jfSBpcyBhIGZ1bmN0aW9uIG9mIHR3byBhcmdzLCBhbmQgcmV0dXJucyBhCitAY29kZXtjaGFyICp9LiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIEB2YXJ7dGV4dH0uICBUaGUgc2Vjb25kIGlzIGEKK3N0YXRlIGFyZ3VtZW50OyBpdCBpcyB6ZXJvIG9uIHRoZSBmaXJzdCBjYWxsLCBhbmQgbm9uLXplcm8gb24gc3Vic2VxdWVudAorY2FsbHMuICBAdmFye2VudHJ5X2Z1bmN9IHJldHVybnMgYSBAY29kZXtOVUxMfSAgcG9pbnRlciB0byB0aGUgY2FsbGVyCit3aGVuIHRoZXJlIGFyZSBubyBtb3JlIG1hdGNoZXMuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge2NoYXIgKn0gcmxfZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAoY29uc3QgY2hhciAqdGV4dCwgaW50IHN0YXRlKQorQSBnZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGZpbGVuYW1lIGNvbXBsZXRpb24gaW4gdGhlIGdlbmVyYWwgY2FzZS4KK0B2YXJ7dGV4dH0gaXMgYSBwYXJ0aWFsIGZpbGVuYW1lLgorVGhlIEJhc2ggc291cmNlIGlzIGEgdXNlZnVsIHJlZmVyZW5jZSBmb3Igd3JpdGluZyBhcHBsaWNhdGlvbi1zcGVjaWZpYworY29tcGxldGlvbiBmdW5jdGlvbnMgKHRoZSBCYXNoIGNvbXBsZXRpb24gZnVuY3Rpb25zIGNhbGwgdGhpcyBhbmQgb3RoZXIKK1JlYWRsaW5lIGZ1bmN0aW9ucykuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge2NoYXIgKn0gcmxfdXNlcm5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAoY29uc3QgY2hhciAqdGV4dCwgaW50IHN0YXRlKQorQSBjb21wbGV0aW9uIGdlbmVyYXRvciBmb3IgdXNlcm5hbWVzLiAgQHZhcnt0ZXh0fSBjb250YWlucyBhIHBhcnRpYWwKK3VzZXJuYW1lIHByZWNlZGVkIGJ5IGEgcmFuZG9tIGNoYXJhY3RlciAodXN1YWxseSBAc2FtcHt+fSkuICBBcyB3aXRoIGFsbAorY29tcGxldGlvbiBnZW5lcmF0b3JzLCBAdmFye3N0YXRlfSBpcyB6ZXJvIG9uIHRoZSBmaXJzdCBjYWxsIGFuZCBub24temVybworZm9yIHN1YnNlcXVlbnQgY2FsbHMuCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgQ29tcGxldGlvbiBWYXJpYWJsZXMKK0BzdWJzZWN0aW9uIENvbXBsZXRpb24gVmFyaWFibGVzCisKK0BkZWZ0eXBldmFyIHtybF9jb21wZW50cnlfZnVuY190ICp9IHJsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb24KK0EgcG9pbnRlciB0byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBAY29kZXtybF9jb21wbGV0aW9uX21hdGNoZXMoKX0uCitAY29kZXtOVUxMfSBtZWFucyB0byB1c2UgQGNvZGV7cmxfZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbigpfSwKK3RoZSBkZWZhdWx0IGZpbGVuYW1lIGNvbXBsZXRlci4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7cmxfY29tcGxldGlvbl9mdW5jX3QgKn0gcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fZnVuY3Rpb24KK0EgcG9pbnRlciB0byBhbiBhbHRlcm5hdGl2ZSBmdW5jdGlvbiB0byBjcmVhdGUgbWF0Y2hlcy4KK1RoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBAdmFye3RleHR9LCBAdmFye3N0YXJ0fSwgYW5kIEB2YXJ7ZW5kfS4KK0B2YXJ7c3RhcnR9IGFuZCBAdmFye2VuZH0gYXJlIGluZGljZXMgaW4gQGNvZGV7cmxfbGluZV9idWZmZXJ9IGRlZmluaW5nCit0aGUgYm91bmRhcmllcyBvZiBAdmFye3RleHR9LCB3aGljaCBpcyBhIGNoYXJhY3RlciBzdHJpbmcuCitJZiB0aGlzIGZ1bmN0aW9uIGV4aXN0cyBhbmQgcmV0dXJucyBAY29kZXtOVUxMfSwgb3IgaWYgdGhpcyB2YXJpYWJsZSBpcworc2V0IHRvIEBjb2Rle05VTEx9LCB0aGVuIEBjb2Rle3JsX2NvbXBsZXRlKCl9IHdpbGwgY2FsbCB0aGUgdmFsdWUgb2YKK0Bjb2Rle3JsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb259IHRvIGdlbmVyYXRlIG1hdGNoZXMsIG90aGVyd2lzZSB0aGUKK2FycmF5IG9mIHN0cmluZ3MgcmV0dXJuZWQgd2lsbCBiZSB1c2VkLgorSWYgdGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBAY29kZXtybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9vdmVyfQordmFyaWFibGUgdG8gYSBub24temVybyB2YWx1ZSwgUmVhZGxpbmUgd2lsbCBub3QgcGVyZm9ybSBpdHMgZGVmYXVsdAorY29tcGxldGlvbiBldmVuIGlmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBubyBtYXRjaGVzLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtybF9xdW90ZV9mdW5jX3QgKn0gcmxfZmlsZW5hbWVfcXVvdGluZ19mdW5jdGlvbgorQSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHF1b3RlIGEgZmlsZW5hbWUgaW4gYW4KK2FwcGxpY2F0aW9uLXNwZWNpZmljIGZhc2hpb24uICBUaGlzIGlzIGNhbGxlZCBpZiBmaWxlbmFtZSBjb21wbGV0aW9uIGlzIGJlaW5nCithdHRlbXB0ZWQgYW5kIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBpbiBAY29kZXtybF9maWxlbmFtZV9xdW90ZV9jaGFyYWN0ZXJzfQorYXBwZWFycyBpbiBhIGNvbXBsZXRlZCBmaWxlbmFtZS4gIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aAorQHZhcnt0ZXh0fSwgQHZhcnttYXRjaF90eXBlfSwgYW5kIEB2YXJ7cXVvdGVfcG9pbnRlcn0uICBUaGUgQHZhcnt0ZXh0fQoraXMgdGhlIGZpbGVuYW1lIHRvIGJlIHF1b3RlZC4gIFRoZSBAdmFye21hdGNoX3R5cGV9IGlzIGVpdGhlcgorQGNvZGV7U0lOR0xFX01BVENIfSwgaWYgdGhlcmUgaXMgb25seSBvbmUgY29tcGxldGlvbiBtYXRjaCwgb3IKK0Bjb2Rle01VTFRfTUFUQ0h9LiAgU29tZSBmdW5jdGlvbnMgdXNlIHRoaXMgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvCitpbnNlcnQgYSBjbG9zaW5nIHF1b3RlIGNoYXJhY3Rlci4gIFRoZSBAdmFye3F1b3RlX3BvaW50ZXJ9IGlzIGEgcG9pbnRlcgordG8gYW55IG9wZW5pbmcgcXVvdGUgY2hhcmFjdGVyIHRoZSB1c2VyIHR5cGVkLiAgU29tZSBmdW5jdGlvbnMgY2hvb3NlCit0byByZXNldCB0aGlzIGNoYXJhY3Rlci4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7cmxfZGVxdW90ZV9mdW5jX3QgKn0gcmxfZmlsZW5hbWVfZGVxdW90aW5nX2Z1bmN0aW9uCitBIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHdpbGwgcmVtb3ZlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHF1b3RpbmcKK2NoYXJhY3RlcnMgZnJvbSBhIGZpbGVuYW1lIGJlZm9yZSBjb21wbGV0aW9uIGlzIGF0dGVtcHRlZCwgc28gdGhvc2UKK2NoYXJhY3RlcnMgZG8gbm90IGludGVyZmVyZSB3aXRoIG1hdGNoaW5nIHRoZSB0ZXh0IGFnYWluc3QgbmFtZXMgaW4KK3RoZSBmaWxlc3lzdGVtLiAgSXQgaXMgY2FsbGVkIHdpdGggQHZhcnt0ZXh0fSwgdGhlIHRleHQgb2YgdGhlIHdvcmQKK3RvIGJlIGRlcXVvdGVkLCBhbmQgQHZhcntxdW90ZV9jaGFyfSwgd2hpY2ggaXMgdGhlIHF1b3RpbmcgY2hhcmFjdGVyIAordGhhdCBkZWxpbWl0cyB0aGUgZmlsZW5hbWUgKHVzdWFsbHkgQHNhbXB7J30gb3IgQHNhbXB7In0pLiAgSWYKK0B2YXJ7cXVvdGVfY2hhcn0gaXMgemVybywgdGhlIGZpbGVuYW1lIHdhcyBub3QgaW4gYW4gZW1iZWRkZWQgc3RyaW5nLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtybF9saW5lYnVmX2Z1bmNfdCAqfSBybF9jaGFyX2lzX3F1b3RlZF9wCitBIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0byBjYWxsIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhIHNwZWNpZmljCitjaGFyYWN0ZXIgaW4gdGhlIGxpbmUgYnVmZmVyIGlzIHF1b3RlZCwgYWNjb3JkaW5nIHRvIHdoYXRldmVyIHF1b3RpbmcKK21lY2hhbmlzbSB0aGUgcHJvZ3JhbSBjYWxsaW5nIFJlYWRsaW5lIHVzZXMuICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGgKK3R3byBhcmd1bWVudHM6IEB2YXJ7dGV4dH0sIHRoZSB0ZXh0IG9mIHRoZSBsaW5lLCBhbmQgQHZhcntpbmRleH0sIHRoZQoraW5kZXggb2YgdGhlIGNoYXJhY3RlciBpbiB0aGUgbGluZS4gIEl0IGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgYQorY2hhcmFjdGVyIGZvdW5kIGluIEBjb2Rle3JsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnN9IHNob3VsZCBiZQordXNlZCB0byBicmVhayB3b3JkcyBmb3IgdGhlIGNvbXBsZXRlci4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7cmxfY29tcGlnbm9yZV9mdW5jX3QgKn0gcmxfaWdub3JlX3NvbWVfY29tcGxldGlvbnNfZnVuY3Rpb24KK1RoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCBieSB0aGUgY29tcGxldGVyIHdoZW4gcmVhbCBmaWxlbmFtZQorY29tcGxldGlvbiBpcyBkb25lLCBhZnRlciBhbGwgdGhlIG1hdGNoaW5nIG5hbWVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQuCitJdCBpcyBwYXNzZWQgYSBAY29kZXtOVUxMfSB0ZXJtaW5hdGVkIGFycmF5IG9mIG1hdGNoZXMuCitUaGUgZmlyc3QgZWxlbWVudCAoQGNvZGV7bWF0Y2hlc1swXX0pIGlzIHRoZQorbWF4aW1hbCBzdWJzdHJpbmcgY29tbW9uIHRvIGFsbCBtYXRjaGVzLiBUaGlzIGZ1bmN0aW9uIGNhbgorcmUtYXJyYW5nZSB0aGUgbGlzdCBvZiBtYXRjaGVzIGFzIHJlcXVpcmVkLCBidXQgZWFjaCBlbGVtZW50IGRlbGV0ZWQKK2Zyb20gdGhlIGFycmF5IG11c3QgYmUgZnJlZWQuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIge3JsX2ljcHBmdW5jX3QgKn0gcmxfZGlyZWN0b3J5X2NvbXBsZXRpb25faG9vaworVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGRpcmVjdG9yeSBwb3J0aW9uCitvZiBmaWxlbmFtZXMgUmVhZGxpbmUgY29tcGxldGVzLiAgSXQgaXMgY2FsbGVkIHdpdGggdGhlIGFkZHJlc3Mgb2YgYQorc3RyaW5nICh0aGUgY3VycmVudCBkaXJlY3RvcnkgbmFtZSkgYXMgYW4gYXJndW1lbnQsIGFuZCBtYXkgbW9kaWZ5IHRoYXQgc3RyaW5nLgorSWYgdGhlIHN0cmluZyBpcyByZXBsYWNlZCB3aXRoIGEgbmV3IHN0cmluZywgdGhlIG9sZCB2YWx1ZSBzaG91bGQgYmUgZnJlZWQuCitBbnkgbW9kaWZpZWQgZGlyZWN0b3J5IG5hbWUgc2hvdWxkIGhhdmUgYSB0cmFpbGluZyBzbGFzaC4KK1RoZSBtb2RpZmllZCB2YWx1ZSB3aWxsIGJlIGRpc3BsYXllZCBhcyBwYXJ0IG9mIHRoZSBjb21wbGV0aW9uLCByZXBsYWNpbmcKK3RoZSBkaXJlY3RvcnkgcG9ydGlvbiBvZiB0aGUgcGF0aG5hbWUgdGhlIHVzZXIgdHlwZWQuCitJdCByZXR1cm5zIGFuIGludGVnZXIgdGhhdCBzaG91bGQgYmUgbm9uLXplcm8gaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzCitpdHMgZGlyZWN0b3J5IGFyZ3VtZW50LgorSXQgY291bGQgYmUgdXNlZCB0byBleHBhbmQgc3ltYm9saWMgbGlua3Mgb3Igc2hlbGwgdmFyaWFibGVzIGluIHBhdGhuYW1lcy4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7cmxfY29tcGRpc3BfZnVuY190ICp9IHJsX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sKK0lmIG5vbi16ZXJvLCB0aGVuIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB0byBjYWxsIHdoZW4KK2NvbXBsZXRpbmcgYSB3b3JkIHdvdWxkIG5vcm1hbGx5IGRpc3BsYXkgdGhlIGxpc3Qgb2YgcG9zc2libGUgbWF0Y2hlcy4KK1RoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGxpZXUgb2YgUmVhZGxpbmUgZGlzcGxheWluZyB0aGUgbGlzdC4KK0l0IHRha2VzIHRocmVlIGFyZ3VtZW50czoKKyhAY29kZXtjaGFyICoqfUB2YXJ7bWF0Y2hlc30sIEBjb2Rle2ludH0gQHZhcntudW1fbWF0Y2hlc30sIEBjb2Rle2ludH0gQHZhcnttYXhfbGVuZ3RofSkKK3doZXJlIEB2YXJ7bWF0Y2hlc30gaXMgdGhlIGFycmF5IG9mIG1hdGNoaW5nIHN0cmluZ3MsCitAdmFye251bV9tYXRjaGVzfSBpcyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gdGhhdCBhcnJheSwgYW5kCitAdmFye21heF9sZW5ndGh9IGlzIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3Qgc3RyaW5nIGluIHRoYXQgYXJyYXkuCitSZWFkbGluZSBwcm92aWRlcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uLCBAY29kZXtybF9kaXNwbGF5X21hdGNoX2xpc3R9LAordGhhdCB0YWtlcyBjYXJlIG9mIGRvaW5nIHRoZSBkaXNwbGF5IHRvIFJlYWRsaW5lJ3Mgb3V0cHV0IHN0cmVhbS4gIFRoYXQKK2Z1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSB0aGlzIGhvb2suCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIge2NvbnN0IGNoYXIgKn0gcmxfYmFzaWNfd29yZF9icmVha19jaGFyYWN0ZXJzCitUaGUgYmFzaWMgbGlzdCBvZiBjaGFyYWN0ZXJzIHRoYXQgc2lnbmFsIGEgYnJlYWsgYmV0d2VlbiB3b3JkcyBmb3IgdGhlCitjb21wbGV0ZXIgcm91dGluZS4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgaXMgdGhlIGNoYXJhY3RlcnMKK3doaWNoIGJyZWFrIHdvcmRzIGZvciBjb21wbGV0aW9uIGluIEJhc2g6CitAY29kZXsiIFx0XG5cIlxcJ2BAQCQ+PD07fCZAeygifS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7Y29uc3QgY2hhciAqfSBybF9iYXNpY19xdW90ZV9jaGFyYWN0ZXJzCitBIGxpc3Qgb2YgcXVvdGUgY2hhcmFjdGVycyB3aGljaCBjYW4gY2F1c2UgYSB3b3JkIGJyZWFrLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtjb25zdCBjaGFyICp9IHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMKK1RoZSBsaXN0IG9mIGNoYXJhY3RlcnMgdGhhdCBzaWduYWwgYSBicmVhayBiZXR3ZWVuIHdvcmRzIGZvcgorQGNvZGV7cmxfY29tcGxldGVfaW50ZXJuYWwoKX0uICBUaGUgZGVmYXVsdCBsaXN0IGlzIHRoZSB2YWx1ZSBvZgorQGNvZGV7cmxfYmFzaWNfd29yZF9icmVha19jaGFyYWN0ZXJzfS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7cmxfY3B2ZnVuY190ICp9IHJsX2NvbXBsZXRpb25fd29yZF9icmVha19ob29rCitJZiBub24temVybywgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBSZWFkbGluZSBpcworZGVjaWRpbmcgd2hlcmUgdG8gc2VwYXJhdGUgd29yZHMgZm9yIHdvcmQgY29tcGxldGlvbi4gIEl0IHNob3VsZCByZXR1cm4KK2EgY2hhcmFjdGVyIHN0cmluZyBsaWtlIEBjb2Rle3JsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnN9IHRvIGJlCit1c2VkIHRvIHBlcmZvcm0gdGhlIGN1cnJlbnQgY29tcGxldGlvbi4gIFRoZSBmdW5jdGlvbiBtYXkgY2hvb3NlIHRvIHNldAorQGNvZGV7cmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVyc30gaXRzZWxmLiAgSWYgdGhlIGZ1bmN0aW9uCityZXR1cm5zIEBjb2Rle05VTEx9LCBAY29kZXtybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzfSBpcyB1c2VkLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtjb25zdCBjaGFyICp9IHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzCitBIGxpc3Qgb2YgY2hhcmFjdGVycyB3aGljaCBjYW4gYmUgdXNlZCB0byBxdW90ZSBhIHN1YnN0cmluZyBvZiB0aGUgbGluZS4KK0NvbXBsZXRpb24gb2NjdXJzIG9uIHRoZSBlbnRpcmUgc3Vic3RyaW5nLCBhbmQgd2l0aGluIHRoZSBzdWJzdHJpbmcKK0Bjb2Rle3JsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnN9IGFyZSB0cmVhdGVkIGFzIGFueSBvdGhlciBjaGFyYWN0ZXIsCit1bmxlc3MgdGhleSBhbHNvIGFwcGVhciB3aXRoaW4gdGhpcyBsaXN0LgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtjb25zdCBjaGFyICp9IHJsX2ZpbGVuYW1lX3F1b3RlX2NoYXJhY3RlcnMKK0EgbGlzdCBvZiBjaGFyYWN0ZXJzIHRoYXQgY2F1c2UgYSBmaWxlbmFtZSB0byBiZSBxdW90ZWQgYnkgdGhlIGNvbXBsZXRlcgord2hlbiB0aGV5IGFwcGVhciBpbiBhIGNvbXBsZXRlZCBmaWxlbmFtZS4gIFRoZSBkZWZhdWx0IGlzIHRoZSBudWxsIHN0cmluZy4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciB7Y29uc3QgY2hhciAqfSBybF9zcGVjaWFsX3ByZWZpeGVzCitUaGUgbGlzdCBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIHdvcmQgYnJlYWsgY2hhcmFjdGVycywgYnV0IHNob3VsZCBiZQorbGVmdCBpbiBAdmFye3RleHR9IHdoZW4gaXQgaXMgcGFzc2VkIHRvIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uLgorUHJvZ3JhbXMgY2FuIHVzZSB0aGlzIHRvIGhlbHAgZGV0ZXJtaW5lIHdoYXQga2luZCBvZiBjb21wbGV0aW5nIHRvIGRvLgorRm9yIGluc3RhbmNlLCBCYXNoIHNldHMgdGhpcyB2YXJpYWJsZSB0byAiJEBAIiBzbyB0aGF0IGl0IGNhbiBjb21wbGV0ZQorc2hlbGwgdmFyaWFibGVzIGFuZCBob3N0bmFtZXMuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgaW50IHJsX2NvbXBsZXRpb25fcXVlcnlfaXRlbXMKK1VwIHRvIHRoaXMgbWFueSBpdGVtcyB3aWxsIGJlIGRpc3BsYXllZCBpbiByZXNwb25zZSB0byBhCitwb3NzaWJsZS1jb21wbGV0aW9ucyBjYWxsLiAgQWZ0ZXIgdGhhdCwgcmVhZGxpbmUgYXNrcyB0aGUgdXNlciBpZiBzaGUgaXMgc3VyZQorc2hlIHdhbnRzIHRvIHNlZSB0aGVtIGFsbC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEwMC4gIEEgbmVnYXRpdmUgdmFsdWUgCitpbmRpY2F0ZXMgdGhhdCBSZWFkbGluZSBzaG91bGQgbmV2ZXIgYXNrIHRoZSB1c2VyLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIHtpbnR9IHJsX2NvbXBsZXRpb25fYXBwZW5kX2NoYXJhY3RlcgorV2hlbiBhIHNpbmdsZSBjb21wbGV0aW9uIGFsdGVybmF0aXZlIG1hdGNoZXMgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZAorbGluZSwgdGhpcyBjaGFyYWN0ZXIgaXMgYXBwZW5kZWQgdG8gdGhlIGluc2VydGVkIGNvbXBsZXRpb24gdGV4dC4gIFRoZQorZGVmYXVsdCBpcyBhIHNwYWNlIGNoYXJhY3RlciAoQHNhbXB7IH0pLiAgU2V0dGluZyB0aGlzIHRvIHRoZSBudWxsCitjaGFyYWN0ZXIgKEBzYW1we1wwfSkgcHJldmVudHMgYW55dGhpbmcgYmVpbmcgYXBwZW5kZWQgYXV0b21hdGljYWxseS4KK1RoaXMgY2FuIGJlIGNoYW5nZWQgaW4gYXBwbGljYXRpb24tc3BlY2lmaWMgY29tcGxldGlvbiBmdW5jdGlvbnMgdG8KK3Byb3ZpZGUgdGhlIGBgbW9zdCBzZW5zaWJsZSB3b3JkIHNlcGFyYXRvciBjaGFyYWN0ZXInJyBhY2NvcmRpbmcgdG8KK2FuIGFwcGxpY2F0aW9uLXNwZWNpZmljIGNvbW1hbmQgbGluZSBzeW50YXggc3BlY2lmaWNhdGlvbi4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgcmxfY29tcGxldGlvbl9zdXBwcmVzc19hcHBlbmQKK0lmIG5vbi16ZXJvLCBAdmFye3JsX2NvbXBsZXRpb25fYXBwZW5kX2NoYXJhY3Rlcn0gaXMgbm90IGFwcGVuZGVkIHRvCittYXRjaGVzIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgbGluZSwgYXMgZGVzY3JpYmVkIGFib3ZlLgorSXQgaXMgc2V0IHRvIDAgYmVmb3JlIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBjb21wbGV0aW9uIGZ1bmN0aW9uCitpcyBjYWxsZWQsIGFuZCBtYXkgb25seSBiZSBjaGFuZ2VkIHdpdGhpbiBzdWNoIGEgZnVuY3Rpb24uCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgaW50IHJsX2NvbXBsZXRpb25fcXVvdGVfY2hhcmFjdGVyCitXaGVuIFJlYWRsaW5lIGlzIGNvbXBsZXRpbmcgcXVvdGVkIHRleHQsIGFzIGRlbGltaXRlZCBieSBvbmUgb2YgdGhlCitjaGFyYWN0ZXJzIGluIEB2YXJ7cmxfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnN9LCBpdCBzZXRzIHRoaXMgdmFyaWFibGUKK3RvIHRoZSBxdW90aW5nIGNoYXJhY3RlciBmb3VuZC4KK1RoaXMgaXMgc2V0IGJlZm9yZSBhbnkgYXBwbGljYXRpb24tc3BlY2lmaWMgY29tcGxldGlvbiBmdW5jdGlvbiBpcyBjYWxsZWQuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgaW50IHJsX2NvbXBsZXRpb25fc3VwcHJlc3NfcXVvdGUKK0lmIG5vbi16ZXJvLCBSZWFkbGluZSBkb2VzIG5vdCBhcHBlbmQgYSBtYXRjaGluZyBxdW90ZSBjaGFyYWN0ZXIgd2hlbgorcGVyZm9ybWluZyBjb21wbGV0aW9uIG9uIGEgcXVvdGVkIHN0cmluZy4KK0l0IGlzIHNldCB0byAwIGJlZm9yZSBhbnkgYXBwbGljYXRpb24tc3BlY2lmaWMgY29tcGxldGlvbiBmdW5jdGlvbgoraXMgY2FsbGVkLCBhbmQgbWF5IG9ubHkgYmUgY2hhbmdlZCB3aXRoaW4gc3VjaCBhIGZ1bmN0aW9uLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIGludCBybF9jb21wbGV0aW9uX2ZvdW5kX3F1b3RlCitXaGVuIFJlYWRsaW5lIGlzIGNvbXBsZXRpbmcgcXVvdGVkIHRleHQsIGl0IHNldHMgdGhpcyB2YXJpYWJsZQordG8gYSBub24temVybyB2YWx1ZSBpZiB0aGUgd29yZCBiZWluZyBjb21wbGV0ZWQgY29udGFpbnMgb3IgaXMgZGVsaW1pdGVkCitieSBhbnkgcXVvdGluZyBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgYmFja3NsYXNoZXMuCitUaGlzIGlzIHNldCBiZWZvcmUgYW55IGFwcGxpY2F0aW9uLXNwZWNpZmljIGNvbXBsZXRpb24gZnVuY3Rpb24gaXMgY2FsbGVkLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIGludCBybF9jb21wbGV0aW9uX21hcmtfc3ltbGlua19kaXJzCitJZiBub24temVybywgYSBzbGFzaCB3aWxsIGJlIGFwcGVuZGVkIHRvIGNvbXBsZXRlZCBmaWxlbmFtZXMgdGhhdCBhcmUKK3N5bWJvbGljIGxpbmtzIHRvIGRpcmVjdG9yeSBuYW1lcywgc3ViamVjdCB0byB0aGUgdmFsdWUgb2YgdGhlCit1c2VyLXNldHRhYmxlIEB2YXJ7bWFyay1kaXJlY3Rvcmllc30gdmFyaWFibGUuCitUaGlzIHZhcmlhYmxlIGV4aXN0cyBzbyB0aGF0IGFwcGxpY2F0aW9uLXNwZWNpZmljIGNvbXBsZXRpb24gZnVuY3Rpb25zCitjYW4gb3ZlcnJpZGUgdGhlIHVzZXIncyBnbG9iYWwgcHJlZmVyZW5jZSAoc2V0IHZpYSB0aGUKK0B2YXJ7bWFyay1zeW1saW5rZWQtZGlyZWN0b3JpZXN9IFJlYWRsaW5lIHZhcmlhYmxlKSBpZiBhcHByb3ByaWF0ZS4KK1RoaXMgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZSBiZWZvcmUgYW55CithcHBsaWNhdGlvbi1zcGVjaWZpYyBjb21wbGV0aW9uIGZ1bmN0aW9uIGlzIGNhbGxlZCwgc28gdW5sZXNzIHRoYXQKK2Z1bmN0aW9uIG1vZGlmaWVzIHRoZSB2YWx1ZSwgdGhlIHVzZXIncyBwcmVmZXJlbmNlcyBhcmUgaG9ub3JlZC4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgcmxfaWdub3JlX2NvbXBsZXRpb25fZHVwbGljYXRlcworSWYgbm9uLXplcm8sIHRoZW4gZHVwbGljYXRlcyBpbiB0aGUgbWF0Y2hlcyBhcmUgcmVtb3ZlZC4KK1RoZSBkZWZhdWx0IGlzIDEuCitAZW5kIGRlZnR5cGV2YXIKKworQGRlZnR5cGV2YXIgaW50IHJsX2ZpbGVuYW1lX2NvbXBsZXRpb25fZGVzaXJlZAorTm9uLXplcm8gbWVhbnMgdGhhdCB0aGUgcmVzdWx0cyBvZiB0aGUgbWF0Y2hlcyBhcmUgdG8gYmUgdHJlYXRlZCBhcworZmlsZW5hbWVzLiAgVGhpcyBpcyBAZW1waHthbHdheXN9IHplcm8gd2hlbiBjb21wbGV0aW9uIGlzIGF0dGVtcHRlZCwKK2FuZCBjYW4gb25seSBiZSBjaGFuZ2VkCit3aXRoaW4gYW4gYXBwbGljYXRpb24tc3BlY2lmaWMgY29tcGxldGlvbiBmdW5jdGlvbi4gIElmIGl0IGlzIHNldCB0byBhCitub24temVybyB2YWx1ZSBieSBzdWNoIGEgZnVuY3Rpb24sIGRpcmVjdG9yeSBuYW1lcyBoYXZlIGEgc2xhc2ggYXBwZW5kZWQKK2FuZCBSZWFkbGluZSBhdHRlbXB0cyB0byBxdW90ZSBjb21wbGV0ZWQgZmlsZW5hbWVzIGlmIHRoZXkgY29udGFpbiBhbnkKK2NoYXJhY3RlcnMgaW4gQGNvZGV7cmxfZmlsZW5hbWVfcXVvdGVfY2hhcmFjdGVyc30gYW5kCitAY29kZXtybF9maWxlbmFtZV9xdW90aW5nX2Rlc2lyZWR9IGlzIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIGludCBybF9maWxlbmFtZV9xdW90aW5nX2Rlc2lyZWQKK05vbi16ZXJvIG1lYW5zIHRoYXQgdGhlIHJlc3VsdHMgb2YgdGhlIG1hdGNoZXMgYXJlIHRvIGJlIHF1b3RlZCB1c2luZworZG91YmxlIHF1b3RlcyAob3IgYW4gYXBwbGljYXRpb24tc3BlY2lmaWMgcXVvdGluZyBtZWNoYW5pc20pIGlmIHRoZQorY29tcGxldGVkIGZpbGVuYW1lIGNvbnRhaW5zIGFueSBjaGFyYWN0ZXJzIGluCitAY29kZXtybF9maWxlbmFtZV9xdW90ZV9jaGFyc30uICBUaGlzIGlzIEBlbXBoe2Fsd2F5c30gbm9uLXplcm8KK3doZW4gY29tcGxldGlvbiBpcyBhdHRlbXB0ZWQsIGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkIHdpdGhpbiBhbgorYXBwbGljYXRpb24tc3BlY2lmaWMgY29tcGxldGlvbiBmdW5jdGlvbi4KK1RoZSBxdW90aW5nIGlzIGVmZmVjdGVkIHZpYSBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIHBvaW50ZWQgdG8KK2J5IEBjb2Rle3JsX2ZpbGVuYW1lX3F1b3RpbmdfZnVuY3Rpb259LgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIGludCBybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9vdmVyCitJZiBhbiBhcHBsaWNhdGlvbi1zcGVjaWZpYyBjb21wbGV0aW9uIGZ1bmN0aW9uIGFzc2lnbmVkIHRvCitAY29kZXtybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9mdW5jdGlvbn0gc2V0cyB0aGlzIHZhcmlhYmxlIHRvIGEgbm9uLXplcm8KK3ZhbHVlLCBSZWFkbGluZSB3aWxsIG5vdCBwZXJmb3JtIGl0cyBkZWZhdWx0IGZpbGVuYW1lIGNvbXBsZXRpb24gZXZlbgoraWYgdGhlIGFwcGxpY2F0aW9uJ3MgY29tcGxldGlvbiBmdW5jdGlvbiByZXR1cm5zIG5vIG1hdGNoZXMuCitJdCBzaG91bGQgYmUgc2V0IG9ubHkgYnkgYW4gYXBwbGljYXRpb24ncyBjb21wbGV0aW9uIGZ1bmN0aW9uLgorQGVuZCBkZWZ0eXBldmFyCisKK0BkZWZ0eXBldmFyIGludCBybF9jb21wbGV0aW9uX3R5cGUKK1NldCB0byBhIGNoYXJhY3RlciBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIGNvbXBsZXRpb24gUmVhZGxpbmUgaXMgY3VycmVudGx5CithdHRlbXB0aW5nOyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBjb2Rle3JsX2NvbXBsZXRlX2ludGVybmFsKCl9CisoQHB4cmVme0NvbXBsZXRpb24gRnVuY3Rpb25zfSkgZm9yIHRoZSBsaXN0IG9mIGNoYXJhY3RlcnMuCitUaGlzIGlzIHNldCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgYmVmb3JlIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYworY29tcGxldGlvbiBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbG93aW5nIHN1Y2ggZnVuY3Rpb25zIHRvIHByZXNlbnQKK3RoZSBzYW1lIGludGVyZmFjZSBhcyBAY29kZXtybF9jb21wbGV0ZSgpfS4KK0BlbmQgZGVmdHlwZXZhcgorCitAZGVmdHlwZXZhciBpbnQgcmxfaW5oaWJpdF9jb21wbGV0aW9uCitJZiB0aGlzIHZhcmlhYmxlIGlzIG5vbi16ZXJvLCBjb21wbGV0aW9uIGlzIGluaGliaXRlZC4gIFRoZSBjb21wbGV0aW9uCitjaGFyYWN0ZXIgd2lsbCBiZSBpbnNlcnRlZCBhcyBhbnkgb3RoZXIgYm91bmQgdG8gQGNvZGV7c2VsZi1pbnNlcnR9LgorQGVuZCBkZWZ0eXBldmFyCisKK0Bub2RlIEEgU2hvcnQgQ29tcGxldGlvbiBFeGFtcGxlCitAc3Vic2VjdGlvbiBBIFNob3J0IENvbXBsZXRpb24gRXhhbXBsZQorCitIZXJlIGlzIGEgc21hbGwgYXBwbGljYXRpb24gZGVtb25zdHJhdGluZyB0aGUgdXNlIG9mIHRoZSBHTlUgUmVhZGxpbmUKK2xpYnJhcnkuICBJdCBpcyBjYWxsZWQgQGNvZGV7ZmlsZW1hbn0sIGFuZCB0aGUgc291cmNlIGNvZGUgcmVzaWRlcyBpbgorQGZpbGV7ZXhhbXBsZXMvZmlsZW1hbi5jfS4gIFRoaXMgc2FtcGxlIGFwcGxpY2F0aW9uIHByb3ZpZGVzCitjb21wbGV0aW9uIG9mIGNvbW1hbmQgbmFtZXMsIGxpbmUgZWRpdGluZyBmZWF0dXJlcywgYW5kIGFjY2VzcyB0byB0aGUKK2hpc3RvcnkgbGlzdC4KKworQHBhZ2UKK0BzbWFsbGV4YW1wbGUKKy8qIGZpbGVtYW4uYyAtLSBBIHRpbnkgYXBwbGljYXRpb24gd2hpY2ggZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgdGhlCisgICBHTlUgUmVhZGxpbmUgbGlicmFyeS4gIFRoaXMgYXBwbGljYXRpb24gaW50ZXJhY3RpdmVseSBhbGxvd3MgdXNlcnMKKyAgIHRvIG1hbmlwdWxhdGUgZmlsZXMgYW5kIHRoZWlyIG1vZGVzLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisKKyNpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgorI2luY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4KKworZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCk7CisKKy8qIFRoZSBuYW1lcyBvZiBmdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBkbyB0aGUgbWFuaXB1bGF0aW9uLiAqLworaW50IGNvbV9saXN0IF9fUCgoY2hhciAqKSk7CitpbnQgY29tX3ZpZXcgX19QKChjaGFyICopKTsKK2ludCBjb21fcmVuYW1lIF9fUCgoY2hhciAqKSk7CitpbnQgY29tX3N0YXQgX19QKChjaGFyICopKTsKK2ludCBjb21fcHdkIF9fUCgoY2hhciAqKSk7CitpbnQgY29tX2RlbGV0ZSBfX1AoKGNoYXIgKikpOworaW50IGNvbV9oZWxwIF9fUCgoY2hhciAqKSk7CitpbnQgY29tX2NkIF9fUCgoY2hhciAqKSk7CitpbnQgY29tX3F1aXQgX19QKChjaGFyICopKTsKKworLyogQSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGNvbW1hbmRzIHRoaXMgcHJvZ3JhbQorICAgY2FuIHVuZGVyc3RhbmQuICovCisKK3R5cGVkZWYgc3RydWN0IEB7CisgIGNoYXIgKm5hbWU7CQkJLyogVXNlciBwcmludGFibGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICovCisgIHJsX2ljcGZ1bmNfdCAqZnVuYzsJCS8qIEZ1bmN0aW9uIHRvIGNhbGwgdG8gZG8gdGhlIGpvYi4gKi8KKyAgY2hhciAqZG9jOwkJCS8qIERvY3VtZW50YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24uICAqLworQH0gQ09NTUFORDsKKworQ09NTUFORCBjb21tYW5kc1tdID0gQHsKKyAgQHsgImNkIiwgY29tX2NkLCAiQ2hhbmdlIHRvIGRpcmVjdG9yeSBESVIiIEB9LAorICBAeyAiZGVsZXRlIiwgY29tX2RlbGV0ZSwgIkRlbGV0ZSBGSUxFIiBAfSwKKyAgQHsgImhlbHAiLCBjb21faGVscCwgIkRpc3BsYXkgdGhpcyB0ZXh0IiBAfSwKKyAgQHsgIj8iLCBjb21faGVscCwgIlN5bm9ueW0gZm9yIGBoZWxwJyIgQH0sCisgIEB7ICJsaXN0IiwgY29tX2xpc3QsICJMaXN0IGZpbGVzIGluIERJUiIgQH0sCisgIEB7ICJscyIsIGNvbV9saXN0LCAiU3lub255bSBmb3IgYGxpc3QnIiBAfSwKKyAgQHsgInB3ZCIsIGNvbV9wd2QsICJQcmludCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSIgQH0sCisgIEB7ICJxdWl0IiwgY29tX3F1aXQsICJRdWl0IHVzaW5nIEZpbGVtYW4iIEB9LAorICBAeyAicmVuYW1lIiwgY29tX3JlbmFtZSwgIlJlbmFtZSBGSUxFIHRvIE5FV05BTUUiIEB9LAorICBAeyAic3RhdCIsIGNvbV9zdGF0LCAiUHJpbnQgb3V0IHN0YXRpc3RpY3Mgb24gRklMRSIgQH0sCisgIEB7ICJ2aWV3IiwgY29tX3ZpZXcsICJWaWV3IHRoZSBjb250ZW50cyBvZiBGSUxFIiBAfSwKKyAgQHsgKGNoYXIgKilOVUxMLCAocmxfaWNwZnVuY190ICopTlVMTCwgKGNoYXIgKilOVUxMIEB9CitAfTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICovCitjaGFyICpzdHJpcHdoaXRlICgpOworQ09NTUFORCAqZmluZF9jb21tYW5kICgpOworCisvKiBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0sIGFzIHRha2VuIGZyb20gYXJndlswXS4gKi8KK2NoYXIgKnByb2duYW1lOworCisvKiBXaGVuIG5vbi16ZXJvLCB0aGlzIG1lYW5zIHRoZSB1c2VyIGlzIGRvbmUgdXNpbmcgdGhpcyBwcm9ncmFtLiAqLworaW50IGRvbmU7CisKK2NoYXIgKgorZHVwc3RyIChzKQorICAgICBpbnQgczsKK0B7CisgIGNoYXIgKnI7CisKKyAgciA9IHhtYWxsb2MgKHN0cmxlbiAocykgKyAxKTsKKyAgc3RyY3B5IChyLCBzKTsKKyAgcmV0dXJuIChyKTsKK0B9CisKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK0B7CisgIGNoYXIgKmxpbmUsICpzOworCisgIHByb2duYW1lID0gYXJndlswXTsKKworICBpbml0aWFsaXplX3JlYWRsaW5lICgpOwkvKiBCaW5kIG91ciBjb21wbGV0ZXIuICovCisKKyAgLyogTG9vcCByZWFkaW5nIGFuZCBleGVjdXRpbmcgbGluZXMgdW50aWwgdGhlIHVzZXIgcXVpdHMuICovCisgIGZvciAoIDsgZG9uZSA9PSAwOyApCisgICAgQHsKKyAgICAgIGxpbmUgPSByZWFkbGluZSAoIkZpbGVNYW46ICIpOworCisgICAgICBpZiAoIWxpbmUpCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBsaW5lLgorICAgICAgICAgVGhlbiwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCwgYWRkIGl0IHRvIHRoZSBoaXN0b3J5IGxpc3QKKyAgICAgICAgIGFuZCBleGVjdXRlIGl0LiAqLworICAgICAgcyA9IHN0cmlwd2hpdGUgKGxpbmUpOworCisgICAgICBpZiAoKnMpCisgICAgICAgIEB7CisgICAgICAgICAgYWRkX2hpc3RvcnkgKHMpOworICAgICAgICAgIGV4ZWN1dGVfbGluZSAocyk7CisgICAgICAgIEB9CisKKyAgICAgIGZyZWUgKGxpbmUpOworICAgIEB9CisgIGV4aXQgKDApOworQH0KKworLyogRXhlY3V0ZSBhIGNvbW1hbmQgbGluZS4gKi8KK2ludAorZXhlY3V0ZV9saW5lIChsaW5lKQorICAgICBjaGFyICpsaW5lOworQHsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIENPTU1BTkQgKmNvbW1hbmQ7CisgIGNoYXIgKndvcmQ7CisKKyAgLyogSXNvbGF0ZSB0aGUgY29tbWFuZCB3b3JkLiAqLworICBpID0gMDsKKyAgd2hpbGUgKGxpbmVbaV0gJiYgd2hpdGVzcGFjZSAobGluZVtpXSkpCisgICAgaSsrOworICB3b3JkID0gbGluZSArIGk7CisKKyAgd2hpbGUgKGxpbmVbaV0gJiYgIXdoaXRlc3BhY2UgKGxpbmVbaV0pKQorICAgIGkrKzsKKworICBpZiAobGluZVtpXSkKKyAgICBsaW5lW2krK10gPSAnXDAnOworCisgIGNvbW1hbmQgPSBmaW5kX2NvbW1hbmQgKHdvcmQpOworCisgIGlmICghY29tbWFuZCkKKyAgICBAeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IE5vIHN1Y2ggY29tbWFuZCBmb3IgRmlsZU1hbi5cbiIsIHdvcmQpOworICAgICAgcmV0dXJuICgtMSk7CisgICAgQH0KKworICAvKiBHZXQgYXJndW1lbnQgdG8gY29tbWFuZCwgaWYgYW55LiAqLworICB3aGlsZSAod2hpdGVzcGFjZSAobGluZVtpXSkpCisgICAgaSsrOworCisgIHdvcmQgPSBsaW5lICsgaTsKKworICAvKiBDYWxsIHRoZSBmdW5jdGlvbi4gKi8KKyAgcmV0dXJuICgoKihjb21tYW5kLT5mdW5jKSkgKHdvcmQpKTsKK0B9CisKKy8qIExvb2sgdXAgTkFNRSBhcyB0aGUgbmFtZSBvZiBhIGNvbW1hbmQsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoYXQKKyAgIGNvbW1hbmQuICBSZXR1cm4gYSBOVUxMIHBvaW50ZXIgaWYgTkFNRSBpc24ndCBhIGNvbW1hbmQgbmFtZS4gKi8KK0NPTU1BTkQgKgorZmluZF9jb21tYW5kIChuYW1lKQorICAgICBjaGFyICpuYW1lOworQHsKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgZm9yIChpID0gMDsgY29tbWFuZHNbaV0ubmFtZTsgaSsrKQorICAgIGlmIChzdHJjbXAgKG5hbWUsIGNvbW1hbmRzW2ldLm5hbWUpID09IDApCisgICAgICByZXR1cm4gKCZjb21tYW5kc1tpXSk7CisKKyAgcmV0dXJuICgoQ09NTUFORCAqKU5VTEwpOworQH0KKworLyogU3RyaXAgd2hpdGVzcGFjZSBmcm9tIHRoZSBzdGFydCBhbmQgZW5kIG9mIFNUUklORy4gIFJldHVybiBhIHBvaW50ZXIKKyAgIGludG8gU1RSSU5HLiAqLworY2hhciAqCitzdHJpcHdoaXRlIChzdHJpbmcpCisgICAgIGNoYXIgKnN0cmluZzsKK0B7CisgIHJlZ2lzdGVyIGNoYXIgKnMsICp0OworCisgIGZvciAocyA9IHN0cmluZzsgd2hpdGVzcGFjZSAoKnMpOyBzKyspCisgICAgOworICAgIAorICBpZiAoKnMgPT0gMCkKKyAgICByZXR1cm4gKHMpOworCisgIHQgPSBzICsgc3RybGVuIChzKSAtIDE7CisgIHdoaWxlICh0ID4gcyAmJiB3aGl0ZXNwYWNlICgqdCkpCisgICAgdC0tOworICAqKyt0ID0gJ1wwJzsKKworICByZXR1cm4gczsKK0B9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlIHRvIFJlYWRsaW5lIENvbXBsZXRpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworY2hhciAqY29tbWFuZF9nZW5lcmF0b3IgX19QKChjb25zdCBjaGFyICosIGludCkpOworY2hhciAqKmZpbGVtYW5fY29tcGxldGlvbiBfX1AoKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKKworLyogVGVsbCB0aGUgR05VIFJlYWRsaW5lIGxpYnJhcnkgaG93IHRvIGNvbXBsZXRlLiAgV2Ugd2FudCB0byB0cnkgdG8KKyAgIGNvbXBsZXRlIG9uIGNvbW1hbmQgbmFtZXMgaWYgdGhpcyBpcyB0aGUgZmlyc3Qgd29yZCBpbiB0aGUgbGluZSwgb3IKKyAgIG9uIGZpbGVuYW1lcyBpZiBub3QuICovCitpbml0aWFsaXplX3JlYWRsaW5lICgpCitAeworICAvKiBBbGxvdyBjb25kaXRpb25hbCBwYXJzaW5nIG9mIHRoZSB+Ly5pbnB1dHJjIGZpbGUuICovCisgIHJsX3JlYWRsaW5lX25hbWUgPSAiRmlsZU1hbiI7CisKKyAgLyogVGVsbCB0aGUgY29tcGxldGVyIHRoYXQgd2Ugd2FudCBhIGNyYWNrIGZpcnN0LiAqLworICBybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9mdW5jdGlvbiA9IGZpbGVtYW5fY29tcGxldGlvbjsKK0B9CisKKy8qIEF0dGVtcHQgdG8gY29tcGxldGUgb24gdGhlIGNvbnRlbnRzIG9mIFRFWFQuICBTVEFSVCBhbmQgRU5ECisgICBib3VuZCB0aGUgcmVnaW9uIG9mIHJsX2xpbmVfYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHdvcmQgdG8KKyAgIGNvbXBsZXRlLiAgVEVYVCBpcyB0aGUgd29yZCB0byBjb21wbGV0ZS4gIFdlIGNhbiB1c2UgdGhlIGVudGlyZQorICAgY29udGVudHMgb2YgcmxfbGluZV9idWZmZXIgaW4gY2FzZSB3ZSB3YW50IHRvIGRvIHNvbWUgc2ltcGxlCisgICBwYXJzaW5nLiAgUmV0dXJudGhlIGFycmF5IG9mIG1hdGNoZXMsIG9yIE5VTEwgaWYgdGhlcmUgYXJlbid0IGFueS4gKi8KK2NoYXIgKioKK2ZpbGVtYW5fY29tcGxldGlvbiAodGV4dCwgc3RhcnQsIGVuZCkKKyAgICAgY29uc3QgY2hhciAqdGV4dDsKKyAgICAgaW50IHN0YXJ0LCBlbmQ7CitAeworICBjaGFyICoqbWF0Y2hlczsKKworICBtYXRjaGVzID0gKGNoYXIgKiopTlVMTDsKKworICAvKiBJZiB0aGlzIHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLCB0aGVuIGl0IGlzIGEgY29tbWFuZAorICAgICB0byBjb21wbGV0ZS4gIE90aGVyd2lzZSBpdCBpcyB0aGUgbmFtZSBvZiBhIGZpbGUgaW4gdGhlIGN1cnJlbnQKKyAgICAgZGlyZWN0b3J5LiAqLworICBpZiAoc3RhcnQgPT0gMCkKKyAgICBtYXRjaGVzID0gcmxfY29tcGxldGlvbl9tYXRjaGVzICh0ZXh0LCBjb21tYW5kX2dlbmVyYXRvcik7CisKKyAgcmV0dXJuIChtYXRjaGVzKTsKK0B9CisKKy8qIEdlbmVyYXRvciBmdW5jdGlvbiBmb3IgY29tbWFuZCBjb21wbGV0aW9uLiAgU1RBVEUgbGV0cyB1cworICAga25vdyB3aGV0aGVyIHRvIHN0YXJ0IGZyb20gc2NyYXRjaDsgd2l0aG91dCBhbnkgc3RhdGUKKyAgIChpLmUuIFNUQVRFID09IDApLCB0aGVuIHdlIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QuICovCitjaGFyICoKK2NvbW1hbmRfZ2VuZXJhdG9yICh0ZXh0LCBzdGF0ZSkKKyAgICAgY29uc3QgY2hhciAqdGV4dDsKKyAgICAgaW50IHN0YXRlOworQHsKKyAgc3RhdGljIGludCBsaXN0X2luZGV4LCBsZW47CisgIGNoYXIgKm5hbWU7CisKKyAgLyogSWYgdGhpcyBpcyBhIG5ldyB3b3JkIHRvIGNvbXBsZXRlLCBpbml0aWFsaXplIG5vdy4gIFRoaXMKKyAgICAgaW5jbHVkZXMgc2F2aW5nIHRoZSBsZW5ndGggb2YgVEVYVCBmb3IgZWZmaWNpZW5jeSwgYW5kCisgICAgIGluaXRpYWxpemluZyB0aGUgaW5kZXggdmFyaWFibGUgdG8gMC4gKi8KKyAgaWYgKCFzdGF0ZSkKKyAgICBAeworICAgICAgbGlzdF9pbmRleCA9IDA7CisgICAgICBsZW4gPSBzdHJsZW4gKHRleHQpOworICAgIEB9CisKKyAgLyogUmV0dXJuIHRoZSBuZXh0IG5hbWUgd2hpY2ggcGFydGlhbGx5IG1hdGNoZXMgZnJvbSB0aGUKKyAgICAgY29tbWFuZCBsaXN0LiAqLworICB3aGlsZSAobmFtZSA9IGNvbW1hbmRzW2xpc3RfaW5kZXhdLm5hbWUpCisgICAgQHsKKyAgICAgIGxpc3RfaW5kZXgrKzsKKworICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIHRleHQsIGxlbikgPT0gMCkKKyAgICAgICAgcmV0dXJuIChkdXBzdHIobmFtZSkpOworICAgIEB9CisKKyAgLyogSWYgbm8gbmFtZXMgbWF0Y2hlZCwgdGhlbiByZXR1cm4gTlVMTC4gKi8KKyAgcmV0dXJuICgoY2hhciAqKU5VTEwpOworQH0KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgIEZpbGVNYW4gQ29tbWFuZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBTdHJpbmcgdG8gcGFzcyB0byBzeXN0ZW0gKCkuICBUaGlzIGlzIGZvciB0aGUgTElTVCwgVklFVyBhbmQgUkVOQU1FCisgICBjb21tYW5kcy4gKi8KK3N0YXRpYyBjaGFyIHN5c2NvbVsxMDI0XTsKKworLyogTGlzdCB0aGUgZmlsZShzKSBuYW1lZCBpbiBhcmcuICovCitjb21fbGlzdCAoYXJnKQorICAgICBjaGFyICphcmc7CitAeworICBpZiAoIWFyZykKKyAgICBhcmcgPSAiIjsKKworICBzcHJpbnRmIChzeXNjb20sICJscyAtRkNsZyAlcyIsIGFyZyk7CisgIHJldHVybiAoc3lzdGVtIChzeXNjb20pKTsKK0B9CisKK2NvbV92aWV3IChhcmcpCisgICAgIGNoYXIgKmFyZzsKK0B7CisgIGlmICghdmFsaWRfYXJndW1lbnQgKCJ2aWV3IiwgYXJnKSkKKyAgICByZXR1cm4gMTsKKworICBzcHJpbnRmIChzeXNjb20sICJtb3JlICVzIiwgYXJnKTsKKyAgcmV0dXJuIChzeXN0ZW0gKHN5c2NvbSkpOworQH0KKworY29tX3JlbmFtZSAoYXJnKQorICAgICBjaGFyICphcmc7CitAeworICB0b29fZGFuZ2Vyb3VzICgicmVuYW1lIik7CisgIHJldHVybiAoMSk7CitAfQorCitjb21fc3RhdCAoYXJnKQorICAgICBjaGFyICphcmc7CitAeworICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKKworICBpZiAoIXZhbGlkX2FyZ3VtZW50ICgic3RhdCIsIGFyZykpCisgICAgcmV0dXJuICgxKTsKKworICBpZiAoc3RhdCAoYXJnLCAmZmluZm8pID09IC0xKQorICAgIEB7CisgICAgICBwZXJyb3IgKGFyZyk7CisgICAgICByZXR1cm4gKDEpOworICAgIEB9CisKKyAgcHJpbnRmICgiU3RhdGlzdGljcyBmb3IgYCVzJzpcbiIsIGFyZyk7CisKKyAgcHJpbnRmICgiJXMgaGFzICVkIGxpbmslcywgYW5kIGlzICVkIGJ5dGUlcyBpbiBsZW5ndGguXG4iLCBhcmcsCisgICAgICAgICAgZmluZm8uc3RfbmxpbmssCisgICAgICAgICAgKGZpbmZvLnN0X25saW5rID09IDEpID8gIiIgOiAicyIsCisgICAgICAgICAgZmluZm8uc3Rfc2l6ZSwKKyAgICAgICAgICAoZmluZm8uc3Rfc2l6ZSA9PSAxKSA/ICIiIDogInMiKTsKKyAgcHJpbnRmICgiSW5vZGUgTGFzdCBDaGFuZ2UgYXQ6ICVzIiwgY3RpbWUgKCZmaW5mby5zdF9jdGltZSkpOworICBwcmludGYgKCIgICAgICBMYXN0IGFjY2VzcyBhdDogJXMiLCBjdGltZSAoJmZpbmZvLnN0X2F0aW1lKSk7CisgIHByaW50ZiAoIiAgICBMYXN0IG1vZGlmaWVkIGF0OiAlcyIsIGN0aW1lICgmZmluZm8uc3RfbXRpbWUpKTsKKyAgcmV0dXJuICgwKTsKK0B9CisKK2NvbV9kZWxldGUgKGFyZykKKyAgICAgY2hhciAqYXJnOworQHsKKyAgdG9vX2Rhbmdlcm91cyAoImRlbGV0ZSIpOworICByZXR1cm4gKDEpOworQH0KKworLyogUHJpbnQgb3V0IGhlbHAgZm9yIEFSRywgb3IgZm9yIGFsbCBvZiB0aGUgY29tbWFuZHMgaWYgQVJHIGlzCisgICBub3QgcHJlc2VudC4gKi8KK2NvbV9oZWxwIChhcmcpCisgICAgIGNoYXIgKmFyZzsKK0B7CisgIHJlZ2lzdGVyIGludCBpOworICBpbnQgcHJpbnRlZCA9IDA7CisKKyAgZm9yIChpID0gMDsgY29tbWFuZHNbaV0ubmFtZTsgaSsrKQorICAgIEB7CisgICAgICBpZiAoISphcmcgfHwgKHN0cmNtcCAoYXJnLCBjb21tYW5kc1tpXS5uYW1lKSA9PSAwKSkKKyAgICAgICAgQHsKKyAgICAgICAgICBwcmludGYgKCIlc1x0XHQlcy5cbiIsIGNvbW1hbmRzW2ldLm5hbWUsIGNvbW1hbmRzW2ldLmRvYyk7CisgICAgICAgICAgcHJpbnRlZCsrOworICAgICAgICBAfQorICAgIEB9CisKKyAgaWYgKCFwcmludGVkKQorICAgIEB7CisgICAgICBwcmludGYgKCJObyBjb21tYW5kcyBtYXRjaCBgJXMnLiAgUG9zc2liaWx0aWVzIGFyZTpcbiIsIGFyZyk7CisKKyAgICAgIGZvciAoaSA9IDA7IGNvbW1hbmRzW2ldLm5hbWU7IGkrKykKKyAgICAgICAgQHsKKyAgICAgICAgICAvKiBQcmludCBpbiBzaXggY29sdW1ucy4gKi8KKyAgICAgICAgICBpZiAocHJpbnRlZCA9PSA2KQorICAgICAgICAgICAgQHsKKyAgICAgICAgICAgICAgcHJpbnRlZCA9IDA7CisgICAgICAgICAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICAgICAgICBAfQorCisgICAgICAgICAgcHJpbnRmICgiJXNcdCIsIGNvbW1hbmRzW2ldLm5hbWUpOworICAgICAgICAgIHByaW50ZWQrKzsKKyAgICAgICAgQH0KKworICAgICAgaWYgKHByaW50ZWQpCisgICAgICAgIHByaW50ZiAoIlxuIik7CisgICAgQH0KKyAgcmV0dXJuICgwKTsKK0B9CisKKy8qIENoYW5nZSB0byB0aGUgZGlyZWN0b3J5IEFSRy4gKi8KK2NvbV9jZCAoYXJnKQorICAgICBjaGFyICphcmc7CitAeworICBpZiAoY2hkaXIgKGFyZykgPT0gLTEpCisgICAgQHsKKyAgICAgIHBlcnJvciAoYXJnKTsKKyAgICAgIHJldHVybiAxOworICAgIEB9CisKKyAgY29tX3B3ZCAoIiIpOworICByZXR1cm4gKDApOworQH0KKworLyogUHJpbnQgb3V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAqLworY29tX3B3ZCAoaWdub3JlKQorICAgICBjaGFyICppZ25vcmU7CitAeworICBjaGFyIGRpclsxMDI0XSwgKnM7CisKKyAgcyA9IGdldGN3ZCAoZGlyLCBzaXplb2YoZGlyKSAtIDEpOworICBpZiAocyA9PSAwKQorICAgIEB7CisgICAgICBwcmludGYgKCJFcnJvciBnZXR0aW5nIHB3ZDogJXNcbiIsIGRpcik7CisgICAgICByZXR1cm4gMTsKKyAgICBAfQorCisgIHByaW50ZiAoIkN1cnJlbnQgZGlyZWN0b3J5IGlzICVzXG4iLCBkaXIpOworICByZXR1cm4gMDsKK0B9CisKKy8qIFRoZSB1c2VyIHdpc2hlcyB0byBxdWl0IHVzaW5nIHRoaXMgcHJvZ3JhbS4gIEp1c3Qgc2V0IERPTkUKKyAgIG5vbi16ZXJvLiAqLworY29tX3F1aXQgKGFyZykKKyAgICAgY2hhciAqYXJnOworQHsKKyAgZG9uZSA9IDE7CisgIHJldHVybiAoMCk7CitAfQorCisvKiBGdW5jdGlvbiB3aGljaCB0ZWxscyB5b3UgdGhhdCB5b3UgY2FuJ3QgZG8gdGhpcy4gKi8KK3Rvb19kYW5nZXJvdXMgKGNhbGxlcikKKyAgICAgY2hhciAqY2FsbGVyOworQHsKKyAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAiJXM6IFRvbyBkYW5nZXJvdXMgZm9yIG1lIHRvIGRpc3RyaWJ1dGUuXG4iLAorICAgICAgICAgICBjYWxsZXIpOworICBmcHJpbnRmIChzdGRlcnIsICJXcml0ZSBpdCB5b3Vyc2VsZi5cbiIpOworQH0KKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIEFSRyBpcyBhIHZhbGlkIGFyZ3VtZW50IGZvciBDQUxMRVIsCisgICBlbHNlIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybiB6ZXJvLiAqLworaW50Cit2YWxpZF9hcmd1bWVudCAoY2FsbGVyLCBhcmcpCisgICAgIGNoYXIgKmNhbGxlciwgKmFyZzsKK0B7CisgIGlmICghYXJnIHx8ICEqYXJnKQorICAgIEB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogQXJndW1lbnQgcmVxdWlyZWQuXG4iLCBjYWxsZXIpOworICAgICAgcmV0dXJuICgwKTsKKyAgICBAfQorCisgIHJldHVybiAoMSk7CitAfQorQGVuZCBzbWFsbGV4YW1wbGUKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2RvYy9ybHVzZXIudGV4aSBiL3JlYWRsaW5lL2RvYy9ybHVzZXIudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhiNDFmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZG9jL3JsdXNlci50ZXhpCkBAIC0wLDAgKzEsMTg0NiBAQAorQGNvbW1lbnQgJSoqc3RhcnQgb2YgaGVhZGVyIChUaGlzIGlzIGZvciBydW5uaW5nIFRleGluZm8gb24gYSByZWdpb24uKQorQHNldGZpbGVuYW1lIHJsdXNlci5pbmZvCitAY29tbWVudCAlKiplbmQgb2YgaGVhZGVyIChUaGlzIGlzIGZvciBydW5uaW5nIFRleGluZm8gb24gYSByZWdpb24uKQorQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAorCitAaWdub3JlCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBlbmQgdXNlciBpbnRlcmZhY2UgdG8gdGhlIEdOVSBjb21tYW5kIGxpbmUKK2VkaXRpbmcgZmVhdHVyZXMuICBJdCBpcyB0byBiZSBhbiBhcHBlbmRpeCB0byBtYW51YWxzIGZvciBwcm9ncmFtcyB3aGljaAordXNlIHRoZXNlIGZlYXR1cmVzLiAgVGhlcmUgaXMgYSBkb2N1bWVudCBlbnRpdGxlZCAicmVhZGxpbmUudGV4aW5mbyIKK3doaWNoIGNvbnRhaW5zIGJvdGggZW5kLXVzZXIgYW5kIHByb2dyYW1tZXIgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCitHTlUgUmVhZGxpbmUgTGlicmFyeS4KKworQ29weXJpZ2h0IChDKSAxOTg4LTIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK0F1dGhvcmVkIGJ5IEJyaWFuIEZveCBhbmQgQ2hldCBSYW1leS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKK3Jlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uIG5vdGljZQoraWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGggKHRoaXMKK3BhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbWFudWFsCitwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcmUgcHJlc2VydmVkIG9uCithbGwgY29waWVzLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdCB0aGUKK0dOVSBDb3B5cmlnaHQgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSB0byB0aGUgZGlzdHJpYnV0ZWUsIGFuZCBwcm92aWRlZCB0aGF0Cit0aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KK0BlbmQgaWdub3JlCisKK0Bjb21tZW50IElmIHlvdSBhcmUgaW5jbHVkaW5nIHRoaXMgbWFudWFsIGFzIGFuIGFwcGVuZGl4LCB0aGVuIHNldCB0aGUKK0Bjb21tZW50IHZhcmlhYmxlIHJlYWRsaW5lLWFwcGVuZGl4LgorCitAaWZjbGVhciBCYXNoRmVhdHVyZXMKK0BkZWZjb2RlaW5kZXggYnQKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBDb21tYW5kIExpbmUgRWRpdGluZworQGNoYXB0ZXIgQ29tbWFuZCBMaW5lIEVkaXRpbmcKKworVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgYmFzaWMgZmVhdHVyZXMgb2YgdGhlIEBzY3tnbnV9Citjb21tYW5kIGxpbmUgZWRpdGluZyBpbnRlcmZhY2UuCitAaWZzZXQgQmFzaEZlYXR1cmVzCitDb21tYW5kIGxpbmUgZWRpdGluZyBpcyBwcm92aWRlZCBieSB0aGUgUmVhZGxpbmUgbGlicmFyeSwgd2hpY2ggaXMKK3VzZWQgYnkgc2V2ZXJhbCBkaWZmZXJlbnQgcHJvZ3JhbXMsIGluY2x1ZGluZyBCYXNoLgorQGVuZCBpZnNldAorCitAbWVudQorKiBJbnRyb2R1Y3Rpb24gYW5kIE5vdGF0aW9uOjoJTm90YXRpb24gdXNlZCBpbiB0aGlzIHRleHQuCisqIFJlYWRsaW5lIEludGVyYWN0aW9uOjoJVGhlIG1pbmltdW0gc2V0IG9mIGNvbW1hbmRzIGZvciBlZGl0aW5nIGEgbGluZS4KKyogUmVhZGxpbmUgSW5pdCBGaWxlOjoJCUN1c3RvbWl6aW5nIFJlYWRsaW5lIGZyb20gYSB1c2VyJ3Mgdmlldy4KKyogQmluZGFibGUgUmVhZGxpbmUgQ29tbWFuZHM6OglBIGRlc2NyaXB0aW9uIG9mIG1vc3Qgb2YgdGhlIFJlYWRsaW5lIGNvbW1hbmRzCisJCQkJYXZhaWxhYmxlIGZvciBiaW5kaW5nCisqIFJlYWRsaW5lIHZpIE1vZGU6OgkJQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiBob3cgdG8gbWFrZSBSZWFkbGluZQorCQkJCWJlaGF2ZSBsaWtlIHRoZSB2aSBlZGl0b3IuCitAaWZzZXQgQmFzaEZlYXR1cmVzCisqIFByb2dyYW1tYWJsZSBDb21wbGV0aW9uOjoJSG93IHRvIHNwZWNpZnkgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zIGZvcgorCQkJCWEgc3BlY2lmaWMgY29tbWFuZC4KKyogUHJvZ3JhbW1hYmxlIENvbXBsZXRpb24gQnVpbHRpbnM6OglCdWlsdGluIGNvbW1hbmRzIHRvIHNwZWNpZnkgaG93IHRvCisJCQkJY29tcGxldGUgYXJndW1lbnRzIGZvciBhIHBhcnRpY3VsYXIgY29tbWFuZC4KK0BlbmQgaWZzZXQKK0BlbmQgbWVudQorCitAbm9kZSBJbnRyb2R1Y3Rpb24gYW5kIE5vdGF0aW9uCitAc2VjdGlvbiBJbnRyb2R1Y3Rpb24gdG8gTGluZSBFZGl0aW5nCisKK1RoZSBmb2xsb3dpbmcgcGFyYWdyYXBocyBkZXNjcmliZSB0aGUgbm90YXRpb24gdXNlZCB0byByZXByZXNlbnQKK2tleXN0cm9rZXMuCisKK1RoZSB0ZXh0IEBrYmR7Qy1rfSBpcyByZWFkIGFzIGBDb250cm9sLUsnIGFuZCBkZXNjcmliZXMgdGhlIGNoYXJhY3RlcgorcHJvZHVjZWQgd2hlbiB0aGUgQGtleXtrfSBrZXkgaXMgcHJlc3NlZCB3aGlsZSB0aGUgQ29udHJvbCBrZXkKK2lzIGRlcHJlc3NlZC4KKworVGhlIHRleHQgQGtiZHtNLWt9IGlzIHJlYWQgYXMgYE1ldGEtSycgYW5kIGRlc2NyaWJlcyB0aGUgY2hhcmFjdGVyCitwcm9kdWNlZCB3aGVuIHRoZSBNZXRhIGtleSAoaWYgeW91IGhhdmUgb25lKSBpcyBkZXByZXNzZWQsIGFuZCB0aGUgQGtleXtrfQora2V5IGlzIHByZXNzZWQuCitUaGUgTWV0YSBrZXkgaXMgbGFiZWxlZCBAa2V5e0FMVH0gb24gbWFueSBrZXlib2FyZHMuCitPbiBrZXlib2FyZHMgd2l0aCB0d28ga2V5cyBsYWJlbGVkIEBrZXl7QUxUfSAodXN1YWxseSB0byBlaXRoZXIgc2lkZSBvZgordGhlIHNwYWNlIGJhciksIHRoZSBAa2V5e0FMVH0gb24gdGhlIGxlZnQgc2lkZSBpcyBnZW5lcmFsbHkgc2V0IHRvCit3b3JrIGFzIGEgTWV0YSBrZXkuCitUaGUgQGtleXtBTFR9IGtleSBvbiB0aGUgcmlnaHQgbWF5IGFsc28gYmUgY29uZmlndXJlZCB0byB3b3JrIGFzIGEKK01ldGEga2V5IG9yIG1heSBiZSBjb25maWd1cmVkIGFzIHNvbWUgb3RoZXIgbW9kaWZpZXIsIHN1Y2ggYXMgYQorQ29tcG9zZSBrZXkgZm9yIHR5cGluZyBhY2NlbnRlZCBjaGFyYWN0ZXJzLgorCitJZiB5b3UgZG8gbm90IGhhdmUgYSBNZXRhIG9yIEBrZXl7QUxUfSBrZXksIG9yIGFub3RoZXIga2V5IHdvcmtpbmcgYXMKK2EgTWV0YSBrZXksIHRoZSBpZGVudGljYWwga2V5c3Ryb2tlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgdHlwaW5nIEBrZXl7RVNDfQorQGVtcGh7Zmlyc3R9LCBhbmQgdGhlbiB0eXBpbmcgQGtleXtrfS4KK0VpdGhlciBwcm9jZXNzIGlzIGtub3duIGFzIEBkZm57bWV0YWZ5aW5nfSB0aGUgQGtleXtrfSBrZXkuCisKK1RoZSB0ZXh0IEBrYmR7TS1DLWt9IGlzIHJlYWQgYXMgYE1ldGEtQ29udHJvbC1rJyBhbmQgZGVzY3JpYmVzIHRoZQorY2hhcmFjdGVyIHByb2R1Y2VkIGJ5IEBkZm57bWV0YWZ5aW5nfSBAa2Jke0Mta30uCisKK0luIGFkZGl0aW9uLCBzZXZlcmFsIGtleXMgaGF2ZSB0aGVpciBvd24gbmFtZXMuICBTcGVjaWZpY2FsbHksCitAa2V5e0RFTH0sIEBrZXl7RVNDfSwgQGtleXtMRkR9LCBAa2V5e1NQQ30sIEBrZXl7UkVUfSwgYW5kIEBrZXl7VEFCfSBhbGwKK3N0YW5kIGZvciB0aGVtc2VsdmVzIHdoZW4gc2VlbiBpbiB0aGlzIHRleHQsIG9yIGluIGFuIGluaXQgZmlsZQorKEBweHJlZntSZWFkbGluZSBJbml0IEZpbGV9KS4KK0lmIHlvdXIga2V5Ym9hcmQgbGFja3MgYSBAa2V5e0xGRH0ga2V5LCB0eXBpbmcgQGtleXtDLWp9IHdpbGwKK3Byb2R1Y2UgdGhlIGRlc2lyZWQgY2hhcmFjdGVyLgorVGhlIEBrZXl7UkVUfSBrZXkgbWF5IGJlIGxhYmVsZWQgQGtleXtSZXR1cm59IG9yIEBrZXl7RW50ZXJ9IG9uCitzb21lIGtleWJvYXJkcy4KKworQG5vZGUgUmVhZGxpbmUgSW50ZXJhY3Rpb24KK0BzZWN0aW9uIFJlYWRsaW5lIEludGVyYWN0aW9uCitAY2luZGV4IGludGVyYWN0aW9uLCByZWFkbGluZQorCitPZnRlbiBkdXJpbmcgYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbiB5b3UgdHlwZSBpbiBhIGxvbmcgbGluZSBvZiB0ZXh0LAorb25seSB0byBub3RpY2UgdGhhdCB0aGUgZmlyc3Qgd29yZCBvbiB0aGUgbGluZSBpcyBtaXNzcGVsbGVkLiAgVGhlCitSZWFkbGluZSBsaWJyYXJ5IGdpdmVzIHlvdSBhIHNldCBvZiBjb21tYW5kcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSB0ZXh0CithcyB5b3UgdHlwZSBpdCBpbiwgYWxsb3dpbmcgeW91IHRvIGp1c3QgZml4IHlvdXIgdHlwbywgYW5kIG5vdCBmb3JjaW5nCit5b3UgdG8gcmV0eXBlIHRoZSBtYWpvcml0eSBvZiB0aGUgbGluZS4gIFVzaW5nIHRoZXNlIGVkaXRpbmcgY29tbWFuZHMsCit5b3UgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBwbGFjZSB0aGF0IG5lZWRzIGNvcnJlY3Rpb24sIGFuZCBkZWxldGUgb3IKK2luc2VydCB0aGUgdGV4dCBvZiB0aGUgY29ycmVjdGlvbnMuICBUaGVuLCB3aGVuIHlvdSBhcmUgc2F0aXNmaWVkIHdpdGgKK3RoZSBsaW5lLCB5b3Ugc2ltcGx5IHByZXNzIEBrZXl7UkVUfS4gIFlvdSBkbyBub3QgaGF2ZSB0byBiZSBhdCB0aGUKK2VuZCBvZiB0aGUgbGluZSB0byBwcmVzcyBAa2V5e1JFVH07IHRoZSBlbnRpcmUgbGluZSBpcyBhY2NlcHRlZAorcmVnYXJkbGVzcyBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnNvciB3aXRoaW4gdGhlIGxpbmUuCisKK0BtZW51CisqIFJlYWRsaW5lIEJhcmUgRXNzZW50aWFsczo6CVRoZSBsZWFzdCB5b3UgbmVlZCB0byBrbm93IGFib3V0IFJlYWRsaW5lLgorKiBSZWFkbGluZSBNb3ZlbWVudCBDb21tYW5kczo6CU1vdmluZyBhYm91dCB0aGUgaW5wdXQgbGluZS4KKyogUmVhZGxpbmUgS2lsbGluZyBDb21tYW5kczo6CUhvdyB0byBkZWxldGUgdGV4dCwgYW5kIGhvdyB0byBnZXQgaXQgYmFjayEKKyogUmVhZGxpbmUgQXJndW1lbnRzOjoJCUdpdmluZyBudW1lcmljIGFyZ3VtZW50cyB0byBjb21tYW5kcy4KKyogU2VhcmNoaW5nOjoJCQlTZWFyY2hpbmcgdGhyb3VnaCBwcmV2aW91cyBsaW5lcy4KK0BlbmQgbWVudQorCitAbm9kZSBSZWFkbGluZSBCYXJlIEVzc2VudGlhbHMKK0BzdWJzZWN0aW9uIFJlYWRsaW5lIEJhcmUgRXNzZW50aWFscworQGNpbmRleCBub3RhdGlvbiwgcmVhZGxpbmUKK0BjaW5kZXggY29tbWFuZCBlZGl0aW5nCitAY2luZGV4IGVkaXRpbmcgY29tbWFuZCBsaW5lcworCitJbiBvcmRlciB0byBlbnRlciBjaGFyYWN0ZXJzIGludG8gdGhlIGxpbmUsIHNpbXBseSB0eXBlIHRoZW0uICBUaGUgdHlwZWQKK2NoYXJhY3RlciBhcHBlYXJzIHdoZXJlIHRoZSBjdXJzb3Igd2FzLCBhbmQgdGhlbiB0aGUgY3Vyc29yIG1vdmVzIG9uZQorc3BhY2UgdG8gdGhlIHJpZ2h0LiAgSWYgeW91IG1pc3R5cGUgYSBjaGFyYWN0ZXIsIHlvdSBjYW4gdXNlIHlvdXIKK2VyYXNlIGNoYXJhY3RlciB0byBiYWNrIHVwIGFuZCBkZWxldGUgdGhlIG1pc3R5cGVkIGNoYXJhY3Rlci4KKworU29tZXRpbWVzIHlvdSBtYXkgbWlzdHlwZSBhIGNoYXJhY3RlciwgYW5kCitub3Qgbm90aWNlIHRoZSBlcnJvciB1bnRpbCB5b3UgaGF2ZSB0eXBlZCBzZXZlcmFsIG90aGVyIGNoYXJhY3RlcnMuICBJbgordGhhdCBjYXNlLCB5b3UgY2FuIHR5cGUgQGtiZHtDLWJ9IHRvIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgbGVmdCwgYW5kIHRoZW4KK2NvcnJlY3QgeW91ciBtaXN0YWtlLiAgQWZ0ZXJ3YXJkcywgeW91IGNhbiBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHJpZ2h0Cit3aXRoIEBrYmR7Qy1mfS4KKworV2hlbiB5b3UgYWRkIHRleHQgaW4gdGhlIG1pZGRsZSBvZiBhIGxpbmUsIHlvdSB3aWxsIG5vdGljZSB0aGF0IGNoYXJhY3RlcnMKK3RvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIGFyZSBgcHVzaGVkIG92ZXInIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHRleHQKK3RoYXQgeW91IGhhdmUgaW5zZXJ0ZWQuICBMaWtld2lzZSwgd2hlbiB5b3UgZGVsZXRlIHRleHQgYmVoaW5kIHRoZSBjdXJzb3IsCitjaGFyYWN0ZXJzIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIGFyZSBgcHVsbGVkIGJhY2snIHRvIGZpbGwgaW4gdGhlCitibGFuayBzcGFjZSBjcmVhdGVkIGJ5IHRoZSByZW1vdmFsIG9mIHRoZSB0ZXh0LiAgQSBsaXN0IG9mIHRoZSBiYXJlCitlc3NlbnRpYWxzIGZvciBlZGl0aW5nIHRoZSB0ZXh0IG9mIGFuIGlucHV0IGxpbmUgZm9sbG93cy4KKworQHRhYmxlIEBhc2lzCitAaXRlbSBAa2Jke0MtYn0KK01vdmUgYmFjayBvbmUgY2hhcmFjdGVyLgorQGl0ZW0gQGtiZHtDLWZ9CitNb3ZlIGZvcndhcmQgb25lIGNoYXJhY3Rlci4KK0BpdGVtIEBrZXl7REVMfSBvciBAa2V5e0JhY2tzcGFjZX0KK0RlbGV0ZSB0aGUgY2hhcmFjdGVyIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJzb3IuCitAaXRlbSBAa2Jke0MtZH0KK0RlbGV0ZSB0aGUgY2hhcmFjdGVyIHVuZGVybmVhdGggdGhlIGN1cnNvci4KK0BpdGVtIEB3e1ByaW50aW5nIGNoYXJhY3RlcnN9CitJbnNlcnQgdGhlIGNoYXJhY3RlciBpbnRvIHRoZSBsaW5lIGF0IHRoZSBjdXJzb3IuCitAaXRlbSBAa2Jke0MtX30gb3IgQGtiZHtDLXggQy11fQorVW5kbyB0aGUgbGFzdCBlZGl0aW5nIGNvbW1hbmQuICBZb3UgY2FuIHVuZG8gYWxsIHRoZSB3YXkgYmFjayB0byBhbgorZW1wdHkgbGluZS4KK0BlbmQgdGFibGUKKworQG5vaW5kZW50CisoRGVwZW5kaW5nIG9uIHlvdXIgY29uZmlndXJhdGlvbiwgdGhlIEBrZXl7QmFja3NwYWNlfSBrZXkgYmUgc2V0IHRvCitkZWxldGUgdGhlIGNoYXJhY3RlciB0byB0aGUgbGVmdCBvZiB0aGUgY3Vyc29yIGFuZCB0aGUgQGtleXtERUx9IGtleSBzZXQKK3RvIGRlbGV0ZSB0aGUgY2hhcmFjdGVyIHVuZGVybmVhdGggdGhlIGN1cnNvciwgbGlrZSBAa2Jke0MtZH0sIHJhdGhlcgordGhhbiB0aGUgY2hhcmFjdGVyIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJzb3IuKQorCitAbm9kZSBSZWFkbGluZSBNb3ZlbWVudCBDb21tYW5kcworQHN1YnNlY3Rpb24gUmVhZGxpbmUgTW92ZW1lbnQgQ29tbWFuZHMKKworCitUaGUgYWJvdmUgdGFibGUgZGVzY3JpYmVzIHRoZSBtb3N0IGJhc2ljIGtleXN0cm9rZXMgdGhhdCB5b3UgbmVlZAoraW4gb3JkZXIgdG8gZG8gZWRpdGluZyBvZiB0aGUgaW5wdXQgbGluZS4gIEZvciB5b3VyIGNvbnZlbmllbmNlLCBtYW55CitvdGhlciBjb21tYW5kcyBoYXZlIGJlZW4gYWRkZWQgaW4gYWRkaXRpb24gdG8gQGtiZHtDLWJ9LCBAa2Jke0MtZn0sCitAa2Jke0MtZH0sIGFuZCBAa2V5e0RFTH0uICBIZXJlIGFyZSBzb21lIGNvbW1hbmRzIGZvciBtb3ZpbmcgbW9yZSByYXBpZGx5CithYm91dCB0aGUgbGluZS4KKworQHRhYmxlIEBrYmQKK0BpdGVtIEMtYQorTW92ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCitAaXRlbSBDLWUKK01vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KK0BpdGVtIE0tZgorTW92ZSBmb3J3YXJkIGEgd29yZCwgd2hlcmUgYSB3b3JkIGlzIGNvbXBvc2VkIG9mIGxldHRlcnMgYW5kIGRpZ2l0cy4KK0BpdGVtIE0tYgorTW92ZSBiYWNrd2FyZCBhIHdvcmQuCitAaXRlbSBDLWwKK0NsZWFyIHRoZSBzY3JlZW4sIHJlcHJpbnRpbmcgdGhlIGN1cnJlbnQgbGluZSBhdCB0aGUgdG9wLgorQGVuZCB0YWJsZQorCitOb3RpY2UgaG93IEBrYmR7Qy1mfSBtb3ZlcyBmb3J3YXJkIGEgY2hhcmFjdGVyLCB3aGlsZSBAa2Jke00tZn0gbW92ZXMKK2ZvcndhcmQgYSB3b3JkLiAgSXQgaXMgYSBsb29zZSBjb252ZW50aW9uIHRoYXQgY29udHJvbCBrZXlzdHJva2VzCitvcGVyYXRlIG9uIGNoYXJhY3RlcnMgd2hpbGUgbWV0YSBrZXlzdHJva2VzIG9wZXJhdGUgb24gd29yZHMuCisKK0Bub2RlIFJlYWRsaW5lIEtpbGxpbmcgQ29tbWFuZHMKK0BzdWJzZWN0aW9uIFJlYWRsaW5lIEtpbGxpbmcgQ29tbWFuZHMKKworQGNpbmRleCBraWxsaW5nIHRleHQKK0BjaW5kZXggeWFua2luZyB0ZXh0CisKK0BkZm57S2lsbGluZ30gdGV4dCBtZWFucyB0byBkZWxldGUgdGhlIHRleHQgZnJvbSB0aGUgbGluZSwgYnV0IHRvIHNhdmUKK2l0IGF3YXkgZm9yIGxhdGVyIHVzZSwgdXN1YWxseSBieSBAZGZue3lhbmtpbmd9IChyZS1pbnNlcnRpbmcpCitpdCBiYWNrIGludG8gdGhlIGxpbmUuCisoYEN1dCcgYW5kIGBwYXN0ZScgYXJlIG1vcmUgcmVjZW50IGphcmdvbiBmb3IgYGtpbGwnIGFuZCBgeWFuaycuKQorCitJZiB0aGUgZGVzY3JpcHRpb24gZm9yIGEgY29tbWFuZCBzYXlzIHRoYXQgaXQgYGtpbGxzJyB0ZXh0LCB0aGVuIHlvdSBjYW4KK2JlIHN1cmUgdGhhdCB5b3UgY2FuIGdldCB0aGUgdGV4dCBiYWNrIGluIGEgZGlmZmVyZW50IChvciB0aGUgc2FtZSkKK3BsYWNlIGxhdGVyLgorCitXaGVuIHlvdSB1c2UgYSBraWxsIGNvbW1hbmQsIHRoZSB0ZXh0IGlzIHNhdmVkIGluIGEgQGRmbntraWxsLXJpbmd9LgorQW55IG51bWJlciBvZiBjb25zZWN1dGl2ZSBraWxscyBzYXZlIGFsbCBvZiB0aGUga2lsbGVkIHRleHQgdG9nZXRoZXIsIHNvCit0aGF0IHdoZW4geW91IHlhbmsgaXQgYmFjaywgeW91IGdldCBpdCBhbGwuICBUaGUga2lsbAorcmluZyBpcyBub3QgbGluZSBzcGVjaWZpYzsgdGhlIHRleHQgdGhhdCB5b3Uga2lsbGVkIG9uIGEgcHJldmlvdXNseQordHlwZWQgbGluZSBpcyBhdmFpbGFibGUgdG8gYmUgeWFua2VkIGJhY2sgbGF0ZXIsIHdoZW4geW91IGFyZSB0eXBpbmcKK2Fub3RoZXIgbGluZS4KK0BjaW5kZXgga2lsbCByaW5nCisKK0hlcmUgaXMgdGhlIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGtpbGxpbmcgdGV4dC4KKworQHRhYmxlIEBrYmQKK0BpdGVtIEMtaworS2lsbCB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgorCitAaXRlbSBNLWQKK0tpbGwgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgd29yZCwgb3IsIGlmIGJldHdlZW4KK3dvcmRzLCB0byB0aGUgZW5kIG9mIHRoZSBuZXh0IHdvcmQuCitXb3JkIGJvdW5kYXJpZXMgYXJlIHRoZSBzYW1lIGFzIHRob3NlIHVzZWQgYnkgQGtiZHtNLWZ9LgorCitAaXRlbSBNLUBrZXl7REVMfQorS2lsbCBmcm9tIHRoZSBjdXJzb3IgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHdvcmQsIG9yLCBpZiBiZXR3ZWVuCit3b3JkcywgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwcmV2aW91cyB3b3JkLgorV29yZCBib3VuZGFyaWVzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSB1c2VkIGJ5IEBrYmR7TS1ifS4KKworQGl0ZW0gQy13CitLaWxsIGZyb20gdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgd2hpdGVzcGFjZS4gIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4KK0BrYmR7TS1Aa2V5e0RFTH19IGJlY2F1c2UgdGhlIHdvcmQgYm91bmRhcmllcyBkaWZmZXIuCisKK0BlbmQgdGFibGUKKworSGVyZSBpcyBob3cgdG8gQGRmbnt5YW5rfSB0aGUgdGV4dCBiYWNrIGludG8gdGhlIGxpbmUuICBZYW5raW5nCittZWFucyB0byBjb3B5IHRoZSBtb3N0LXJlY2VudGx5LWtpbGxlZCB0ZXh0IGZyb20gdGhlIGtpbGwgYnVmZmVyLgorCitAdGFibGUgQGtiZAorQGl0ZW0gQy15CitZYW5rIHRoZSBtb3N0IHJlY2VudGx5IGtpbGxlZCB0ZXh0IGJhY2sgaW50byB0aGUgYnVmZmVyIGF0IHRoZSBjdXJzb3IuCisKK0BpdGVtIE0teQorUm90YXRlIHRoZSBraWxsLXJpbmcsIGFuZCB5YW5rIHRoZSBuZXcgdG9wLiAgWW91IGNhbiBvbmx5IGRvIHRoaXMgaWYKK3RoZSBwcmlvciBjb21tYW5kIGlzIEBrYmR7Qy15fSBvciBAa2Jke00teX0uCitAZW5kIHRhYmxlCisKK0Bub2RlIFJlYWRsaW5lIEFyZ3VtZW50cworQHN1YnNlY3Rpb24gUmVhZGxpbmUgQXJndW1lbnRzCisKK1lvdSBjYW4gcGFzcyBudW1lcmljIGFyZ3VtZW50cyB0byBSZWFkbGluZSBjb21tYW5kcy4gIFNvbWV0aW1lcyB0aGUKK2FyZ3VtZW50IGFjdHMgYXMgYSByZXBlYXQgY291bnQsIG90aGVyIHRpbWVzIGl0IGlzIHRoZSBAaXtzaWdufSBvZiB0aGUKK2FyZ3VtZW50IHRoYXQgaXMgc2lnbmlmaWNhbnQuICBJZiB5b3UgcGFzcyBhIG5lZ2F0aXZlIGFyZ3VtZW50IHRvIGEKK2NvbW1hbmQgd2hpY2ggbm9ybWFsbHkgYWN0cyBpbiBhIGZvcndhcmQgZGlyZWN0aW9uLCB0aGF0IGNvbW1hbmQgd2lsbAorYWN0IGluIGEgYmFja3dhcmQgZGlyZWN0aW9uLiAgRm9yIGV4YW1wbGUsIHRvIGtpbGwgdGV4dCBiYWNrIHRvIHRoZQorc3RhcnQgb2YgdGhlIGxpbmUsIHlvdSBtaWdodCB0eXBlIEBzYW1we00tLSBDLWt9LgorCitUaGUgZ2VuZXJhbCB3YXkgdG8gcGFzcyBudW1lcmljIGFyZ3VtZW50cyB0byBhIGNvbW1hbmQgaXMgdG8gdHlwZSBtZXRhCitkaWdpdHMgYmVmb3JlIHRoZSBjb21tYW5kLiAgSWYgdGhlIGZpcnN0IGBkaWdpdCcgdHlwZWQgaXMgYSBtaW51cworc2lnbiAoQHNhbXB7LX0pLCB0aGVuIHRoZSBzaWduIG9mIHRoZSBhcmd1bWVudCB3aWxsIGJlIG5lZ2F0aXZlLiAgT25jZQoreW91IGhhdmUgdHlwZWQgb25lIG1ldGEgZGlnaXQgdG8gZ2V0IHRoZSBhcmd1bWVudCBzdGFydGVkLCB5b3UgY2FuIHR5cGUKK3RoZSByZW1haW5kZXIgb2YgdGhlIGRpZ2l0cywgYW5kIHRoZW4gdGhlIGNvbW1hbmQuICBGb3IgZXhhbXBsZSwgdG8gZ2l2ZQordGhlIEBrYmR7Qy1kfSBjb21tYW5kIGFuIGFyZ3VtZW50IG9mIDEwLCB5b3UgY291bGQgdHlwZSBAc2FtcHtNLTEgMCBDLWR9LAord2hpY2ggd2lsbCBkZWxldGUgdGhlIG5leHQgdGVuIGNoYXJhY3RlcnMgb24gdGhlIGlucHV0IGxpbmUuCisKK0Bub2RlIFNlYXJjaGluZworQHN1YnNlY3Rpb24gU2VhcmNoaW5nIGZvciBDb21tYW5kcyBpbiB0aGUgSGlzdG9yeQorCitSZWFkbGluZSBwcm92aWRlcyBjb21tYW5kcyBmb3Igc2VhcmNoaW5nIHRocm91Z2ggdGhlIGNvbW1hbmQgaGlzdG9yeQorQGlmc2V0IEJhc2hGZWF0dXJlcworKEBweHJlZntCYXNoIEhpc3RvcnkgRmFjaWxpdGllc30pCitAZW5kIGlmc2V0Citmb3IgbGluZXMgY29udGFpbmluZyBhIHNwZWNpZmllZCBzdHJpbmcuCitUaGVyZSBhcmUgdHdvIHNlYXJjaCBtb2RlczogIEBkZm57aW5jcmVtZW50YWx9IGFuZCBAZGZue25vbi1pbmNyZW1lbnRhbH0uCisKK0luY3JlbWVudGFsIHNlYXJjaGVzIGJlZ2luIGJlZm9yZSB0aGUgdXNlciBoYXMgZmluaXNoZWQgdHlwaW5nIHRoZQorc2VhcmNoIHN0cmluZy4KK0FzIGVhY2ggY2hhcmFjdGVyIG9mIHRoZSBzZWFyY2ggc3RyaW5nIGlzIHR5cGVkLCBSZWFkbGluZSBkaXNwbGF5cwordGhlIG5leHQgZW50cnkgZnJvbSB0aGUgaGlzdG9yeSBtYXRjaGluZyB0aGUgc3RyaW5nIHR5cGVkIHNvIGZhci4KK0FuIGluY3JlbWVudGFsIHNlYXJjaCByZXF1aXJlcyBvbmx5IGFzIG1hbnkgY2hhcmFjdGVycyBhcyBuZWVkZWQgdG8KK2ZpbmQgdGhlIGRlc2lyZWQgaGlzdG9yeSBlbnRyeS4KK1RvIHNlYXJjaCBiYWNrd2FyZCBpbiB0aGUgaGlzdG9yeSBmb3IgYSBwYXJ0aWN1bGFyIHN0cmluZywgdHlwZQorQGtiZHtDLXJ9LiAgVHlwaW5nIEBrYmR7Qy1zfSBzZWFyY2hlcyBmb3J3YXJkIHRocm91Z2ggdGhlIGhpc3RvcnkuCitUaGUgY2hhcmFjdGVycyBwcmVzZW50IGluIHRoZSB2YWx1ZSBvZiB0aGUgQGNvZGV7aXNlYXJjaC10ZXJtaW5hdG9yc30gdmFyaWFibGUKK2FyZSB1c2VkIHRvIHRlcm1pbmF0ZSBhbiBpbmNyZW1lbnRhbCBzZWFyY2guCitJZiB0aGF0IHZhcmlhYmxlIGhhcyBub3QgYmVlbiBhc3NpZ25lZCBhIHZhbHVlLCB0aGUgQGtleXtFU0N9IGFuZAorQGtiZHtDLUp9IGNoYXJhY3RlcnMgd2lsbCB0ZXJtaW5hdGUgYW4gaW5jcmVtZW50YWwgc2VhcmNoLgorQGtiZHtDLWd9IHdpbGwgYWJvcnQgYW4gaW5jcmVtZW50YWwgc2VhcmNoIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBsaW5lLgorV2hlbiB0aGUgc2VhcmNoIGlzIHRlcm1pbmF0ZWQsIHRoZSBoaXN0b3J5IGVudHJ5IGNvbnRhaW5pbmcgdGhlCitzZWFyY2ggc3RyaW5nIGJlY29tZXMgdGhlIGN1cnJlbnQgbGluZS4KKworVG8gZmluZCBvdGhlciBtYXRjaGluZyBlbnRyaWVzIGluIHRoZSBoaXN0b3J5IGxpc3QsIHR5cGUgQGtiZHtDLXJ9IG9yCitAa2Jke0Mtc30gYXMgYXBwcm9wcmlhdGUuCitUaGlzIHdpbGwgc2VhcmNoIGJhY2t3YXJkIG9yIGZvcndhcmQgaW4gdGhlIGhpc3RvcnkgZm9yIHRoZSBuZXh0CitlbnRyeSBtYXRjaGluZyB0aGUgc2VhcmNoIHN0cmluZyB0eXBlZCBzbyBmYXIuCitBbnkgb3RoZXIga2V5IHNlcXVlbmNlIGJvdW5kIHRvIGEgUmVhZGxpbmUgY29tbWFuZCB3aWxsIHRlcm1pbmF0ZQordGhlIHNlYXJjaCBhbmQgZXhlY3V0ZSB0aGF0IGNvbW1hbmQuCitGb3IgaW5zdGFuY2UsIGEgQGtleXtSRVR9IHdpbGwgdGVybWluYXRlIHRoZSBzZWFyY2ggYW5kIGFjY2VwdAordGhlIGxpbmUsIHRoZXJlYnkgZXhlY3V0aW5nIHRoZSBjb21tYW5kIGZyb20gdGhlIGhpc3RvcnkgbGlzdC4KK0EgbW92ZW1lbnQgY29tbWFuZCB3aWxsIHRlcm1pbmF0ZSB0aGUgc2VhcmNoLCBtYWtlIHRoZSBsYXN0IGxpbmUgZm91bmQKK3RoZSBjdXJyZW50IGxpbmUsIGFuZCBiZWdpbiBlZGl0aW5nLgorCitSZWFkbGluZSByZW1lbWJlcnMgdGhlIGxhc3QgaW5jcmVtZW50YWwgc2VhcmNoIHN0cmluZy4gIElmIHR3bworQGtiZHtDLXJ9cyBhcmUgdHlwZWQgd2l0aG91dCBhbnkgaW50ZXJ2ZW5pbmcgY2hhcmFjdGVycyBkZWZpbmluZyBhIG5ldworc2VhcmNoIHN0cmluZywgYW55IHJlbWVtYmVyZWQgc2VhcmNoIHN0cmluZyBpcyB1c2VkLgorCitOb24taW5jcmVtZW50YWwgc2VhcmNoZXMgcmVhZCB0aGUgZW50aXJlIHNlYXJjaCBzdHJpbmcgYmVmb3JlIHN0YXJ0aW5nCit0byBzZWFyY2ggZm9yIG1hdGNoaW5nIGhpc3RvcnkgbGluZXMuICBUaGUgc2VhcmNoIHN0cmluZyBtYXkgYmUKK3R5cGVkIGJ5IHRoZSB1c2VyIG9yIGJlIHBhcnQgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGxpbmUuCisKK0Bub2RlIFJlYWRsaW5lIEluaXQgRmlsZQorQHNlY3Rpb24gUmVhZGxpbmUgSW5pdCBGaWxlCitAY2luZGV4IGluaXRpYWxpemF0aW9uIGZpbGUsIHJlYWRsaW5lCisKK0FsdGhvdWdoIHRoZSBSZWFkbGluZSBsaWJyYXJ5IGNvbWVzIHdpdGggYSBzZXQgb2YgRW1hY3MtbGlrZQora2V5YmluZGluZ3MgaW5zdGFsbGVkIGJ5IGRlZmF1bHQsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBhIGRpZmZlcmVudCBzZXQKK29mIGtleWJpbmRpbmdzLgorQW55IHVzZXIgY2FuIGN1c3RvbWl6ZSBwcm9ncmFtcyB0aGF0IHVzZSBSZWFkbGluZSBieSBwdXR0aW5nCitjb21tYW5kcyBpbiBhbiBAZGZue2lucHV0cmN9IGZpbGUsIGNvbnZlbnRpb25hbGx5IGluIGhpcyBob21lIGRpcmVjdG9yeS4KK1RoZSBuYW1lIG9mIHRoaXMKK0BpZnNldCBCYXNoRmVhdHVyZXMKK2ZpbGUgaXMgdGFrZW4gZnJvbSB0aGUgdmFsdWUgb2YgdGhlIHNoZWxsIHZhcmlhYmxlIEBlbnZ7SU5QVVRSQ30uICBJZgorQGVuZCBpZnNldAorQGlmY2xlYXIgQmFzaEZlYXR1cmVzCitmaWxlIGlzIHRha2VuIGZyb20gdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBAZW52e0lOUFVUUkN9LiAgSWYKK0BlbmQgaWZjbGVhcgordGhhdCB2YXJpYWJsZSBpcyB1bnNldCwgdGhlIGRlZmF1bHQgaXMgQGZpbGV7fi8uaW5wdXRyY30uCisKK1doZW4gYSBwcm9ncmFtIHdoaWNoIHVzZXMgdGhlIFJlYWRsaW5lIGxpYnJhcnkgc3RhcnRzIHVwLCB0aGUKK2luaXQgZmlsZSBpcyByZWFkLCBhbmQgdGhlIGtleSBiaW5kaW5ncyBhcmUgc2V0LgorCitJbiBhZGRpdGlvbiwgdGhlIEBjb2Rle0MteCBDLXJ9IGNvbW1hbmQgcmUtcmVhZHMgdGhpcyBpbml0IGZpbGUsIHRodXMKK2luY29ycG9yYXRpbmcgYW55IGNoYW5nZXMgdGhhdCB5b3UgbWlnaHQgaGF2ZSBtYWRlIHRvIGl0LgorCitAbWVudQorKiBSZWFkbGluZSBJbml0IEZpbGUgU3ludGF4OjoJU3ludGF4IGZvciB0aGUgY29tbWFuZHMgaW4gdGhlIGlucHV0cmMgZmlsZS4KKworKiBDb25kaXRpb25hbCBJbml0IENvbnN0cnVjdHM6OglDb25kaXRpb25hbCBrZXkgYmluZGluZ3MgaW4gdGhlIGlucHV0cmMgZmlsZS4KKworKiBTYW1wbGUgSW5pdCBGaWxlOjoJCUFuIGV4YW1wbGUgaW5wdXRyYyBmaWxlLgorQGVuZCBtZW51CisKK0Bub2RlIFJlYWRsaW5lIEluaXQgRmlsZSBTeW50YXgKK0BzdWJzZWN0aW9uIFJlYWRsaW5lIEluaXQgRmlsZSBTeW50YXgKKworVGhlcmUgYXJlIG9ubHkgYSBmZXcgYmFzaWMgY29uc3RydWN0cyBhbGxvd2VkIGluIHRoZQorUmVhZGxpbmUgaW5pdCBmaWxlLiAgQmxhbmsgbGluZXMgYXJlIGlnbm9yZWQuCitMaW5lcyBiZWdpbm5pbmcgd2l0aCBhIEBzYW1weyN9IGFyZSBjb21tZW50cy4KK0xpbmVzIGJlZ2lubmluZyB3aXRoIGEgQHNhbXB7JH0gaW5kaWNhdGUgY29uZGl0aW9uYWwKK2NvbnN0cnVjdHMgKEBweHJlZntDb25kaXRpb25hbCBJbml0IENvbnN0cnVjdHN9KS4gIE90aGVyIGxpbmVzCitkZW5vdGUgdmFyaWFibGUgc2V0dGluZ3MgYW5kIGtleSBiaW5kaW5ncy4KKworQHRhYmxlIEBhc2lzCitAaXRlbSBWYXJpYWJsZSBTZXR0aW5ncworWW91IGNhbiBtb2RpZnkgdGhlIHJ1bi10aW1lIGJlaGF2aW9yIG9mIFJlYWRsaW5lIGJ5CithbHRlcmluZyB0aGUgdmFsdWVzIG9mIHZhcmlhYmxlcyBpbiBSZWFkbGluZQordXNpbmcgdGhlIEBjb2Rle3NldH0gY29tbWFuZCB3aXRoaW4gdGhlIGluaXQgZmlsZS4KK1RoZSBzeW50YXggaXMgc2ltcGxlOgorCitAZXhhbXBsZQorc2V0IEB2YXJ7dmFyaWFibGV9IEB2YXJ7dmFsdWV9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitIZXJlLCBmb3IgZXhhbXBsZSwgaXMgaG93IHRvCitjaGFuZ2UgZnJvbSB0aGUgZGVmYXVsdCBFbWFjcy1saWtlIGtleSBiaW5kaW5nIHRvIHVzZQorQGNvZGV7dml9IGxpbmUgZWRpdGluZyBjb21tYW5kczoKKworQGV4YW1wbGUKK3NldCBlZGl0aW5nLW1vZGUgdmkKK0BlbmQgZXhhbXBsZQorCitWYXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzLCB3aGVyZSBhcHByb3ByaWF0ZSwgYXJlIHJlY29nbml6ZWQgd2l0aG91dCByZWdhcmQKK3RvIGNhc2UuICBVbnJlY29nbml6ZWQgdmFyaWFibGUgbmFtZXMgYXJlIGlnbm9yZWQuCisKK0Jvb2xlYW4gdmFyaWFibGVzICh0aG9zZSB0aGF0IGNhbiBiZSBzZXQgdG8gb24gb3Igb2ZmKSBhcmUgc2V0IHRvIG9uIGlmCit0aGUgdmFsdWUgaXMgbnVsbCBvciBlbXB0eSwgQHZhcntvbn0gKGNhc2UtaW5zZW5zaXRpdmUpLCBvciAxLiAgQW55IG90aGVyCit2YWx1ZSByZXN1bHRzIGluIHRoZSB2YXJpYWJsZSBiZWluZyBzZXQgdG8gb2ZmLgorCitAaWZzZXQgQmFzaEZlYXR1cmVzCitUaGUgQHd7QGNvZGV7YmluZCAtVn19IGNvbW1hbmQgbGlzdHMgdGhlIGN1cnJlbnQgUmVhZGxpbmUgdmFyaWFibGUgbmFtZXMKK2FuZCB2YWx1ZXMuICBAeHJlZntCYXNoIEJ1aWx0aW5zfS4KK0BlbmQgaWZzZXQKKworQSBncmVhdCBkZWFsIG9mIHJ1bi10aW1lIGJlaGF2aW9yIGlzIGNoYW5nZWFibGUgd2l0aCB0aGUgZm9sbG93aW5nCit2YXJpYWJsZXMuCisKK0BjaW5kZXggdmFyaWFibGVzLCByZWFkbGluZQorQHRhYmxlIEBjb2RlCisKK0BpdGVtIGJlbGwtc3R5bGUKK0B2aW5kZXggYmVsbC1zdHlsZQorQ29udHJvbHMgd2hhdCBoYXBwZW5zIHdoZW4gUmVhZGxpbmUgd2FudHMgdG8gcmluZyB0aGUgdGVybWluYWwgYmVsbC4KK0lmIHNldCB0byBAc2FtcHtub25lfSwgUmVhZGxpbmUgbmV2ZXIgcmluZ3MgdGhlIGJlbGwuICBJZiBzZXQgdG8KK0BzYW1we3Zpc2libGV9LCBSZWFkbGluZSB1c2VzIGEgdmlzaWJsZSBiZWxsIGlmIG9uZSBpcyBhdmFpbGFibGUuCitJZiBzZXQgdG8gQHNhbXB7YXVkaWJsZX0gKHRoZSBkZWZhdWx0KSwgUmVhZGxpbmUgYXR0ZW1wdHMgdG8gcmluZwordGhlIHRlcm1pbmFsJ3MgYmVsbC4KKworQGl0ZW0gYmluZC10dHktc3BlY2lhbC1jaGFycworQHZpbmRleCBiaW5kLXR0eS1zcGVjaWFsLWNoYXJzCitJZiBzZXQgdG8gQHNhbXB7b259LCBSZWFkbGluZSBhdHRlbXB0cyB0byBiaW5kIHRoZSBjb250cm9sIGNoYXJhY3RlcnMgIAordHJlYXRlZCBzcGVjaWFsbHkgYnkgdGhlIGtlcm5lbCdzIHRlcm1pbmFsIGRyaXZlciB0byB0aGVpciBSZWFkbGluZQorZXF1aXZhbGVudHMuCisKK0BpdGVtIGNvbW1lbnQtYmVnaW4KK0B2aW5kZXggY29tbWVudC1iZWdpbgorVGhlIHN0cmluZyB0byBpbnNlcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSB3aGVuIHRoZQorQGNvZGV7aW5zZXJ0LWNvbW1lbnR9IGNvbW1hbmQgaXMgZXhlY3V0ZWQuICBUaGUgZGVmYXVsdCB2YWx1ZQoraXMgQGNvZGV7IiMifS4KKworQGl0ZW0gY29tcGxldGlvbi1pZ25vcmUtY2FzZQorSWYgc2V0IHRvIEBzYW1we29ufSwgUmVhZGxpbmUgcGVyZm9ybXMgZmlsZW5hbWUgbWF0Y2hpbmcgYW5kIGNvbXBsZXRpb24KK2luIGEgY2FzZS1pbnNlbnNpdGl2ZSBmYXNoaW9uLgorVGhlIGRlZmF1bHQgdmFsdWUgaXMgQHNhbXB7b2ZmfS4KKworQGl0ZW0gY29tcGxldGlvbi1xdWVyeS1pdGVtcworQHZpbmRleCBjb21wbGV0aW9uLXF1ZXJ5LWl0ZW1zCitUaGUgbnVtYmVyIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRoZSB1c2VyIGlzCithc2tlZCB3aGV0aGVyIHRoZSBsaXN0IG9mIHBvc3NpYmlsaXRpZXMgc2hvdWxkIGJlIGRpc3BsYXllZC4KK0lmIHRoZSBudW1iZXIgb2YgcG9zc2libGUgY29tcGxldGlvbnMgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUsCitSZWFkbGluZSB3aWxsIGFzayB0aGUgdXNlciB3aGV0aGVyIG9yIG5vdCBoZSB3aXNoZXMgdG8gdmlldwordGhlbTsgb3RoZXJ3aXNlLCB0aGV5IGFyZSBzaW1wbHkgbGlzdGVkLgorVGhpcyB2YXJpYWJsZSBtdXN0IGJlIHNldCB0byBhbiBpbnRlZ2VyIHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLgorQSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyBSZWFkbGluZSBzaG91bGQgbmV2ZXIgYXNrLgorVGhlIGRlZmF1bHQgbGltaXQgaXMgQGNvZGV7MTAwfS4KKworQGl0ZW0gY29udmVydC1tZXRhCitAdmluZGV4IGNvbnZlcnQtbWV0YQorSWYgc2V0IHRvIEBzYW1we29ufSwgUmVhZGxpbmUgd2lsbCBjb252ZXJ0IGNoYXJhY3RlcnMgd2l0aCB0aGUKK2VpZ2h0aCBiaXQgc2V0IHRvIGFuIEBzY3thc2NpaX0ga2V5IHNlcXVlbmNlIGJ5IHN0cmlwcGluZyB0aGUgZWlnaHRoCitiaXQgYW5kIHByZWZpeGluZyBhbiBAa2V5e0VTQ30gY2hhcmFjdGVyLCBjb252ZXJ0aW5nIHRoZW0gdG8gYQorbWV0YS1wcmVmaXhlZCBrZXkgc2VxdWVuY2UuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHtvbn0uCisKK0BpdGVtIGRpc2FibGUtY29tcGxldGlvbgorQHZpbmRleCBkaXNhYmxlLWNvbXBsZXRpb24KK0lmIHNldCB0byBAc2FtcHtPbn0sIFJlYWRsaW5lIHdpbGwgaW5oaWJpdCB3b3JkIGNvbXBsZXRpb24uCitDb21wbGV0aW9uICBjaGFyYWN0ZXJzIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgbGluZSBhcyBpZiB0aGV5IGhhZAorYmVlbiBtYXBwZWQgdG8gQGNvZGV7c2VsZi1pbnNlcnR9LiAgVGhlIGRlZmF1bHQgaXMgQHNhbXB7b2ZmfS4KKworQGl0ZW0gZWRpdGluZy1tb2RlCitAdmluZGV4IGVkaXRpbmctbW9kZQorVGhlIEBjb2Rle2VkaXRpbmctbW9kZX0gdmFyaWFibGUgY29udHJvbHMgd2hpY2ggZGVmYXVsdCBzZXQgb2YKK2tleSBiaW5kaW5ncyBpcyB1c2VkLiAgQnkgZGVmYXVsdCwgUmVhZGxpbmUgc3RhcnRzIHVwIGluIEVtYWNzIGVkaXRpbmcKK21vZGUsIHdoZXJlIHRoZSBrZXlzdHJva2VzIGFyZSBtb3N0IHNpbWlsYXIgdG8gRW1hY3MuICBUaGlzIHZhcmlhYmxlIGNhbiBiZQorc2V0IHRvIGVpdGhlciBAc2FtcHtlbWFjc30gb3IgQHNhbXB7dml9LgorCitAaXRlbSBlbmFibGUta2V5cGFkCitAdmluZGV4IGVuYWJsZS1rZXlwYWQKK1doZW4gc2V0IHRvIEBzYW1we29ufSwgUmVhZGxpbmUgd2lsbCB0cnkgdG8gZW5hYmxlIHRoZSBhcHBsaWNhdGlvbgora2V5cGFkIHdoZW4gaXQgaXMgY2FsbGVkLiAgU29tZSBzeXN0ZW1zIG5lZWQgdGhpcyB0byBlbmFibGUgdGhlCithcnJvdyBrZXlzLiAgVGhlIGRlZmF1bHQgaXMgQHNhbXB7b2ZmfS4KKworQGl0ZW0gZXhwYW5kLXRpbGRlCitAdmluZGV4IGV4cGFuZC10aWxkZQorSWYgc2V0IHRvIEBzYW1we29ufSwgdGlsZGUgZXhwYW5zaW9uIGlzIHBlcmZvcm1lZCB3aGVuIFJlYWRsaW5lCithdHRlbXB0cyB3b3JkIGNvbXBsZXRpb24uICBUaGUgZGVmYXVsdCBpcyBAc2FtcHtvZmZ9LgorCitAaXRlbSBoaXN0b3J5LXByZXNlcnZlLXBvaW50CitAdmluZGV4IGhpc3RvcnktcHJlc2VydmUtcG9pbnQKK0lmIHNldCB0byBAc2FtcHtvbn0sIHRoZSBoaXN0b3J5IGNvZGUgYXR0ZW1wdHMgdG8gcGxhY2UgcG9pbnQgYXQgdGhlCitzYW1lIGxvY2F0aW9uIG9uIGVhY2ggaGlzdG9yeSBsaW5lIHJldHJpZXZlZCB3aXRoIEBjb2Rle3ByZXZpb3VzLWhpc3Rvcnl9CitvciBAY29kZXtuZXh0LWhpc3Rvcnl9LiAgVGhlIGRlZmF1bHQgaXMgQHNhbXB7b2ZmfS4KKworQGl0ZW0gaG9yaXpvbnRhbC1zY3JvbGwtbW9kZQorQHZpbmRleCBob3Jpem9udGFsLXNjcm9sbC1tb2RlCitUaGlzIHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8gZWl0aGVyIEBzYW1we29ufSBvciBAc2FtcHtvZmZ9LiAgU2V0dGluZyBpdAordG8gQHNhbXB7b259IG1lYW5zIHRoYXQgdGhlIHRleHQgb2YgdGhlIGxpbmVzIGJlaW5nIGVkaXRlZCB3aWxsIHNjcm9sbAoraG9yaXpvbnRhbGx5IG9uIGEgc2luZ2xlIHNjcmVlbiBsaW5lIHdoZW4gdGhleSBhcmUgbG9uZ2VyIHRoYW4gdGhlIHdpZHRoCitvZiB0aGUgc2NyZWVuLCBpbnN0ZWFkIG9mIHdyYXBwaW5nIG9udG8gYSBuZXcgc2NyZWVuIGxpbmUuICBCeSBkZWZhdWx0LAordGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gQHNhbXB7b2ZmfS4KKworQGl0ZW0gaW5wdXQtbWV0YQorQHZpbmRleCBpbnB1dC1tZXRhCitAdmluZGV4IG1ldGEtZmxhZworSWYgc2V0IHRvIEBzYW1we29ufSwgUmVhZGxpbmUgd2lsbCBlbmFibGUgZWlnaHQtYml0IGlucHV0IChpdAord2lsbCBub3QgY2xlYXIgdGhlIGVpZ2h0aCBiaXQgaW4gdGhlIGNoYXJhY3RlcnMgaXQgcmVhZHMpLAorcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSB0ZXJtaW5hbCBjbGFpbXMgaXQgY2FuIHN1cHBvcnQuICBUaGUKK2RlZmF1bHQgdmFsdWUgaXMgQHNhbXB7b2ZmfS4gIFRoZSBuYW1lIEBjb2Rle21ldGEtZmxhZ30gaXMgYQorc3lub255bSBmb3IgdGhpcyB2YXJpYWJsZS4KKworQGl0ZW0gaXNlYXJjaC10ZXJtaW5hdG9ycworQHZpbmRleCBpc2VhcmNoLXRlcm1pbmF0b3JzCitUaGUgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgdGVybWluYXRlIGFuIGluY3JlbWVudGFsIHNlYXJjaCB3aXRob3V0CitzdWJzZXF1ZW50bHkgZXhlY3V0aW5nIHRoZSBjaGFyYWN0ZXIgYXMgYSBjb21tYW5kIChAcHhyZWZ7U2VhcmNoaW5nfSkuCitJZiB0aGlzIHZhcmlhYmxlIGhhcyBub3QgYmVlbiBnaXZlbiBhIHZhbHVlLCB0aGUgY2hhcmFjdGVycyBAa2V5e0VTQ30gYW5kCitAa2Jke0MtSn0gd2lsbCB0ZXJtaW5hdGUgYW4gaW5jcmVtZW50YWwgc2VhcmNoLgorCitAaXRlbSBrZXltYXAKK0B2aW5kZXgga2V5bWFwCitTZXRzIFJlYWRsaW5lJ3MgaWRlYSBvZiB0aGUgY3VycmVudCBrZXltYXAgZm9yIGtleSBiaW5kaW5nIGNvbW1hbmRzLgorQWNjZXB0YWJsZSBAY29kZXtrZXltYXB9IG5hbWVzIGFyZQorQGNvZGV7ZW1hY3N9LAorQGNvZGV7ZW1hY3Mtc3RhbmRhcmR9LAorQGNvZGV7ZW1hY3MtbWV0YX0sCitAY29kZXtlbWFjcy1jdGx4fSwKK0Bjb2Rle3ZpfSwKK0Bjb2Rle3ZpLW1vdmV9LAorQGNvZGV7dmktY29tbWFuZH0sIGFuZAorQGNvZGV7dmktaW5zZXJ0fS4KK0Bjb2Rle3ZpfSBpcyBlcXVpdmFsZW50IHRvIEBjb2Rle3ZpLWNvbW1hbmR9OyBAY29kZXtlbWFjc30gaXMKK2VxdWl2YWxlbnQgdG8gQGNvZGV7ZW1hY3Mtc3RhbmRhcmR9LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7ZW1hY3N9LgorVGhlIHZhbHVlIG9mIHRoZSBAY29kZXtlZGl0aW5nLW1vZGV9IHZhcmlhYmxlIGFsc28gYWZmZWN0cyB0aGUKK2RlZmF1bHQga2V5bWFwLgorCitAaXRlbSBtYXJrLWRpcmVjdG9yaWVzCitJZiBzZXQgdG8gQHNhbXB7b259LCBjb21wbGV0ZWQgZGlyZWN0b3J5IG5hbWVzIGhhdmUgYSBzbGFzaAorYXBwZW5kZWQuICBUaGUgZGVmYXVsdCBpcyBAc2FtcHtvbn0uCisKK0BpdGVtIG1hcmstbW9kaWZpZWQtbGluZXMKK0B2aW5kZXggbWFyay1tb2RpZmllZC1saW5lcworVGhpcyB2YXJpYWJsZSwgd2hlbiBzZXQgdG8gQHNhbXB7b259LCBjYXVzZXMgUmVhZGxpbmUgdG8gZGlzcGxheSBhbgorYXN0ZXJpc2sgKEBzYW1weyp9KSBhdCB0aGUgc3RhcnQgb2YgaGlzdG9yeSBsaW5lcyB3aGljaCBoYXZlIGJlZW4gbW9kaWZpZWQuCitUaGlzIHZhcmlhYmxlIGlzIEBzYW1we29mZn0gYnkgZGVmYXVsdC4KKworQGl0ZW0gbWFyay1zeW1saW5rZWQtZGlyZWN0b3JpZXMKK0B2aW5kZXggbWFyay1zeW1saW5rZWQtZGlyZWN0b3JpZXMKK0lmIHNldCB0byBAc2FtcHtvbn0sIGNvbXBsZXRlZCBuYW1lcyB3aGljaCBhcmUgc3ltYm9saWMgbGlua3MKK3RvIGRpcmVjdG9yaWVzIGhhdmUgYSBzbGFzaCBhcHBlbmRlZCAoc3ViamVjdCB0byB0aGUgdmFsdWUgb2YKK0Bjb2Rle21hcmstZGlyZWN0b3JpZXN9KS4KK1RoZSBkZWZhdWx0IGlzIEBzYW1we29mZn0uCisKK0BpdGVtIG1hdGNoLWhpZGRlbi1maWxlcworQHZpbmRleCBtYXRjaC1oaWRkZW4tZmlsZXMKK1RoaXMgdmFyaWFibGUsIHdoZW4gc2V0IHRvIEBzYW1we29ufSwgY2F1c2VzIFJlYWRsaW5lIHRvIG1hdGNoIGZpbGVzIHdob3NlCituYW1lcyBiZWdpbiB3aXRoIGEgQHNhbXB7Ln0gKGhpZGRlbiBmaWxlcykgd2hlbiBwZXJmb3JtaW5nIGZpbGVuYW1lCitjb21wbGV0aW9uLCB1bmxlc3MgdGhlIGxlYWRpbmcgQHNhbXB7Ln0gaXMKK3N1cHBsaWVkIGJ5IHRoZSB1c2VyIGluIHRoZSBmaWxlbmFtZSB0byBiZSBjb21wbGV0ZWQuCitUaGlzIHZhcmlhYmxlIGlzIEBzYW1we29ufSBieSBkZWZhdWx0LgorCitAaXRlbSBvdXRwdXQtbWV0YQorQHZpbmRleCBvdXRwdXQtbWV0YQorSWYgc2V0IHRvIEBzYW1we29ufSwgUmVhZGxpbmUgd2lsbCBkaXNwbGF5IGNoYXJhY3RlcnMgd2l0aCB0aGUKK2VpZ2h0aCBiaXQgc2V0IGRpcmVjdGx5IHJhdGhlciB0aGFuIGFzIGEgbWV0YS1wcmVmaXhlZCBlc2NhcGUKK3NlcXVlbmNlLiAgVGhlIGRlZmF1bHQgaXMgQHNhbXB7b2ZmfS4KKworQGl0ZW0gcGFnZS1jb21wbGV0aW9ucworQHZpbmRleCBwYWdlLWNvbXBsZXRpb25zCitJZiBzZXQgdG8gQHNhbXB7b259LCBSZWFkbGluZSB1c2VzIGFuIGludGVybmFsIEBjb2Rle21vcmV9LWxpa2UgcGFnZXIKK3RvIGRpc3BsYXkgYSBzY3JlZW5mdWwgb2YgcG9zc2libGUgY29tcGxldGlvbnMgYXQgYSB0aW1lLgorVGhpcyB2YXJpYWJsZSBpcyBAc2FtcHtvbn0gYnkgZGVmYXVsdC4KKworQGl0ZW0gcHJpbnQtY29tcGxldGlvbnMtaG9yaXpvbnRhbGx5CitJZiBzZXQgdG8gQHNhbXB7b259LCBSZWFkbGluZSB3aWxsIGRpc3BsYXkgY29tcGxldGlvbnMgd2l0aCBtYXRjaGVzCitzb3J0ZWQgaG9yaXpvbnRhbGx5IGluIGFscGhhYmV0aWNhbCBvcmRlciwgcmF0aGVyIHRoYW4gZG93biB0aGUgc2NyZWVuLgorVGhlIGRlZmF1bHQgaXMgQHNhbXB7b2ZmfS4KKworQGl0ZW0gc2hvdy1hbGwtaWYtYW1iaWd1b3VzCitAdmluZGV4IHNob3ctYWxsLWlmLWFtYmlndW91cworVGhpcyBhbHRlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIGNvbXBsZXRpb24gZnVuY3Rpb25zLiAgSWYKK3NldCB0byBAc2FtcHtvbn0sIAord29yZHMgd2hpY2ggaGF2ZSBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIGNvbXBsZXRpb24gY2F1c2UgdGhlCittYXRjaGVzIHRvIGJlIGxpc3RlZCBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHJpbmdpbmcgdGhlIGJlbGwuCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHtvZmZ9LgorCitAaXRlbSBzaG93LWFsbC1pZi11bm1vZGlmaWVkCitAdmluZGV4IHNob3ctYWxsLWlmLXVubW9kaWZpZWQKK1RoaXMgYWx0ZXJzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9ucyBpbgorYSBmYXNoaW9uIHNpbWlsYXIgdG8gQHZhcntzaG93LWFsbC1pZi1hbWJpZ3VvdXN9LgorSWYgc2V0IHRvIEBzYW1we29ufSwgCit3b3JkcyB3aGljaCBoYXZlIG1vcmUgdGhhbiBvbmUgcG9zc2libGUgY29tcGxldGlvbiB3aXRob3V0IGFueQorcG9zc2libGUgcGFydGlhbCBjb21wbGV0aW9uICh0aGUgcG9zc2libGUgY29tcGxldGlvbnMgZG9uJ3Qgc2hhcmUKK2EgY29tbW9uIHByZWZpeCkgY2F1c2UgdGhlIG1hdGNoZXMgdG8gYmUgbGlzdGVkIGltbWVkaWF0ZWx5IGluc3RlYWQKK29mIHJpbmdpbmcgdGhlIGJlbGwuCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHtvZmZ9LgorCitAaXRlbSB2aXNpYmxlLXN0YXRzCitAdmluZGV4IHZpc2libGUtc3RhdHMKK0lmIHNldCB0byBAc2FtcHtvbn0sIGEgY2hhcmFjdGVyIGRlbm90aW5nIGEgZmlsZSdzIHR5cGUKK2lzIGFwcGVuZGVkIHRvIHRoZSBmaWxlbmFtZSB3aGVuIGxpc3RpbmcgcG9zc2libGUKK2NvbXBsZXRpb25zLiAgVGhlIGRlZmF1bHQgaXMgQHNhbXB7b2ZmfS4KKworQGVuZCB0YWJsZQorCitAaXRlbSBLZXkgQmluZGluZ3MKK1RoZSBzeW50YXggZm9yIGNvbnRyb2xsaW5nIGtleSBiaW5kaW5ncyBpbiB0aGUgaW5pdCBmaWxlIGlzCitzaW1wbGUuICBGaXJzdCB5b3UgbmVlZCB0byBmaW5kIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRoYXQgeW91Cit3YW50IHRvIGNoYW5nZS4gIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgY29udGFpbiB0YWJsZXMgb2YgdGhlIGNvbW1hbmQKK25hbWUsIHRoZSBkZWZhdWx0IGtleWJpbmRpbmcsIGlmIGFueSwgYW5kIGEgc2hvcnQgZGVzY3JpcHRpb24gb2Ygd2hhdAordGhlIGNvbW1hbmQgZG9lcy4KKworT25jZSB5b3Uga25vdyB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCwgc2ltcGx5IHBsYWNlIG9uIGEgbGluZQoraW4gdGhlIGluaXQgZmlsZSB0aGUgbmFtZSBvZiB0aGUga2V5Cit5b3Ugd2lzaCB0byBiaW5kIHRoZSBjb21tYW5kIHRvLCBhIGNvbG9uLCBhbmQgdGhlbiB0aGUgbmFtZSBvZiB0aGUKK2NvbW1hbmQuICBUaGUgbmFtZSBvZiB0aGUga2V5CitjYW4gYmUgZXhwcmVzc2VkIGluIGRpZmZlcmVudCB3YXlzLCBkZXBlbmRpbmcgb24gd2hhdCB5b3UgZmluZCBtb3N0Citjb21mb3J0YWJsZS4KKworSW4gYWRkaXRpb24gdG8gY29tbWFuZCBuYW1lcywgcmVhZGxpbmUgYWxsb3dzIGtleXMgdG8gYmUgYm91bmQKK3RvIGEgc3RyaW5nIHRoYXQgaXMgaW5zZXJ0ZWQgd2hlbiB0aGUga2V5IGlzIHByZXNzZWQgKGEgQHZhcnttYWNyb30pLgorCitAaWZzZXQgQmFzaEZlYXR1cmVzCitUaGUgQHd7QGNvZGV7YmluZCAtcH19IGNvbW1hbmQgZGlzcGxheXMgUmVhZGxpbmUgZnVuY3Rpb24gbmFtZXMgYW5kCitiaW5kaW5ncyBpbiBhIGZvcm1hdCB0aGF0IGNhbiBwdXQgZGlyZWN0bHkgaW50byBhbiBpbml0aWFsaXphdGlvbiBmaWxlLgorQHhyZWZ7QmFzaCBCdWlsdGluc30uCitAZW5kIGlmc2V0CisKK0B0YWJsZSBAYXNpcworQGl0ZW0gQHd7QHZhcntrZXluYW1lfTogQHZhcntmdW5jdGlvbi1uYW1lfSBvciBAdmFye21hY3JvfX0KK0B2YXJ7a2V5bmFtZX0gaXMgdGhlIG5hbWUgb2YgYSBrZXkgc3BlbGxlZCBvdXQgaW4gRW5nbGlzaC4gIEZvciBleGFtcGxlOgorQGV4YW1wbGUKK0NvbnRyb2wtdTogdW5pdmVyc2FsLWFyZ3VtZW50CitNZXRhLVJ1Ym91dDogYmFja3dhcmQta2lsbC13b3JkCitDb250cm9sLW86ICI+IG91dHB1dCIKK0BlbmQgZXhhbXBsZQorCitJbiB0aGUgYWJvdmUgZXhhbXBsZSwgQGtiZHtDLXV9IGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbgorQGNvZGV7dW5pdmVyc2FsLWFyZ3VtZW50fSwKK0BrYmR7TS1ERUx9IGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBAY29kZXtiYWNrd2FyZC1raWxsLXdvcmR9LCBhbmQKK0BrYmR7Qy1vfSBpcyBib3VuZCB0byBydW4gdGhlIG1hY3JvCitleHByZXNzZWQgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSAodGhhdCBpcywgdG8gaW5zZXJ0IHRoZSB0ZXh0CitAc2FtcHs+IG91dHB1dH0gaW50byB0aGUgbGluZSkuCisKK0EgbnVtYmVyIG9mIHN5bWJvbGljIGNoYXJhY3RlciBuYW1lcyBhcmUgcmVjb2duaXplZCB3aGlsZQorcHJvY2Vzc2luZyB0aGlzIGtleSBiaW5kaW5nIHN5bnRheDoKK0B2YXJ7REVMfSwKK0B2YXJ7RVNDfSwKK0B2YXJ7RVNDQVBFfSwKK0B2YXJ7TEZEfSwKK0B2YXJ7TkVXTElORX0sCitAdmFye1JFVH0sCitAdmFye1JFVFVSTn0sCitAdmFye1JVQk9VVH0sCitAdmFye1NQQUNFfSwKK0B2YXJ7U1BDfSwKK2FuZAorQHZhcntUQUJ9LgorCitAaXRlbSBAd3siQHZhcntrZXlzZXF9IjogQHZhcntmdW5jdGlvbi1uYW1lfSBvciBAdmFye21hY3JvfX0KK0B2YXJ7a2V5c2VxfSBkaWZmZXJzIGZyb20gQHZhcntrZXluYW1lfSBhYm92ZSBpbiB0aGF0IHN0cmluZ3MKK2Rlbm90aW5nIGFuIGVudGlyZSBrZXkgc2VxdWVuY2UgY2FuIGJlIHNwZWNpZmllZCwgYnkgcGxhY2luZwordGhlIGtleSBzZXF1ZW5jZSBpbiBkb3VibGUgcXVvdGVzLiAgU29tZSBAc2N7Z251fSBFbWFjcyBzdHlsZSBrZXkKK2VzY2FwZXMgY2FuIGJlIHVzZWQsIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgYnV0IHRoZQorc3BlY2lhbCBjaGFyYWN0ZXIgbmFtZXMgYXJlIG5vdCByZWNvZ25pemVkLgorCitAZXhhbXBsZQorIlxDLXUiOiB1bml2ZXJzYWwtYXJndW1lbnQKKyJcQy14XEMtciI6IHJlLXJlYWQtaW5pdC1maWxlCisiXGVbMTF+IjogIkZ1bmN0aW9uIEtleSAxIgorQGVuZCBleGFtcGxlCisKK0luIHRoZSBhYm92ZSBleGFtcGxlLCBAa2Jke0MtdX0gaXMgYWdhaW4gYm91bmQgdG8gdGhlIGZ1bmN0aW9uCitAY29kZXt1bml2ZXJzYWwtYXJndW1lbnR9IChqdXN0IGFzIGl0IHdhcyBpbiB0aGUgZmlyc3QgZXhhbXBsZSksCitAc2FtcHtAa2Jke0MteH0gQGtiZHtDLXJ9fSBpcyBib3VuZCB0byB0aGUgZnVuY3Rpb24gQGNvZGV7cmUtcmVhZC1pbml0LWZpbGV9LAorYW5kIEBzYW1we0BrZXl7RVNDfSBAa2V5e1t9IEBrZXl7MX0gQGtleXsxfSBAa2V5e359fSBpcyBib3VuZCB0byBpbnNlcnQKK3RoZSB0ZXh0IEBzYW1we0Z1bmN0aW9uIEtleSAxfS4KKworQGVuZCB0YWJsZQorCitUaGUgZm9sbG93aW5nIEBzY3tnbnV9IEVtYWNzIHN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGF2YWlsYWJsZSB3aGVuCitzcGVjaWZ5aW5nIGtleSBzZXF1ZW5jZXM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gQGtiZHtcQy19Citjb250cm9sIHByZWZpeAorQGl0ZW0gQGtiZHtcTS19CittZXRhIHByZWZpeAorQGl0ZW0gQGtiZHtcZX0KK2FuIGVzY2FwZSBjaGFyYWN0ZXIKK0BpdGVtIEBrYmR7XFx9CitiYWNrc2xhc2gKK0BpdGVtIEBrYmR7XCJ9CitAa2V5eyJ9LCBhIGRvdWJsZSBxdW90YXRpb24gbWFyaworQGl0ZW0gQGtiZHtcJ30KK0BrZXl7J30sIGEgc2luZ2xlIHF1b3RlIG9yIGFwb3N0cm9waGUKK0BlbmQgdGFibGUKKworSW4gYWRkaXRpb24gdG8gdGhlIEBzY3tnbnV9IEVtYWNzIHN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMsIGEgc2Vjb25kCitzZXQgb2YgYmFja3NsYXNoIGVzY2FwZXMgaXMgYXZhaWxhYmxlOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIFxhCithbGVydCAoYmVsbCkKK0BpdGVtIFxiCitiYWNrc3BhY2UKK0BpdGVtIFxkCitkZWxldGUKK0BpdGVtIFxmCitmb3JtIGZlZWQKK0BpdGVtIFxuCituZXdsaW5lCitAaXRlbSBccgorY2FycmlhZ2UgcmV0dXJuCitAaXRlbSBcdAoraG9yaXpvbnRhbCB0YWIKK0BpdGVtIFx2Cit2ZXJ0aWNhbCB0YWIKK0BpdGVtIFxAdmFye25ubn0KK3RoZSBlaWdodC1iaXQgY2hhcmFjdGVyIHdob3NlIHZhbHVlIGlzIHRoZSBvY3RhbCB2YWx1ZSBAdmFye25ubn0KKyhvbmUgdG8gdGhyZWUgZGlnaXRzKQorQGl0ZW0gXHhAdmFye0hIfQordGhlIGVpZ2h0LWJpdCBjaGFyYWN0ZXIgd2hvc2UgdmFsdWUgaXMgdGhlIGhleGFkZWNpbWFsIHZhbHVlIEB2YXJ7SEh9Cisob25lIG9yIHR3byBoZXggZGlnaXRzKQorQGVuZCB0YWJsZQorCitXaGVuIGVudGVyaW5nIHRoZSB0ZXh0IG9mIGEgbWFjcm8sIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzIG11c3QKK2JlIHVzZWQgdG8gaW5kaWNhdGUgYSBtYWNybyBkZWZpbml0aW9uLgorVW5xdW90ZWQgdGV4dCBpcyBhc3N1bWVkIHRvIGJlIGEgZnVuY3Rpb24gbmFtZS4KK0luIHRoZSBtYWNybyBib2R5LCB0aGUgYmFja3NsYXNoIGVzY2FwZXMgZGVzY3JpYmVkIGFib3ZlIGFyZSBleHBhbmRlZC4KK0JhY2tzbGFzaCB3aWxsIHF1b3RlIGFueSBvdGhlciBjaGFyYWN0ZXIgaW4gdGhlIG1hY3JvIHRleHQsCitpbmNsdWRpbmcgQHNhbXB7In0gYW5kIEBzYW1weyd9LgorRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYmluZGluZyB3aWxsIG1ha2UgQHNhbXB7QGtiZHtDLXh9IFx9CitpbnNlcnQgYSBzaW5nbGUgQHNhbXB7XH0gaW50byB0aGUgbGluZToKK0BleGFtcGxlCisiXEMteFxcIjogIlxcIgorQGVuZCBleGFtcGxlCisKK0BlbmQgdGFibGUKKworQG5vZGUgQ29uZGl0aW9uYWwgSW5pdCBDb25zdHJ1Y3RzCitAc3Vic2VjdGlvbiBDb25kaXRpb25hbCBJbml0IENvbnN0cnVjdHMKKworUmVhZGxpbmUgaW1wbGVtZW50cyBhIGZhY2lsaXR5IHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBjb25kaXRpb25hbAorY29tcGlsYXRpb24gZmVhdHVyZXMgb2YgdGhlIEMgcHJlcHJvY2Vzc29yIHdoaWNoIGFsbG93cyBrZXkKK2JpbmRpbmdzIGFuZCB2YXJpYWJsZSBzZXR0aW5ncyB0byBiZSBwZXJmb3JtZWQgYXMgdGhlIHJlc3VsdAorb2YgdGVzdHMuICBUaGVyZSBhcmUgZm91ciBwYXJzZXIgZGlyZWN0aXZlcyB1c2VkLgorCitAdGFibGUgQGNvZGUKK0BpdGVtICRpZgorVGhlIEBjb2RleyRpZn0gY29uc3RydWN0IGFsbG93cyBiaW5kaW5ncyB0byBiZSBtYWRlIGJhc2VkIG9uIHRoZQorZWRpdGluZyBtb2RlLCB0aGUgdGVybWluYWwgYmVpbmcgdXNlZCwgb3IgdGhlIGFwcGxpY2F0aW9uIHVzaW5nCitSZWFkbGluZS4gIFRoZSB0ZXh0IG9mIHRoZSB0ZXN0IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZTsKK25vIGNoYXJhY3RlcnMgYXJlIHJlcXVpcmVkIHRvIGlzb2xhdGUgaXQuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gbW9kZQorVGhlIEBjb2Rle21vZGU9fSBmb3JtIG9mIHRoZSBAY29kZXskaWZ9IGRpcmVjdGl2ZSBpcyB1c2VkIHRvIHRlc3QKK3doZXRoZXIgUmVhZGxpbmUgaXMgaW4gQGNvZGV7ZW1hY3N9IG9yIEBjb2Rle3ZpfSBtb2RlLgorVGhpcyBtYXkgYmUgdXNlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgQHNhbXB7c2V0IGtleW1hcH0gY29tbWFuZCwgZm9yIGluc3RhbmNlLCB0byBzZXQgYmluZGluZ3MgaW4KK3RoZSBAY29kZXtlbWFjcy1zdGFuZGFyZH0gYW5kIEBjb2Rle2VtYWNzLWN0bHh9IGtleW1hcHMgb25seSBpZgorUmVhZGxpbmUgaXMgc3RhcnRpbmcgb3V0IGluIEBjb2Rle2VtYWNzfSBtb2RlLgorCitAaXRlbSB0ZXJtCitUaGUgQGNvZGV7dGVybT19IGZvcm0gbWF5IGJlIHVzZWQgdG8gaW5jbHVkZSB0ZXJtaW5hbC1zcGVjaWZpYwora2V5IGJpbmRpbmdzLCBwZXJoYXBzIHRvIGJpbmQgdGhlIGtleSBzZXF1ZW5jZXMgb3V0cHV0IGJ5IHRoZQordGVybWluYWwncyBmdW5jdGlvbiBrZXlzLiAgVGhlIHdvcmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlCitAc2FtcHs9fSBpcyB0ZXN0ZWQgYWdhaW5zdCBib3RoIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHRlcm1pbmFsIGFuZAordGhlIHBvcnRpb24gb2YgdGhlIHRlcm1pbmFsIG5hbWUgYmVmb3JlIHRoZSBmaXJzdCBAc2FtcHstfS4gIFRoaXMKK2FsbG93cyBAY29kZXtzdW59IHRvIG1hdGNoIGJvdGggQGNvZGV7c3VufSBhbmQgQGNvZGV7c3VuLWNtZH0sCitmb3IgaW5zdGFuY2UuCisKK0BpdGVtIGFwcGxpY2F0aW9uCitUaGUgQHZhcnthcHBsaWNhdGlvbn0gY29uc3RydWN0IGlzIHVzZWQgdG8gaW5jbHVkZQorYXBwbGljYXRpb24tc3BlY2lmaWMgc2V0dGluZ3MuICBFYWNoIHByb2dyYW0gdXNpbmcgdGhlIFJlYWRsaW5lCitsaWJyYXJ5IHNldHMgdGhlIEB2YXJ7YXBwbGljYXRpb24gbmFtZX0sIGFuZCB5b3UgY2FuIHRlc3QgZm9yCithIHBhcnRpY3VsYXIgdmFsdWUuIAorVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGJpbmQga2V5IHNlcXVlbmNlcyB0byBmdW5jdGlvbnMgdXNlZnVsIGZvcgorYSBzcGVjaWZpYyBwcm9ncmFtLiAgRm9yIGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgYWRkcyBhCitrZXkgc2VxdWVuY2UgdGhhdCBxdW90ZXMgdGhlIGN1cnJlbnQgb3IgcHJldmlvdXMgd29yZCBpbiBCYXNoOgorQGV4YW1wbGUKKyRpZiBCYXNoCisjIFF1b3RlIHRoZSBjdXJyZW50IG9yIHByZXZpb3VzIHdvcmQKKyJcQy14cSI6ICJcZWJcIlxlZlwiIgorJGVuZGlmCitAZW5kIGV4YW1wbGUKK0BlbmQgdGFibGUKKworQGl0ZW0gJGVuZGlmCitUaGlzIGNvbW1hbmQsIGFzIHNlZW4gaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHRlcm1pbmF0ZXMgYW4KK0Bjb2RleyRpZn0gY29tbWFuZC4KKworQGl0ZW0gJGVsc2UKK0NvbW1hbmRzIGluIHRoaXMgYnJhbmNoIG9mIHRoZSBAY29kZXskaWZ9IGRpcmVjdGl2ZSBhcmUgZXhlY3V0ZWQgaWYKK3RoZSB0ZXN0IGZhaWxzLgorCitAaXRlbSAkaW5jbHVkZQorVGhpcyBkaXJlY3RpdmUgdGFrZXMgYSBzaW5nbGUgZmlsZW5hbWUgYXMgYW4gYXJndW1lbnQgYW5kIHJlYWRzIGNvbW1hbmRzCithbmQgYmluZGluZ3MgZnJvbSB0aGF0IGZpbGUuCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmUgcmVhZHMgZnJvbSBAZmlsZXsvZXRjL2lucHV0cmN9OgorQGV4YW1wbGUKKyRpbmNsdWRlIC9ldGMvaW5wdXRyYworQGVuZCBleGFtcGxlCitAZW5kIHRhYmxlCisKK0Bub2RlIFNhbXBsZSBJbml0IEZpbGUKK0BzdWJzZWN0aW9uIFNhbXBsZSBJbml0IEZpbGUKKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIGFuIEB2YXJ7aW5wdXRyY30gZmlsZS4gIFRoaXMgaWxsdXN0cmF0ZXMga2V5CitiaW5kaW5nLCB2YXJpYWJsZSBhc3NpZ25tZW50LCBhbmQgY29uZGl0aW9uYWwgc3ludGF4LgorCitAZXhhbXBsZQorQHBhZ2UKKyMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBiZWhhdmlvdXIgb2YgbGluZSBpbnB1dCBlZGl0aW5nIGZvcgorIyBwcm9ncmFtcyB0aGF0IHVzZSB0aGUgR05VIFJlYWRsaW5lIGxpYnJhcnkuICBFeGlzdGluZworIyBwcm9ncmFtcyBpbmNsdWRlIEZUUCwgQmFzaCwgYW5kIEdEQi4KKyMKKyMgWW91IGNhbiByZS1yZWFkIHRoZSBpbnB1dHJjIGZpbGUgd2l0aCBDLXggQy1yLgorIyBMaW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGNvbW1lbnRzLgorIworIyBGaXJzdCwgaW5jbHVkZSBhbnkgc3lzdGVtd2lkZSBiaW5kaW5ncyBhbmQgdmFyaWFibGUKKyMgYXNzaWdubWVudHMgZnJvbSAvZXRjL0lucHV0cmMKKyRpbmNsdWRlIC9ldGMvSW5wdXRyYworCisjCisjIFNldCB2YXJpb3VzIGJpbmRpbmdzIGZvciBlbWFjcyBtb2RlLgorCitzZXQgZWRpdGluZy1tb2RlIGVtYWNzIAorCiskaWYgbW9kZT1lbWFjcworCitNZXRhLUNvbnRyb2wtaDoJYmFja3dhcmQta2lsbC13b3JkCVRleHQgYWZ0ZXIgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgaWdub3JlZAorCisjCisjIEFycm93IGtleXMgaW4ga2V5cGFkIG1vZGUKKyMKKyMiXE0tT0QiOiAgICAgICAgYmFja3dhcmQtY2hhcgorIyJcTS1PQyI6ICAgICAgICBmb3J3YXJkLWNoYXIKKyMiXE0tT0EiOiAgICAgICAgcHJldmlvdXMtaGlzdG9yeQorIyJcTS1PQiI6ICAgICAgICBuZXh0LWhpc3RvcnkKKyMKKyMgQXJyb3cga2V5cyBpbiBBTlNJIG1vZGUKKyMKKyJcTS1bRCI6ICAgICAgICBiYWNrd2FyZC1jaGFyCisiXE0tW0MiOiAgICAgICAgZm9yd2FyZC1jaGFyCisiXE0tW0EiOiAgICAgICAgcHJldmlvdXMtaGlzdG9yeQorIlxNLVtCIjogICAgICAgIG5leHQtaGlzdG9yeQorIworIyBBcnJvdyBrZXlzIGluIDggYml0IGtleXBhZCBtb2RlCisjCisjIlxNLVxDLU9EIjogICAgICAgYmFja3dhcmQtY2hhcgorIyJcTS1cQy1PQyI6ICAgICAgIGZvcndhcmQtY2hhcgorIyJcTS1cQy1PQSI6ICAgICAgIHByZXZpb3VzLWhpc3RvcnkKKyMiXE0tXEMtT0IiOiAgICAgICBuZXh0LWhpc3RvcnkKKyMKKyMgQXJyb3cga2V5cyBpbiA4IGJpdCBBTlNJIG1vZGUKKyMKKyMiXE0tXEMtW0QiOiAgICAgICBiYWNrd2FyZC1jaGFyCisjIlxNLVxDLVtDIjogICAgICAgZm9yd2FyZC1jaGFyCisjIlxNLVxDLVtBIjogICAgICAgcHJldmlvdXMtaGlzdG9yeQorIyJcTS1cQy1bQiI6ICAgICAgIG5leHQtaGlzdG9yeQorCitDLXE6IHF1b3RlZC1pbnNlcnQKKworJGVuZGlmCisKKyMgQW4gb2xkLXN0eWxlIGJpbmRpbmcuICBUaGlzIGhhcHBlbnMgdG8gYmUgdGhlIGRlZmF1bHQuCitUQUI6IGNvbXBsZXRlCisKKyMgTWFjcm9zIHRoYXQgYXJlIGNvbnZlbmllbnQgZm9yIHNoZWxsIGludGVyYWN0aW9uCiskaWYgQmFzaAorIyBlZGl0IHRoZSBwYXRoCisiXEMteHAiOiAiUEFUSD0kQHtQQVRIQH1cZVxDLWVcQy1hXGVmXEMtZiIKKyMgcHJlcGFyZSB0byB0eXBlIGEgcXVvdGVkIHdvcmQgLS0KKyMgaW5zZXJ0IG9wZW4gYW5kIGNsb3NlIGRvdWJsZSBxdW90ZXMKKyMgYW5kIG1vdmUgdG8ganVzdCBhZnRlciB0aGUgb3BlbiBxdW90ZQorIlxDLXhcIiI6ICJcIlwiXEMtYiIKKyMgaW5zZXJ0IGEgYmFja3NsYXNoICh0ZXN0aW5nIGJhY2tzbGFzaCBlc2NhcGVzCisjIGluIHNlcXVlbmNlcyBhbmQgbWFjcm9zKQorIlxDLXhcXCI6ICJcXCIKKyMgUXVvdGUgdGhlIGN1cnJlbnQgb3IgcHJldmlvdXMgd29yZAorIlxDLXhxIjogIlxlYlwiXGVmXCIiCisjIEFkZCBhIGJpbmRpbmcgdG8gcmVmcmVzaCB0aGUgbGluZSwgd2hpY2ggaXMgdW5ib3VuZAorIlxDLXhyIjogcmVkcmF3LWN1cnJlbnQtbGluZQorIyBFZGl0IHZhcmlhYmxlIG9uIGN1cnJlbnQgbGluZS4KKyJcTS1cQy12IjogIlxDLWFcQy1rJFxDLXlcTS1cQy1lXEMtYVxDLXk9IgorJGVuZGlmCisKKyMgdXNlIGEgdmlzaWJsZSBiZWxsIGlmIG9uZSBpcyBhdmFpbGFibGUKK3NldCBiZWxsLXN0eWxlIHZpc2libGUKKworIyBkb24ndCBzdHJpcCBjaGFyYWN0ZXJzIHRvIDcgYml0cyB3aGVuIHJlYWRpbmcKK3NldCBpbnB1dC1tZXRhIG9uCisKKyMgYWxsb3cgaXNvLWxhdGluMSBjaGFyYWN0ZXJzIHRvIGJlIGluc2VydGVkIHJhdGhlcgorIyB0aGFuIGNvbnZlcnRlZCB0byBwcmVmaXgtbWV0YSBzZXF1ZW5jZXMKK3NldCBjb252ZXJ0LW1ldGEgb2ZmCisKKyMgZGlzcGxheSBjaGFyYWN0ZXJzIHdpdGggdGhlIGVpZ2h0aCBiaXQgc2V0IGRpcmVjdGx5CisjIHJhdGhlciB0aGFuIGFzIG1ldGEtcHJlZml4ZWQgY2hhcmFjdGVycworc2V0IG91dHB1dC1tZXRhIG9uCisKKyMgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAxNTAgcG9zc2libGUgY29tcGxldGlvbnMgZm9yCisjIGEgd29yZCwgYXNrIHRoZSB1c2VyIGlmIGhlIHdhbnRzIHRvIHNlZSBhbGwgb2YgdGhlbQorc2V0IGNvbXBsZXRpb24tcXVlcnktaXRlbXMgMTUwCisKKyMgRm9yIEZUUAorJGlmIEZ0cAorIlxDLXhnIjogImdldCBcTS0/IgorIlxDLXh0IjogInB1dCBcTS0/IgorIlxNLS4iOiB5YW5rLWxhc3QtYXJnCiskZW5kaWYKK0BlbmQgZXhhbXBsZQorCitAbm9kZSBCaW5kYWJsZSBSZWFkbGluZSBDb21tYW5kcworQHNlY3Rpb24gQmluZGFibGUgUmVhZGxpbmUgQ29tbWFuZHMKKworQG1lbnUKKyogQ29tbWFuZHMgRm9yIE1vdmluZzo6CQlNb3ZpbmcgYWJvdXQgdGhlIGxpbmUuCisqIENvbW1hbmRzIEZvciBIaXN0b3J5OjoJR2V0dGluZyBhdCBwcmV2aW91cyBsaW5lcy4KKyogQ29tbWFuZHMgRm9yIFRleHQ6OgkJQ29tbWFuZHMgZm9yIGNoYW5naW5nIHRleHQuCisqIENvbW1hbmRzIEZvciBLaWxsaW5nOjoJQ29tbWFuZHMgZm9yIGtpbGxpbmcgYW5kIHlhbmtpbmcuCisqIE51bWVyaWMgQXJndW1lbnRzOjoJCVNwZWNpZnlpbmcgbnVtZXJpYyBhcmd1bWVudHMsIHJlcGVhdCBjb3VudHMuCisqIENvbW1hbmRzIEZvciBDb21wbGV0aW9uOjoJR2V0dGluZyBSZWFkbGluZSB0byBkbyB0aGUgdHlwaW5nIGZvciB5b3UuCisqIEtleWJvYXJkIE1hY3Jvczo6CQlTYXZpbmcgYW5kIHJlLWV4ZWN1dGluZyB0eXBlZCBjaGFyYWN0ZXJzCisqIE1pc2NlbGxhbmVvdXMgQ29tbWFuZHM6OglPdGhlciBtaXNjZWxsYW5lb3VzIGNvbW1hbmRzLgorQGVuZCBtZW51CisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgUmVhZGxpbmUgY29tbWFuZHMgdGhhdCBtYXkgYmUgYm91bmQgdG8ga2V5CitzZXF1ZW5jZXMuCitAaWZzZXQgQmFzaEZlYXR1cmVzCitZb3UgY2FuIGxpc3QgeW91ciBrZXkgYmluZGluZ3MgYnkgZXhlY3V0aW5nCitAd3tAY29kZXtiaW5kIC1QfX0gb3IsIGZvciBhIG1vcmUgdGVyc2UgZm9ybWF0LCBzdWl0YWJsZSBmb3IgYW4KK0B2YXJ7aW5wdXRyY30gZmlsZSwgQHd7QGNvZGV7YmluZCAtcH19LiAgKEB4cmVme0Jhc2ggQnVpbHRpbnN9LikKK0BlbmQgaWZzZXQKK0NvbW1hbmQgbmFtZXMgd2l0aG91dCBhbiBhY2NvbXBhbnlpbmcga2V5IHNlcXVlbmNlIGFyZSB1bmJvdW5kIGJ5IGRlZmF1bHQuCisKK0luIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb25zLCBAZGZue3BvaW50fSByZWZlcnMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCitwb3NpdGlvbiwgYW5kIEBkZm57bWFya30gcmVmZXJzIHRvIGEgY3Vyc29yIHBvc2l0aW9uIHNhdmVkIGJ5IHRoZQorQGNvZGV7c2V0LW1hcmt9IGNvbW1hbmQuCitUaGUgdGV4dCBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgbWFyayBpcyByZWZlcnJlZCB0byBhcyB0aGUgQGRmbntyZWdpb259LgorCitAbm9kZSBDb21tYW5kcyBGb3IgTW92aW5nCitAc3Vic2VjdGlvbiBDb21tYW5kcyBGb3IgTW92aW5nCitAZnRhYmxlIEBjb2RlCitAaXRlbSBiZWdpbm5pbmctb2YtbGluZSAoQy1hKQorTW92ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgbGluZS4KKworQGl0ZW0gZW5kLW9mLWxpbmUgKEMtZSkKK01vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KKworQGl0ZW0gZm9yd2FyZC1jaGFyIChDLWYpCitNb3ZlIGZvcndhcmQgYSBjaGFyYWN0ZXIuCisKK0BpdGVtIGJhY2t3YXJkLWNoYXIgKEMtYikKK01vdmUgYmFjayBhIGNoYXJhY3Rlci4KKworQGl0ZW0gZm9yd2FyZC13b3JkIChNLWYpCitNb3ZlIGZvcndhcmQgdG8gdGhlIGVuZCBvZiB0aGUgbmV4dCB3b3JkLiAgV29yZHMgYXJlIGNvbXBvc2VkIG9mCitsZXR0ZXJzIGFuZCBkaWdpdHMuCisKK0BpdGVtIGJhY2t3YXJkLXdvcmQgKE0tYikKK01vdmUgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgb3IgcHJldmlvdXMgd29yZC4gIFdvcmRzIGFyZQorY29tcG9zZWQgb2YgbGV0dGVycyBhbmQgZGlnaXRzLgorCitAaXRlbSBjbGVhci1zY3JlZW4gKEMtbCkKK0NsZWFyIHRoZSBzY3JlZW4gYW5kIHJlZHJhdyB0aGUgY3VycmVudCBsaW5lLAorbGVhdmluZyB0aGUgY3VycmVudCBsaW5lIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbi4KKworQGl0ZW0gcmVkcmF3LWN1cnJlbnQtbGluZSAoKQorUmVmcmVzaCB0aGUgY3VycmVudCBsaW5lLiAgQnkgZGVmYXVsdCwgdGhpcyBpcyB1bmJvdW5kLgorCitAZW5kIGZ0YWJsZQorCitAbm9kZSBDb21tYW5kcyBGb3IgSGlzdG9yeQorQHN1YnNlY3Rpb24gQ29tbWFuZHMgRm9yIE1hbmlwdWxhdGluZyBUaGUgSGlzdG9yeQorCitAZnRhYmxlIEBjb2RlCitAaXRlbSBhY2NlcHQtbGluZSAoTmV3bGluZSBvciBSZXR1cm4pCitAaWZzZXQgQmFzaEZlYXR1cmVzCitBY2NlcHQgdGhlIGxpbmUgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUgY3Vyc29yIGlzLgorSWYgdGhpcyBsaW5lIGlzCitub24tZW1wdHksIGFkZCBpdCB0byB0aGUgaGlzdG9yeSBsaXN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZyBvZgordGhlIEBlbnZ7SElTVENPTlRST0x9IGFuZCBAZW52e0hJU1RJR05PUkV9IHZhcmlhYmxlcy4KK0lmIHRoaXMgbGluZSBpcyBhIG1vZGlmaWVkIGhpc3RvcnkgbGluZSwgdGhlbiByZXN0b3JlIHRoZSBoaXN0b3J5IGxpbmUKK3RvIGl0cyBvcmlnaW5hbCBzdGF0ZS4KK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEJhc2hGZWF0dXJlcworQWNjZXB0IHRoZSBsaW5lIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhlIGN1cnNvciBpcy4KK0lmIHRoaXMgbGluZSBpcworbm9uLWVtcHR5LCBpdCBtYXkgYmUgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdCBmb3IgZnV0dXJlIHJlY2FsbCB3aXRoCitAY29kZXthZGRfaGlzdG9yeSgpfS4KK0lmIHRoaXMgbGluZSBpcyBhIG1vZGlmaWVkIGhpc3RvcnkgbGluZSwgdGhlIGhpc3RvcnkgbGluZSBpcyByZXN0b3JlZAordG8gaXRzIG9yaWdpbmFsIHN0YXRlLgorQGVuZCBpZmNsZWFyCisKK0BpdGVtIHByZXZpb3VzLWhpc3RvcnkgKEMtcCkKK01vdmUgYGJhY2snIHRocm91Z2ggdGhlIGhpc3RvcnkgbGlzdCwgZmV0Y2hpbmcgdGhlIHByZXZpb3VzIGNvbW1hbmQuCisKK0BpdGVtIG5leHQtaGlzdG9yeSAoQy1uKQorTW92ZSBgZm9yd2FyZCcgdGhyb3VnaCB0aGUgaGlzdG9yeSBsaXN0LCBmZXRjaGluZyB0aGUgbmV4dCBjb21tYW5kLgorCitAaXRlbSBiZWdpbm5pbmctb2YtaGlzdG9yeSAoTS08KQorTW92ZSB0byB0aGUgZmlyc3QgbGluZSBpbiB0aGUgaGlzdG9yeS4KKworQGl0ZW0gZW5kLW9mLWhpc3RvcnkgKE0tPikKK01vdmUgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgaGlzdG9yeSwgaS5lLiwgdGhlIGxpbmUgY3VycmVudGx5CitiZWluZyBlbnRlcmVkLgorCitAaXRlbSByZXZlcnNlLXNlYXJjaC1oaXN0b3J5IChDLXIpCitTZWFyY2ggYmFja3dhcmQgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgbGluZSBhbmQgbW92aW5nIGB1cCcgdGhyb3VnaAordGhlIGhpc3RvcnkgYXMgbmVjZXNzYXJ5LiAgVGhpcyBpcyBhbiBpbmNyZW1lbnRhbCBzZWFyY2guCisKK0BpdGVtIGZvcndhcmQtc2VhcmNoLWhpc3RvcnkgKEMtcykKK1NlYXJjaCBmb3J3YXJkIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGxpbmUgYW5kIG1vdmluZyBgZG93bicgdGhyb3VnaAordGhlIHRoZSBoaXN0b3J5IGFzIG5lY2Vzc2FyeS4gIFRoaXMgaXMgYW4gaW5jcmVtZW50YWwgc2VhcmNoLgorCitAaXRlbSBub24taW5jcmVtZW50YWwtcmV2ZXJzZS1zZWFyY2gtaGlzdG9yeSAoTS1wKQorU2VhcmNoIGJhY2t3YXJkIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGxpbmUgYW5kIG1vdmluZyBgdXAnCit0aHJvdWdoIHRoZSBoaXN0b3J5IGFzIG5lY2Vzc2FyeSB1c2luZyBhIG5vbi1pbmNyZW1lbnRhbCBzZWFyY2gKK2ZvciBhIHN0cmluZyBzdXBwbGllZCBieSB0aGUgdXNlci4KKworQGl0ZW0gbm9uLWluY3JlbWVudGFsLWZvcndhcmQtc2VhcmNoLWhpc3RvcnkgKE0tbikKK1NlYXJjaCBmb3J3YXJkIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGxpbmUgYW5kIG1vdmluZyBgZG93bicKK3Rocm91Z2ggdGhlIHRoZSBoaXN0b3J5IGFzIG5lY2Vzc2FyeSB1c2luZyBhIG5vbi1pbmNyZW1lbnRhbCBzZWFyY2gKK2ZvciBhIHN0cmluZyBzdXBwbGllZCBieSB0aGUgdXNlci4KKworQGl0ZW0gaGlzdG9yeS1zZWFyY2gtZm9yd2FyZCAoKQorU2VhcmNoIGZvcndhcmQgdGhyb3VnaCB0aGUgaGlzdG9yeSBmb3IgdGhlIHN0cmluZyBvZiBjaGFyYWN0ZXJzCitiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBsaW5lIGFuZCB0aGUgcG9pbnQuCitUaGlzIGlzIGEgbm9uLWluY3JlbWVudGFsIHNlYXJjaC4KK0J5IGRlZmF1bHQsIHRoaXMgY29tbWFuZCBpcyB1bmJvdW5kLgorCitAaXRlbSBoaXN0b3J5LXNlYXJjaC1iYWNrd2FyZCAoKQorU2VhcmNoIGJhY2t3YXJkIHRocm91Z2ggdGhlIGhpc3RvcnkgZm9yIHRoZSBzdHJpbmcgb2YgY2hhcmFjdGVycworYmV0d2VlbiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgbGluZSBhbmQgdGhlIHBvaW50LiAgVGhpcworaXMgYSBub24taW5jcmVtZW50YWwgc2VhcmNoLiAgQnkgZGVmYXVsdCwgdGhpcyBjb21tYW5kIGlzIHVuYm91bmQuCisKK0BpdGVtIHlhbmstbnRoLWFyZyAoTS1DLXkpCitJbnNlcnQgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBwcmV2aW91cyBjb21tYW5kICh1c3VhbGx5Cit0aGUgc2Vjb25kIHdvcmQgb24gdGhlIHByZXZpb3VzIGxpbmUpIGF0IHBvaW50LgorV2l0aCBhbiBhcmd1bWVudCBAdmFye259LAoraW5zZXJ0IHRoZSBAdmFye259dGggd29yZCBmcm9tIHRoZSBwcmV2aW91cyBjb21tYW5kICh0aGUgd29yZHMKK2luIHRoZSBwcmV2aW91cyBjb21tYW5kIGJlZ2luIHdpdGggd29yZCAwKS4gIEEgbmVnYXRpdmUgYXJndW1lbnQKK2luc2VydHMgdGhlIEB2YXJ7bn10aCB3b3JkIGZyb20gdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgY29tbWFuZC4KK09uY2UgdGhlIGFyZ3VtZW50IEB2YXJ7bn0gaXMgY29tcHV0ZWQsIHRoZSBhcmd1bWVudCBpcyBleHRyYWN0ZWQKK2FzIGlmIHRoZSBAc2FtcHshQHZhcntufX0gaGlzdG9yeSBleHBhbnNpb24gaGFkIGJlZW4gc3BlY2lmaWVkLgorCitAaXRlbSB5YW5rLWxhc3QtYXJnIChNLS4gb3IgTS1fKQorSW5zZXJ0IGxhc3QgYXJndW1lbnQgdG8gdGhlIHByZXZpb3VzIGNvbW1hbmQgKHRoZSBsYXN0IHdvcmQgb2YgdGhlCitwcmV2aW91cyBoaXN0b3J5IGVudHJ5KS4gIFdpdGggYW4KK2FyZ3VtZW50LCBiZWhhdmUgZXhhY3RseSBsaWtlIEBjb2Rle3lhbmstbnRoLWFyZ30uCitTdWNjZXNzaXZlIGNhbGxzIHRvIEBjb2Rle3lhbmstbGFzdC1hcmd9IG1vdmUgYmFjayB0aHJvdWdoIHRoZSBoaXN0b3J5CitsaXN0LCBpbnNlcnRpbmcgdGhlIGxhc3QgYXJndW1lbnQgb2YgZWFjaCBsaW5lIGluIHR1cm4uCitUaGUgaGlzdG9yeSBleHBhbnNpb24gZmFjaWxpdGllcyBhcmUgdXNlZCB0byBleHRyYWN0IHRoZSBsYXN0IGFyZ3VtZW50LAorYXMgaWYgdGhlIEBzYW1weyEkfSBoaXN0b3J5IGV4cGFuc2lvbiBoYWQgYmVlbiBzcGVjaWZpZWQuCisKK0BlbmQgZnRhYmxlCisKK0Bub2RlIENvbW1hbmRzIEZvciBUZXh0CitAc3Vic2VjdGlvbiBDb21tYW5kcyBGb3IgQ2hhbmdpbmcgVGV4dAorCitAZnRhYmxlIEBjb2RlCitAaXRlbSBkZWxldGUtY2hhciAoQy1kKQorRGVsZXRlIHRoZSBjaGFyYWN0ZXIgYXQgcG9pbnQuICBJZiBwb2ludCBpcyBhdCB0aGUKK2JlZ2lubmluZyBvZiB0aGUgbGluZSwgdGhlcmUgYXJlIG5vIGNoYXJhY3RlcnMgaW4gdGhlIGxpbmUsIGFuZAordGhlIGxhc3QgY2hhcmFjdGVyIHR5cGVkIHdhcyBub3QgYm91bmQgdG8gQGNvZGV7ZGVsZXRlLWNoYXJ9LCB0aGVuCityZXR1cm4gQHNje2VvZn0uCisKK0BpdGVtIGJhY2t3YXJkLWRlbGV0ZS1jaGFyIChSdWJvdXQpCitEZWxldGUgdGhlIGNoYXJhY3RlciBiZWhpbmQgdGhlIGN1cnNvci4gIEEgbnVtZXJpYyBhcmd1bWVudCBtZWFucwordG8ga2lsbCB0aGUgY2hhcmFjdGVycyBpbnN0ZWFkIG9mIGRlbGV0aW5nIHRoZW0uCisKK0BpdGVtIGZvcndhcmQtYmFja3dhcmQtZGVsZXRlLWNoYXIgKCkKK0RlbGV0ZSB0aGUgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJzb3IsIHVubGVzcyB0aGUgY3Vyc29yIGlzIGF0IHRoZQorZW5kIG9mIHRoZSBsaW5lLCBpbiB3aGljaCBjYXNlIHRoZSBjaGFyYWN0ZXIgYmVoaW5kIHRoZSBjdXJzb3IgaXMKK2RlbGV0ZWQuICBCeSBkZWZhdWx0LCB0aGlzIGlzIG5vdCBib3VuZCB0byBhIGtleS4KKworQGl0ZW0gcXVvdGVkLWluc2VydCAoQy1xIG9yIEMtdikKK0FkZCB0aGUgbmV4dCBjaGFyYWN0ZXIgdHlwZWQgdG8gdGhlIGxpbmUgdmVyYmF0aW0uICBUaGlzIGlzCitob3cgdG8gaW5zZXJ0IGtleSBzZXF1ZW5jZXMgbGlrZSBAa2Jke0MtcX0sIGZvciBleGFtcGxlLgorCitAaWZjbGVhciBCYXNoRmVhdHVyZXMKK0BpdGVtIHRhYi1pbnNlcnQgKE0tQGtleXtUQUJ9KQorSW5zZXJ0IGEgdGFiIGNoYXJhY3Rlci4KK0BlbmQgaWZjbGVhcgorCitAaXRlbSBzZWxmLWluc2VydCAoYSwgYiwgQSwgMSwgISwgQGRvdHN7fSkKK0luc2VydCB5b3Vyc2VsZi4KKworQGl0ZW0gdHJhbnNwb3NlLWNoYXJzIChDLXQpCitEcmFnIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBjdXJzb3IgZm9yd2FyZCBvdmVyCit0aGUgY2hhcmFjdGVyIGF0IHRoZSBjdXJzb3IsIG1vdmluZyB0aGUKK2N1cnNvciBmb3J3YXJkIGFzIHdlbGwuICBJZiB0aGUgaW5zZXJ0aW9uIHBvaW50CitpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLCB0aGVuIHRoaXMKK3RyYW5zcG9zZXMgdGhlIGxhc3QgdHdvIGNoYXJhY3RlcnMgb2YgdGhlIGxpbmUuCitOZWdhdGl2ZSBhcmd1bWVudHMgaGF2ZSBubyBlZmZlY3QuCisKK0BpdGVtIHRyYW5zcG9zZS13b3JkcyAoTS10KQorRHJhZyB0aGUgd29yZCBiZWZvcmUgcG9pbnQgcGFzdCB0aGUgd29yZCBhZnRlciBwb2ludCwKK21vdmluZyBwb2ludCBwYXN0IHRoYXQgd29yZCBhcyB3ZWxsLgorSWYgdGhlIGluc2VydGlvbiBwb2ludCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLCB0aGlzIHRyYW5zcG9zZXMKK3RoZSBsYXN0IHR3byB3b3JkcyBvbiB0aGUgbGluZS4KKworQGl0ZW0gdXBjYXNlLXdvcmQgKE0tdSkKK1VwcGVyY2FzZSB0aGUgY3VycmVudCAob3IgZm9sbG93aW5nKSB3b3JkLiAgV2l0aCBhIG5lZ2F0aXZlIGFyZ3VtZW50LAordXBwZXJjYXNlIHRoZSBwcmV2aW91cyB3b3JkLCBidXQgZG8gbm90IG1vdmUgdGhlIGN1cnNvci4KKworQGl0ZW0gZG93bmNhc2Utd29yZCAoTS1sKQorTG93ZXJjYXNlIHRoZSBjdXJyZW50IChvciBmb2xsb3dpbmcpIHdvcmQuICBXaXRoIGEgbmVnYXRpdmUgYXJndW1lbnQsCitsb3dlcmNhc2UgdGhlIHByZXZpb3VzIHdvcmQsIGJ1dCBkbyBub3QgbW92ZSB0aGUgY3Vyc29yLgorCitAaXRlbSBjYXBpdGFsaXplLXdvcmQgKE0tYykKK0NhcGl0YWxpemUgdGhlIGN1cnJlbnQgKG9yIGZvbGxvd2luZykgd29yZC4gIFdpdGggYSBuZWdhdGl2ZSBhcmd1bWVudCwKK2NhcGl0YWxpemUgdGhlIHByZXZpb3VzIHdvcmQsIGJ1dCBkbyBub3QgbW92ZSB0aGUgY3Vyc29yLgorCitAaXRlbSBvdmVyd3JpdGUtbW9kZSAoKQorVG9nZ2xlIG92ZXJ3cml0ZSBtb2RlLiAgV2l0aCBhbiBleHBsaWNpdCBwb3NpdGl2ZSBudW1lcmljIGFyZ3VtZW50LAorc3dpdGNoZXMgdG8gb3ZlcndyaXRlIG1vZGUuICBXaXRoIGFuIGV4cGxpY2l0IG5vbi1wb3NpdGl2ZSBudW1lcmljCithcmd1bWVudCwgc3dpdGNoZXMgdG8gaW5zZXJ0IG1vZGUuICBUaGlzIGNvbW1hbmQgYWZmZWN0cyBvbmx5CitAY29kZXtlbWFjc30gbW9kZTsgQGNvZGV7dml9IG1vZGUgZG9lcyBvdmVyd3JpdGUgZGlmZmVyZW50bHkuCitFYWNoIGNhbGwgdG8gQGNvZGV7cmVhZGxpbmUoKX0gc3RhcnRzIGluIGluc2VydCBtb2RlLgorCitJbiBvdmVyd3JpdGUgbW9kZSwgY2hhcmFjdGVycyBib3VuZCB0byBAY29kZXtzZWxmLWluc2VydH0gcmVwbGFjZQordGhlIHRleHQgYXQgcG9pbnQgcmF0aGVyIHRoYW4gcHVzaGluZyB0aGUgdGV4dCB0byB0aGUgcmlnaHQuCitDaGFyYWN0ZXJzIGJvdW5kIHRvIEBjb2Rle2JhY2t3YXJkLWRlbGV0ZS1jaGFyfSByZXBsYWNlIHRoZSBjaGFyYWN0ZXIKK2JlZm9yZSBwb2ludCB3aXRoIGEgc3BhY2UuCisKK0J5IGRlZmF1bHQsIHRoaXMgY29tbWFuZCBpcyB1bmJvdW5kLgorCitAZW5kIGZ0YWJsZQorCitAbm9kZSBDb21tYW5kcyBGb3IgS2lsbGluZworQHN1YnNlY3Rpb24gS2lsbGluZyBBbmQgWWFua2luZworCitAZnRhYmxlIEBjb2RlCisKK0BpdGVtIGtpbGwtbGluZSAoQy1rKQorS2lsbCB0aGUgdGV4dCBmcm9tIHBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisKK0BpdGVtIGJhY2t3YXJkLWtpbGwtbGluZSAoQy14IFJ1Ym91dCkKK0tpbGwgYmFja3dhcmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KKworQGl0ZW0gdW5peC1saW5lLWRpc2NhcmQgKEMtdSkKK0tpbGwgYmFja3dhcmQgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgbGluZS4KKworQGl0ZW0ga2lsbC13aG9sZS1saW5lICgpCitLaWxsIGFsbCBjaGFyYWN0ZXJzIG9uIHRoZSBjdXJyZW50IGxpbmUsIG5vIG1hdHRlciB3aGVyZSBwb2ludCBpcy4KK0J5IGRlZmF1bHQsIHRoaXMgaXMgdW5ib3VuZC4KKworQGl0ZW0ga2lsbC13b3JkIChNLWQpCitLaWxsIGZyb20gcG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCB3b3JkLCBvciBpZiBiZXR3ZWVuCit3b3JkcywgdG8gdGhlIGVuZCBvZiB0aGUgbmV4dCB3b3JkLgorV29yZCBib3VuZGFyaWVzIGFyZSB0aGUgc2FtZSBhcyBAY29kZXtmb3J3YXJkLXdvcmR9LgorCitAaXRlbSBiYWNrd2FyZC1raWxsLXdvcmQgKE0tQGtleXtERUx9KQorS2lsbCB0aGUgd29yZCBiZWhpbmQgcG9pbnQuCitXb3JkIGJvdW5kYXJpZXMgYXJlIHRoZSBzYW1lIGFzIEBjb2Rle2JhY2t3YXJkLXdvcmR9LgorCitAaXRlbSB1bml4LXdvcmQtcnVib3V0IChDLXcpCitLaWxsIHRoZSB3b3JkIGJlaGluZCBwb2ludCwgdXNpbmcgd2hpdGUgc3BhY2UgYXMgYSB3b3JkIGJvdW5kYXJ5LgorVGhlIGtpbGxlZCB0ZXh0IGlzIHNhdmVkIG9uIHRoZSBraWxsLXJpbmcuCisKK0BpdGVtIHVuaXgtZmlsZW5hbWUtcnVib3V0ICgpCitLaWxsIHRoZSB3b3JkIGJlaGluZCBwb2ludCwgdXNpbmcgd2hpdGUgc3BhY2UgYW5kIHRoZSBzbGFzaCBjaGFyYWN0ZXIKK2FzIHRoZSB3b3JkIGJvdW5kYXJpZXMuCitUaGUga2lsbGVkIHRleHQgaXMgc2F2ZWQgb24gdGhlIGtpbGwtcmluZy4KKworQGl0ZW0gZGVsZXRlLWhvcml6b250YWwtc3BhY2UgKCkKK0RlbGV0ZSBhbGwgc3BhY2VzIGFuZCB0YWJzIGFyb3VuZCBwb2ludC4gIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdW5ib3VuZC4KKworQGl0ZW0ga2lsbC1yZWdpb24gKCkKK0tpbGwgdGhlIHRleHQgaW4gdGhlIGN1cnJlbnQgcmVnaW9uLgorQnkgZGVmYXVsdCwgdGhpcyBjb21tYW5kIGlzIHVuYm91bmQuCisKK0BpdGVtIGNvcHktcmVnaW9uLWFzLWtpbGwgKCkKK0NvcHkgdGhlIHRleHQgaW4gdGhlIHJlZ2lvbiB0byB0aGUga2lsbCBidWZmZXIsIHNvIGl0IGNhbiBiZSB5YW5rZWQKK3JpZ2h0IGF3YXkuICBCeSBkZWZhdWx0LCB0aGlzIGNvbW1hbmQgaXMgdW5ib3VuZC4KKworQGl0ZW0gY29weS1iYWNrd2FyZC13b3JkICgpCitDb3B5IHRoZSB3b3JkIGJlZm9yZSBwb2ludCB0byB0aGUga2lsbCBidWZmZXIuCitUaGUgd29yZCBib3VuZGFyaWVzIGFyZSB0aGUgc2FtZSBhcyBAY29kZXtiYWNrd2FyZC13b3JkfS4KK0J5IGRlZmF1bHQsIHRoaXMgY29tbWFuZCBpcyB1bmJvdW5kLgorCitAaXRlbSBjb3B5LWZvcndhcmQtd29yZCAoKQorQ29weSB0aGUgd29yZCBmb2xsb3dpbmcgcG9pbnQgdG8gdGhlIGtpbGwgYnVmZmVyLgorVGhlIHdvcmQgYm91bmRhcmllcyBhcmUgdGhlIHNhbWUgYXMgQGNvZGV7Zm9yd2FyZC13b3JkfS4KK0J5IGRlZmF1bHQsIHRoaXMgY29tbWFuZCBpcyB1bmJvdW5kLgorCitAaXRlbSB5YW5rIChDLXkpCitZYW5rIHRoZSB0b3Agb2YgdGhlIGtpbGwgcmluZyBpbnRvIHRoZSBidWZmZXIgYXQgcG9pbnQuCisKK0BpdGVtIHlhbmstcG9wIChNLXkpCitSb3RhdGUgdGhlIGtpbGwtcmluZywgYW5kIHlhbmsgdGhlIG5ldyB0b3AuICBZb3UgY2FuIG9ubHkgZG8gdGhpcyBpZgordGhlIHByaW9yIGNvbW1hbmQgaXMgQGNvZGV7eWFua30gb3IgQGNvZGV7eWFuay1wb3B9LgorQGVuZCBmdGFibGUKKworQG5vZGUgTnVtZXJpYyBBcmd1bWVudHMKK0BzdWJzZWN0aW9uIFNwZWNpZnlpbmcgTnVtZXJpYyBBcmd1bWVudHMKK0BmdGFibGUgQGNvZGUKKworQGl0ZW0gZGlnaXQtYXJndW1lbnQgKEBrYmR7TS0wfSwgQGtiZHtNLTF9LCBAZG90c3t9IEBrYmR7TS0tfSkKK0FkZCB0aGlzIGRpZ2l0IHRvIHRoZSBhcmd1bWVudCBhbHJlYWR5IGFjY3VtdWxhdGluZywgb3Igc3RhcnQgYSBuZXcKK2FyZ3VtZW50LiAgQGtiZHtNLS19IHN0YXJ0cyBhIG5lZ2F0aXZlIGFyZ3VtZW50LgorCitAaXRlbSB1bml2ZXJzYWwtYXJndW1lbnQgKCkKK1RoaXMgaXMgYW5vdGhlciB3YXkgdG8gc3BlY2lmeSBhbiBhcmd1bWVudC4KK0lmIHRoaXMgY29tbWFuZCBpcyBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkaWdpdHMsIG9wdGlvbmFsbHkgd2l0aCBhCitsZWFkaW5nIG1pbnVzIHNpZ24sIHRob3NlIGRpZ2l0cyBkZWZpbmUgdGhlIGFyZ3VtZW50LgorSWYgdGhlIGNvbW1hbmQgaXMgZm9sbG93ZWQgYnkgZGlnaXRzLCBleGVjdXRpbmcgQGNvZGV7dW5pdmVyc2FsLWFyZ3VtZW50fQorYWdhaW4gZW5kcyB0aGUgbnVtZXJpYyBhcmd1bWVudCwgYnV0IGlzIG90aGVyd2lzZSBpZ25vcmVkLgorQXMgYSBzcGVjaWFsIGNhc2UsIGlmIHRoaXMgY29tbWFuZCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhCitjaGFyYWN0ZXIgdGhhdCBpcyBuZWl0aGVyIGEgZGlnaXQgb3IgbWludXMgc2lnbiwgdGhlIGFyZ3VtZW50IGNvdW50Citmb3IgdGhlIG5leHQgY29tbWFuZCBpcyBtdWx0aXBsaWVkIGJ5IGZvdXIuCitUaGUgYXJndW1lbnQgY291bnQgaXMgaW5pdGlhbGx5IG9uZSwgc28gZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24gdGhlCitmaXJzdCB0aW1lIG1ha2VzIHRoZSBhcmd1bWVudCBjb3VudCBmb3VyLCBhIHNlY29uZCB0aW1lIG1ha2VzIHRoZQorYXJndW1lbnQgY291bnQgc2l4dGVlbiwgYW5kIHNvIG9uLgorQnkgZGVmYXVsdCwgdGhpcyBpcyBub3QgYm91bmQgdG8gYSBrZXkuCitAZW5kIGZ0YWJsZQorCitAbm9kZSBDb21tYW5kcyBGb3IgQ29tcGxldGlvbgorQHN1YnNlY3Rpb24gTGV0dGluZyBSZWFkbGluZSBUeXBlIEZvciBZb3UKKworQGZ0YWJsZSBAY29kZQorQGl0ZW0gY29tcGxldGUgKEBrZXl7VEFCfSkKK0F0dGVtcHQgdG8gcGVyZm9ybSBjb21wbGV0aW9uIG9uIHRoZSB0ZXh0IGJlZm9yZSBwb2ludC4KK1RoZSBhY3R1YWwgY29tcGxldGlvbiBwZXJmb3JtZWQgaXMgYXBwbGljYXRpb24tc3BlY2lmaWMuCitAaWZzZXQgQmFzaEZlYXR1cmVzCitCYXNoIGF0dGVtcHRzIGNvbXBsZXRpb24gdHJlYXRpbmcgdGhlIHRleHQgYXMgYSB2YXJpYWJsZSAoaWYgdGhlCit0ZXh0IGJlZ2lucyB3aXRoIEBzYW1weyR9KSwgdXNlcm5hbWUgKGlmIHRoZSB0ZXh0IGJlZ2lucyB3aXRoCitAc2FtcHt+fSksIGhvc3RuYW1lIChpZiB0aGUgdGV4dCBiZWdpbnMgd2l0aCBAc2FtcHtAQH0pLCBvcgorY29tbWFuZCAoaW5jbHVkaW5nIGFsaWFzZXMgYW5kIGZ1bmN0aW9ucykgaW4gdHVybi4gIElmIG5vbmUgCitvZiB0aGVzZSBwcm9kdWNlcyBhIG1hdGNoLCBmaWxlbmFtZSBjb21wbGV0aW9uIGlzIGF0dGVtcHRlZC4KK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEJhc2hGZWF0dXJlcworVGhlIGRlZmF1bHQgaXMgZmlsZW5hbWUgY29tcGxldGlvbi4KK0BlbmQgaWZjbGVhcgorCitAaXRlbSBwb3NzaWJsZS1jb21wbGV0aW9ucyAoTS0/KQorTGlzdCB0aGUgcG9zc2libGUgY29tcGxldGlvbnMgb2YgdGhlIHRleHQgYmVmb3JlIHBvaW50LgorCitAaXRlbSBpbnNlcnQtY29tcGxldGlvbnMgKE0tKikKK0luc2VydCBhbGwgY29tcGxldGlvbnMgb2YgdGhlIHRleHQgYmVmb3JlIHBvaW50IHRoYXQgd291bGQgaGF2ZQorYmVlbiBnZW5lcmF0ZWQgYnkgQGNvZGV7cG9zc2libGUtY29tcGxldGlvbnN9LgorCitAaXRlbSBtZW51LWNvbXBsZXRlICgpCitTaW1pbGFyIHRvIEBjb2Rle2NvbXBsZXRlfSwgYnV0IHJlcGxhY2VzIHRoZSB3b3JkIHRvIGJlIGNvbXBsZXRlZAord2l0aCBhIHNpbmdsZSBtYXRjaCBmcm9tIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgorUmVwZWF0ZWQgZXhlY3V0aW9uIG9mIEBjb2Rle21lbnUtY29tcGxldGV9IHN0ZXBzIHRocm91Z2ggdGhlIGxpc3QKK29mIHBvc3NpYmxlIGNvbXBsZXRpb25zLCBpbnNlcnRpbmcgZWFjaCBtYXRjaCBpbiB0dXJuLgorQXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBjb21wbGV0aW9ucywgdGhlIGJlbGwgaXMgcnVuZworKHN1YmplY3QgdG8gdGhlIHNldHRpbmcgb2YgQGNvZGV7YmVsbC1zdHlsZX0pCithbmQgdGhlIG9yaWdpbmFsIHRleHQgaXMgcmVzdG9yZWQuCitBbiBhcmd1bWVudCBvZiBAdmFye259IG1vdmVzIEB2YXJ7bn0gcG9zaXRpb25zIGZvcndhcmQgaW4gdGhlIGxpc3QKK29mIG1hdGNoZXM7IGEgbmVnYXRpdmUgYXJndW1lbnQgbWF5IGJlIHVzZWQgdG8gbW92ZSBiYWNrd2FyZAordGhyb3VnaCB0aGUgbGlzdC4KK1RoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCB0byBiZSBib3VuZCB0byBAa2V5e1RBQn0sIGJ1dCBpcyB1bmJvdW5kCitieSBkZWZhdWx0LgorCitAaXRlbSBkZWxldGUtY2hhci1vci1saXN0ICgpCitEZWxldGVzIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvciBpZiBub3QgYXQgdGhlIGJlZ2lubmluZyBvcgorZW5kIG9mIHRoZSBsaW5lIChsaWtlIEBjb2Rle2RlbGV0ZS1jaGFyfSkuCitJZiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLCBiZWhhdmVzIGlkZW50aWNhbGx5IHRvCitAY29kZXtwb3NzaWJsZS1jb21wbGV0aW9uc30uCitUaGlzIGNvbW1hbmQgaXMgdW5ib3VuZCBieSBkZWZhdWx0LgorCitAaWZzZXQgQmFzaEZlYXR1cmVzCitAaXRlbSBjb21wbGV0ZS1maWxlbmFtZSAoTS0vKQorQXR0ZW1wdCBmaWxlbmFtZSBjb21wbGV0aW9uIG9uIHRoZSB0ZXh0IGJlZm9yZSBwb2ludC4KKworQGl0ZW0gcG9zc2libGUtZmlsZW5hbWUtY29tcGxldGlvbnMgKEMteCAvKQorTGlzdCB0aGUgcG9zc2libGUgY29tcGxldGlvbnMgb2YgdGhlIHRleHQgYmVmb3JlIHBvaW50LAordHJlYXRpbmcgaXQgYXMgYSBmaWxlbmFtZS4KKworQGl0ZW0gY29tcGxldGUtdXNlcm5hbWUgKE0tfikKK0F0dGVtcHQgY29tcGxldGlvbiBvbiB0aGUgdGV4dCBiZWZvcmUgcG9pbnQsIHRyZWF0aW5nCitpdCBhcyBhIHVzZXJuYW1lLgorCitAaXRlbSBwb3NzaWJsZS11c2VybmFtZS1jb21wbGV0aW9ucyAoQy14IH4pCitMaXN0IHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucyBvZiB0aGUgdGV4dCBiZWZvcmUgcG9pbnQsCit0cmVhdGluZyBpdCBhcyBhIHVzZXJuYW1lLgorCitAaXRlbSBjb21wbGV0ZS12YXJpYWJsZSAoTS0kKQorQXR0ZW1wdCBjb21wbGV0aW9uIG9uIHRoZSB0ZXh0IGJlZm9yZSBwb2ludCwgdHJlYXRpbmcKK2l0IGFzIGEgc2hlbGwgdmFyaWFibGUuCisKK0BpdGVtIHBvc3NpYmxlLXZhcmlhYmxlLWNvbXBsZXRpb25zIChDLXggJCkKK0xpc3QgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zIG9mIHRoZSB0ZXh0IGJlZm9yZSBwb2ludCwKK3RyZWF0aW5nIGl0IGFzIGEgc2hlbGwgdmFyaWFibGUuCisKK0BpdGVtIGNvbXBsZXRlLWhvc3RuYW1lIChNLUBAKQorQXR0ZW1wdCBjb21wbGV0aW9uIG9uIHRoZSB0ZXh0IGJlZm9yZSBwb2ludCwgdHJlYXRpbmcKK2l0IGFzIGEgaG9zdG5hbWUuCisKK0BpdGVtIHBvc3NpYmxlLWhvc3RuYW1lLWNvbXBsZXRpb25zIChDLXggQEApCitMaXN0IHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucyBvZiB0aGUgdGV4dCBiZWZvcmUgcG9pbnQsCit0cmVhdGluZyBpdCBhcyBhIGhvc3RuYW1lLgorCitAaXRlbSBjb21wbGV0ZS1jb21tYW5kIChNLSEpCitBdHRlbXB0IGNvbXBsZXRpb24gb24gdGhlIHRleHQgYmVmb3JlIHBvaW50LCB0cmVhdGluZworaXQgYXMgYSBjb21tYW5kIG5hbWUuICBDb21tYW5kIGNvbXBsZXRpb24gYXR0ZW1wdHMgdG8KK21hdGNoIHRoZSB0ZXh0IGFnYWluc3QgYWxpYXNlcywgcmVzZXJ2ZWQgd29yZHMsIHNoZWxsCitmdW5jdGlvbnMsIHNoZWxsIGJ1aWx0aW5zLCBhbmQgZmluYWxseSBleGVjdXRhYmxlIGZpbGVuYW1lcywKK2luIHRoYXQgb3JkZXIuCisKK0BpdGVtIHBvc3NpYmxlLWNvbW1hbmQtY29tcGxldGlvbnMgKEMteCAhKQorTGlzdCB0aGUgcG9zc2libGUgY29tcGxldGlvbnMgb2YgdGhlIHRleHQgYmVmb3JlIHBvaW50LAordHJlYXRpbmcgaXQgYXMgYSBjb21tYW5kIG5hbWUuCisKK0BpdGVtIGR5bmFtaWMtY29tcGxldGUtaGlzdG9yeSAoTS1Aa2V5e1RBQn0pCitBdHRlbXB0IGNvbXBsZXRpb24gb24gdGhlIHRleHQgYmVmb3JlIHBvaW50LCBjb21wYXJpbmcKK3RoZSB0ZXh0IGFnYWluc3QgbGluZXMgZnJvbSB0aGUgaGlzdG9yeSBsaXN0IGZvciBwb3NzaWJsZQorY29tcGxldGlvbiBtYXRjaGVzLgorCitAaXRlbSBjb21wbGV0ZS1pbnRvLWJyYWNlcyAoTS1AeykKK1BlcmZvcm0gZmlsZW5hbWUgY29tcGxldGlvbiBhbmQgaW5zZXJ0IHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zCitlbmNsb3NlZCB3aXRoaW4gYnJhY2VzIHNvIHRoZSBsaXN0IGlzIGF2YWlsYWJsZSB0byB0aGUgc2hlbGwKKyhAcHhyZWZ7QnJhY2UgRXhwYW5zaW9ufSkuCisKK0BlbmQgaWZzZXQKK0BlbmQgZnRhYmxlCisKK0Bub2RlIEtleWJvYXJkIE1hY3JvcworQHN1YnNlY3Rpb24gS2V5Ym9hcmQgTWFjcm9zCitAZnRhYmxlIEBjb2RlCisKK0BpdGVtIHN0YXJ0LWtiZC1tYWNybyAoQy14ICgpCitCZWdpbiBzYXZpbmcgdGhlIGNoYXJhY3RlcnMgdHlwZWQgaW50byB0aGUgY3VycmVudCBrZXlib2FyZCBtYWNyby4KKworQGl0ZW0gZW5kLWtiZC1tYWNybyAoQy14ICkpCitTdG9wIHNhdmluZyB0aGUgY2hhcmFjdGVycyB0eXBlZCBpbnRvIHRoZSBjdXJyZW50IGtleWJvYXJkIG1hY3JvCithbmQgc2F2ZSB0aGUgZGVmaW5pdGlvbi4KKworQGl0ZW0gY2FsbC1sYXN0LWtiZC1tYWNybyAoQy14IGUpCitSZS1leGVjdXRlIHRoZSBsYXN0IGtleWJvYXJkIG1hY3JvIGRlZmluZWQsIGJ5IG1ha2luZyB0aGUgY2hhcmFjdGVycworaW4gdGhlIG1hY3JvIGFwcGVhciBhcyBpZiB0eXBlZCBhdCB0aGUga2V5Ym9hcmQuCisKK0BlbmQgZnRhYmxlCisKK0Bub2RlIE1pc2NlbGxhbmVvdXMgQ29tbWFuZHMKK0BzdWJzZWN0aW9uIFNvbWUgTWlzY2VsbGFuZW91cyBDb21tYW5kcworQGZ0YWJsZSBAY29kZQorCitAaXRlbSByZS1yZWFkLWluaXQtZmlsZSAoQy14IEMtcikKK1JlYWQgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBAdmFye2lucHV0cmN9IGZpbGUsIGFuZCBpbmNvcnBvcmF0ZQorYW55IGJpbmRpbmdzIG9yIHZhcmlhYmxlIGFzc2lnbm1lbnRzIGZvdW5kIHRoZXJlLgorCitAaXRlbSBhYm9ydCAoQy1nKQorQWJvcnQgdGhlIGN1cnJlbnQgZWRpdGluZyBjb21tYW5kIGFuZAorcmluZyB0aGUgdGVybWluYWwncyBiZWxsIChzdWJqZWN0IHRvIHRoZSBzZXR0aW5nIG9mCitAY29kZXtiZWxsLXN0eWxlfSkuCisKK0BpdGVtIGRvLXVwcGVyY2FzZS12ZXJzaW9uIChNLWEsIE0tYiwgTS1AdmFye3h9LCBAZG90c3t9KQorSWYgdGhlIG1ldGFmaWVkIGNoYXJhY3RlciBAdmFye3h9IGlzIGxvd2VyY2FzZSwgcnVuIHRoZSBjb21tYW5kCit0aGF0IGlzIGJvdW5kIHRvIHRoZSBjb3JyZXNwb25kaW5nIHVwcGVyY2FzZSBjaGFyYWN0ZXIuCisKK0BpdGVtIHByZWZpeC1tZXRhIChAa2V5e0VTQ30pCitNZXRhZnkgdGhlIG5leHQgY2hhcmFjdGVyIHR5cGVkLiAgVGhpcyBpcyBmb3Iga2V5Ym9hcmRzCit3aXRob3V0IGEgbWV0YSBrZXkuICBUeXBpbmcgQHNhbXB7QGtleXtFU0N9IGZ9IGlzIGVxdWl2YWxlbnQgdG8gdHlwaW5nCitAa2Jke00tZn0uCisKK0BpdGVtIHVuZG8gKEMtXyBvciBDLXggQy11KQorSW5jcmVtZW50YWwgdW5kbywgc2VwYXJhdGVseSByZW1lbWJlcmVkIGZvciBlYWNoIGxpbmUuCisKK0BpdGVtIHJldmVydC1saW5lIChNLXIpCitVbmRvIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBsaW5lLiAgVGhpcyBpcyBsaWtlIGV4ZWN1dGluZyB0aGUgQGNvZGV7dW5kb30KK2NvbW1hbmQgZW5vdWdoIHRpbWVzIHRvIGdldCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuCisKK0BpZnNldCBCYXNoRmVhdHVyZXMKK0BpdGVtIHRpbGRlLWV4cGFuZCAoTS0mKQorQGVuZCBpZnNldAorQGlmY2xlYXIgQmFzaEZlYXR1cmVzCitAaXRlbSB0aWxkZS1leHBhbmQgKE0tfikKK0BlbmQgaWZjbGVhcgorUGVyZm9ybSB0aWxkZSBleHBhbnNpb24gb24gdGhlIGN1cnJlbnQgd29yZC4KKworQGl0ZW0gc2V0LW1hcmsgKEMtQEApCitTZXQgdGhlIG1hcmsgdG8gdGhlIHBvaW50LiAgSWYgYQorbnVtZXJpYyBhcmd1bWVudCBpcyBzdXBwbGllZCwgdGhlIG1hcmsgaXMgc2V0IHRvIHRoYXQgcG9zaXRpb24uCisKK0BpdGVtIGV4Y2hhbmdlLXBvaW50LWFuZC1tYXJrIChDLXggQy14KQorU3dhcCB0aGUgcG9pbnQgd2l0aCB0aGUgbWFyay4gIFRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpcyBzZXQgdG8KK3RoZSBzYXZlZCBwb3NpdGlvbiwgYW5kIHRoZSBvbGQgY3Vyc29yIHBvc2l0aW9uIGlzIHNhdmVkIGFzIHRoZSBtYXJrLgorCitAaXRlbSBjaGFyYWN0ZXItc2VhcmNoIChDLV0pCitBIGNoYXJhY3RlciBpcyByZWFkIGFuZCBwb2ludCBpcyBtb3ZlZCB0byB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mIHRoYXQKK2NoYXJhY3Rlci4gIEEgbmVnYXRpdmUgY291bnQgc2VhcmNoZXMgZm9yIHByZXZpb3VzIG9jY3VycmVuY2VzLgorCitAaXRlbSBjaGFyYWN0ZXItc2VhcmNoLWJhY2t3YXJkIChNLUMtXSkKK0EgY2hhcmFjdGVyIGlzIHJlYWQgYW5kIHBvaW50IGlzIG1vdmVkIHRvIHRoZSBwcmV2aW91cyBvY2N1cnJlbmNlCitvZiB0aGF0IGNoYXJhY3Rlci4gIEEgbmVnYXRpdmUgY291bnQgc2VhcmNoZXMgZm9yIHN1YnNlcXVlbnQKK29jY3VycmVuY2VzLgorCitAaXRlbSBpbnNlcnQtY29tbWVudCAoTS0jKQorV2l0aG91dCBhIG51bWVyaWMgYXJndW1lbnQsIHRoZSB2YWx1ZSBvZiB0aGUgQGNvZGV7Y29tbWVudC1iZWdpbn0KK3ZhcmlhYmxlIGlzIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgbGluZS4KK0lmIGEgbnVtZXJpYyBhcmd1bWVudCBpcyBzdXBwbGllZCwgdGhpcyBjb21tYW5kIGFjdHMgYXMgYSB0b2dnbGU6ICBpZgordGhlIGNoYXJhY3RlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBkbyBub3QgbWF0Y2ggdGhlIHZhbHVlCitvZiBAY29kZXtjb21tZW50LWJlZ2lufSwgdGhlIHZhbHVlIGlzIGluc2VydGVkLCBvdGhlcndpc2UKK3RoZSBjaGFyYWN0ZXJzIGluIEBjb2Rle2NvbW1lbnQtYmVnaW59IGFyZSBkZWxldGVkIGZyb20gdGhlIGJlZ2lubmluZyBvZgordGhlIGxpbmUuCitJbiBlaXRoZXIgY2FzZSwgdGhlIGxpbmUgaXMgYWNjZXB0ZWQgYXMgaWYgYSBuZXdsaW5lIGhhZCBiZWVuIHR5cGVkLgorQGlmc2V0IEJhc2hGZWF0dXJlcworVGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7Y29tbWVudC1iZWdpbn0gY2F1c2VzIHRoaXMgY29tbWFuZAordG8gbWFrZSB0aGUgY3VycmVudCBsaW5lIGEgc2hlbGwgY29tbWVudC4KK0lmIGEgbnVtZXJpYyBhcmd1bWVudCBjYXVzZXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIHRvIGJlIHJlbW92ZWQsIHRoZSBsaW5lCit3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBzaGVsbC4KK0BlbmQgaWZzZXQKKworQGl0ZW0gZHVtcC1mdW5jdGlvbnMgKCkKK1ByaW50IGFsbCBvZiB0aGUgZnVuY3Rpb25zIGFuZCB0aGVpciBrZXkgYmluZGluZ3MgdG8gdGhlCitSZWFkbGluZSBvdXRwdXQgc3RyZWFtLiAgSWYgYSBudW1lcmljIGFyZ3VtZW50IGlzIHN1cHBsaWVkLAordGhlIG91dHB1dCBpcyBmb3JtYXR0ZWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSBtYWRlIHBhcnQKK29mIGFuIEB2YXJ7aW5wdXRyY30gZmlsZS4gIFRoaXMgY29tbWFuZCBpcyB1bmJvdW5kIGJ5IGRlZmF1bHQuCisKK0BpdGVtIGR1bXAtdmFyaWFibGVzICgpCitQcmludCBhbGwgb2YgdGhlIHNldHRhYmxlIHZhcmlhYmxlcyBhbmQgdGhlaXIgdmFsdWVzIHRvIHRoZQorUmVhZGxpbmUgb3V0cHV0IHN0cmVhbS4gIElmIGEgbnVtZXJpYyBhcmd1bWVudCBpcyBzdXBwbGllZCwKK3RoZSBvdXRwdXQgaXMgZm9ybWF0dGVkIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4gYmUgbWFkZSBwYXJ0CitvZiBhbiBAdmFye2lucHV0cmN9IGZpbGUuICBUaGlzIGNvbW1hbmQgaXMgdW5ib3VuZCBieSBkZWZhdWx0LgorCitAaXRlbSBkdW1wLW1hY3JvcyAoKQorUHJpbnQgYWxsIG9mIHRoZSBSZWFkbGluZSBrZXkgc2VxdWVuY2VzIGJvdW5kIHRvIG1hY3JvcyBhbmQgdGhlCitzdHJpbmdzIHRoZXkgb3V0cHV0LiAgSWYgYSBudW1lcmljIGFyZ3VtZW50IGlzIHN1cHBsaWVkLAordGhlIG91dHB1dCBpcyBmb3JtYXR0ZWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSBtYWRlIHBhcnQKK29mIGFuIEB2YXJ7aW5wdXRyY30gZmlsZS4gIFRoaXMgY29tbWFuZCBpcyB1bmJvdW5kIGJ5IGRlZmF1bHQuCisKK0BpZnNldCBCYXNoRmVhdHVyZXMKK0BpdGVtIGdsb2ItY29tcGxldGUtd29yZCAoTS1nKQorVGhlIHdvcmQgYmVmb3JlIHBvaW50IGlzIHRyZWF0ZWQgYXMgYSBwYXR0ZXJuIGZvciBwYXRobmFtZSBleHBhbnNpb24sCit3aXRoIGFuIGFzdGVyaXNrIGltcGxpY2l0bHkgYXBwZW5kZWQuICBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0bworZ2VuZXJhdGUgYSBsaXN0IG9mIG1hdGNoaW5nIGZpbGUgbmFtZXMgZm9yIHBvc3NpYmxlIGNvbXBsZXRpb25zLgorCitAaXRlbSBnbG9iLWV4cGFuZC13b3JkIChDLXggKikKK1RoZSB3b3JkIGJlZm9yZSBwb2ludCBpcyB0cmVhdGVkIGFzIGEgcGF0dGVybiBmb3IgcGF0aG5hbWUgZXhwYW5zaW9uLAorYW5kIHRoZSBsaXN0IG9mIG1hdGNoaW5nIGZpbGUgbmFtZXMgaXMgaW5zZXJ0ZWQsIHJlcGxhY2luZyB0aGUgd29yZC4KK0lmIGEgbnVtZXJpYyBhcmd1bWVudCBpcyBzdXBwbGllZCwgYSBAc2FtcHsqfSBpcyBhcHBlbmRlZCBiZWZvcmUKK3BhdGhuYW1lIGV4cGFuc2lvbi4KKworQGl0ZW0gZ2xvYi1saXN0LWV4cGFuc2lvbnMgKEMteCBnKQorVGhlIGxpc3Qgb2YgZXhwYW5zaW9ucyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkKK0Bjb2Rle2dsb2ItZXhwYW5kLXdvcmR9IGlzIGRpc3BsYXllZCwgYW5kIHRoZSBsaW5lIGlzIHJlZHJhd24uCitJZiBhIG51bWVyaWMgYXJndW1lbnQgaXMgc3VwcGxpZWQsIGEgQHNhbXB7Kn0gaXMgYXBwZW5kZWQgYmVmb3JlCitwYXRobmFtZSBleHBhbnNpb24uCisKK0BpdGVtIGRpc3BsYXktc2hlbGwtdmVyc2lvbiAoQy14IEMtdikKK0Rpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiBCYXNoLgorCitAaXRlbSBzaGVsbC1leHBhbmQtbGluZSAoTS1DLWUpCitFeHBhbmQgdGhlIGxpbmUgYXMgdGhlIHNoZWxsIGRvZXMuCitUaGlzIHBlcmZvcm1zIGFsaWFzIGFuZCBoaXN0b3J5IGV4cGFuc2lvbiBhcyB3ZWxsIGFzIGFsbCBvZiB0aGUgc2hlbGwKK3dvcmQgZXhwYW5zaW9ucyAoQHB4cmVme1NoZWxsIEV4cGFuc2lvbnN9KS4KKworQGl0ZW0gaGlzdG9yeS1leHBhbmQtbGluZSAoTS1eKQorUGVyZm9ybSBoaXN0b3J5IGV4cGFuc2lvbiBvbiB0aGUgY3VycmVudCBsaW5lLgorCitAaXRlbSBtYWdpYy1zcGFjZSAoKQorUGVyZm9ybSBoaXN0b3J5IGV4cGFuc2lvbiBvbiB0aGUgY3VycmVudCBsaW5lIGFuZCBpbnNlcnQgYSBzcGFjZQorKEBweHJlZntIaXN0b3J5IEludGVyYWN0aW9ufSkuCisKK0BpdGVtIGFsaWFzLWV4cGFuZC1saW5lICgpCitQZXJmb3JtIGFsaWFzIGV4cGFuc2lvbiBvbiB0aGUgY3VycmVudCBsaW5lIChAcHhyZWZ7QWxpYXNlc30pLgorCitAaXRlbSBoaXN0b3J5LWFuZC1hbGlhcy1leHBhbmQtbGluZSAoKQorUGVyZm9ybSBoaXN0b3J5IGFuZCBhbGlhcyBleHBhbnNpb24gb24gdGhlIGN1cnJlbnQgbGluZS4KKworQGl0ZW0gaW5zZXJ0LWxhc3QtYXJndW1lbnQgKE0tLiBvciBNLV8pCitBIHN5bm9ueW0gZm9yIEBjb2Rle3lhbmstbGFzdC1hcmd9LgorCitAaXRlbSBvcGVyYXRlLWFuZC1nZXQtbmV4dCAoQy1vKQorQWNjZXB0IHRoZSBjdXJyZW50IGxpbmUgZm9yIGV4ZWN1dGlvbiBhbmQgZmV0Y2ggdGhlIG5leHQgbGluZQorcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbGluZSBmcm9tIHRoZSBoaXN0b3J5IGZvciBlZGl0aW5nLiAgQW55Cithcmd1bWVudCBpcyBpZ25vcmVkLgorCitAaXRlbSBlZGl0LWFuZC1leGVjdXRlLWNvbW1hbmQgKEMteEMtZSkKK0ludm9rZSBhbiBlZGl0b3Igb24gdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lLCBhbmQgZXhlY3V0ZSB0aGUgcmVzdWx0IGFzIHNoZWxsCitjb21tYW5kcy4KK0Jhc2ggYXR0ZW1wdHMgdG8gaW52b2tlCitAY29kZXskVklTVUFMfSwgQGNvZGV7JEVESVRPUn0sIGFuZCBAY29kZXtlbWFjc30KK2FzIHRoZSBlZGl0b3IsIGluIHRoYXQgb3JkZXIuCisKK0BlbmQgaWZzZXQKKworQGlmY2xlYXIgQmFzaEZlYXR1cmVzCitAaXRlbSBlbWFjcy1lZGl0aW5nLW1vZGUgKEMtZSkKK1doZW4gaW4gQGNvZGV7dml9IGNvbW1hbmQgbW9kZSwgdGhpcyBjYXVzZXMgYSBzd2l0Y2ggdG8gQGNvZGV7ZW1hY3N9CitlZGl0aW5nIG1vZGUuCisKK0BpdGVtIHZpLWVkaXRpbmctbW9kZSAoTS1DLWopCitXaGVuIGluIEBjb2Rle2VtYWNzfSBlZGl0aW5nIG1vZGUsIHRoaXMgY2F1c2VzIGEgc3dpdGNoIHRvIEBjb2Rle3ZpfQorZWRpdGluZyBtb2RlLgorCitAZW5kIGlmY2xlYXIKKworQGVuZCBmdGFibGUKKworQG5vZGUgUmVhZGxpbmUgdmkgTW9kZQorQHNlY3Rpb24gUmVhZGxpbmUgdmkgTW9kZQorCitXaGlsZSB0aGUgUmVhZGxpbmUgbGlicmFyeSBkb2VzIG5vdCBoYXZlIGEgZnVsbCBzZXQgb2YgQGNvZGV7dml9CitlZGl0aW5nIGZ1bmN0aW9ucywgaXQgZG9lcyBjb250YWluIGVub3VnaCB0byBhbGxvdyBzaW1wbGUgZWRpdGluZworb2YgdGhlIGxpbmUuICBUaGUgUmVhZGxpbmUgQGNvZGV7dml9IG1vZGUgYmVoYXZlcyBhcyBzcGVjaWZpZWQgaW4KK3RoZSBAc2N7cG9zaXh9IDEwMDMuMiBzdGFuZGFyZC4KKworQGlmc2V0IEJhc2hGZWF0dXJlcworSW4gb3JkZXIgdG8gc3dpdGNoIGludGVyYWN0aXZlbHkgYmV0d2VlbiBAY29kZXtlbWFjc30gYW5kIEBjb2Rle3ZpfQorZWRpdGluZyBtb2RlcywgdXNlIHRoZSBAc2FtcHtzZXQgLW8gZW1hY3N9IGFuZCBAc2FtcHtzZXQgLW8gdml9Citjb21tYW5kcyAoQHB4cmVme1RoZSBTZXQgQnVpbHRpbn0pLgorQGVuZCBpZnNldAorQGlmY2xlYXIgQmFzaEZlYXR1cmVzCitJbiBvcmRlciB0byBzd2l0Y2ggaW50ZXJhY3RpdmVseSBiZXR3ZWVuIEBjb2Rle2VtYWNzfSBhbmQgQGNvZGV7dml9CitlZGl0aW5nIG1vZGVzLCB1c2UgdGhlIGNvbW1hbmQgQGtiZHtNLUMtan0gKGJvdW5kIHRvIGVtYWNzLWVkaXRpbmctbW9kZQord2hlbiBpbiBAY29kZXt2aX0gbW9kZSBhbmQgdG8gdmktZWRpdGluZy1tb2RlIGluIEBjb2Rle2VtYWNzfSBtb2RlKS4KK0BlbmQgaWZjbGVhcgorVGhlIFJlYWRsaW5lIGRlZmF1bHQgaXMgQGNvZGV7ZW1hY3N9IG1vZGUuCisKK1doZW4geW91IGVudGVyIGEgbGluZSBpbiBAY29kZXt2aX0gbW9kZSwgeW91IGFyZSBhbHJlYWR5IHBsYWNlZCBpbgorYGluc2VydGlvbicgbW9kZSwgYXMgaWYgeW91IGhhZCB0eXBlZCBhbiBAc2FtcHtpfS4gIFByZXNzaW5nIEBrZXl7RVNDfQorc3dpdGNoZXMgeW91IGludG8gYGNvbW1hbmQnIG1vZGUsIHdoZXJlIHlvdSBjYW4gZWRpdCB0aGUgdGV4dCBvZiB0aGUKK2xpbmUgd2l0aCB0aGUgc3RhbmRhcmQgQGNvZGV7dml9IG1vdmVtZW50IGtleXMsIG1vdmUgdG8gcHJldmlvdXMKK2hpc3RvcnkgbGluZXMgd2l0aCBAc2FtcHtrfSBhbmQgc3Vic2VxdWVudCBsaW5lcyB3aXRoIEBzYW1we2p9LCBhbmQKK3NvIGZvcnRoLgorCitAaWZzZXQgQmFzaEZlYXR1cmVzCitAbm9kZSBQcm9ncmFtbWFibGUgQ29tcGxldGlvbgorQHNlY3Rpb24gUHJvZ3JhbW1hYmxlIENvbXBsZXRpb24KK0BjaW5kZXggcHJvZ3JhbW1hYmxlIGNvbXBsZXRpb24KKworV2hlbiB3b3JkIGNvbXBsZXRpb24gaXMgYXR0ZW1wdGVkIGZvciBhbiBhcmd1bWVudCB0byBhIGNvbW1hbmQgZm9yCit3aGljaCBhIGNvbXBsZXRpb24gc3BlY2lmaWNhdGlvbiAoYSBAdmFye2NvbXBzcGVjfSkgaGFzIGJlZW4gZGVmaW5lZAordXNpbmcgdGhlIEBjb2Rle2NvbXBsZXRlfSBidWlsdGluIChAcHhyZWZ7UHJvZ3JhbW1hYmxlIENvbXBsZXRpb24gQnVpbHRpbnN9KSwKK3RoZSBwcm9ncmFtbWFibGUgY29tcGxldGlvbiBmYWNpbGl0aWVzIGFyZSBpbnZva2VkLiAKKworRmlyc3QsIHRoZSBjb21tYW5kIG5hbWUgaXMgaWRlbnRpZmllZC4KK0lmIGEgY29tcHNwZWMgaGFzIGJlZW4gZGVmaW5lZCBmb3IgdGhhdCBjb21tYW5kLCB0aGUKK2NvbXBzcGVjIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGxpc3Qgb2YgcG9zc2libGUgY29tcGxldGlvbnMgZm9yIHRoZSB3b3JkLgorSWYgdGhlIGNvbW1hbmQgd29yZCBpcyBhIGZ1bGwgcGF0aG5hbWUsIGEgY29tcHNwZWMgZm9yIHRoZSBmdWxsCitwYXRobmFtZSBpcyBzZWFyY2hlZCBmb3IgZmlyc3QuCitJZiBubyBjb21wc3BlYyBpcyBmb3VuZCBmb3IgdGhlIGZ1bGwgcGF0aG5hbWUsIGFuIGF0dGVtcHQgaXMgbWFkZSB0bworZmluZCBhIGNvbXBzcGVjIGZvciB0aGUgcG9ydGlvbiBmb2xsb3dpbmcgdGhlIGZpbmFsIHNsYXNoLgorCitPbmNlIGEgY29tcHNwZWMgaGFzIGJlZW4gZm91bmQsIGl0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGxpc3Qgb2YKK21hdGNoaW5nIHdvcmRzLgorSWYgYSBjb21wc3BlYyBpcyBub3QgZm91bmQsIHRoZSBkZWZhdWx0IEJhc2ggY29tcGxldGlvbgorZGVzY3JpYmVkIGFib3ZlIChAcHhyZWZ7Q29tbWFuZHMgRm9yIENvbXBsZXRpb259KSBpcyBwZXJmb3JtZWQuCisKK0ZpcnN0LCB0aGUgYWN0aW9ucyBzcGVjaWZpZWQgYnkgdGhlIGNvbXBzcGVjIGFyZSB1c2VkLgorT25seSBtYXRjaGVzIHdoaWNoIGFyZSBwcmVmaXhlZCBieSB0aGUgd29yZCBiZWluZyBjb21wbGV0ZWQgYXJlCityZXR1cm5lZC4KK1doZW4gdGhlIEBvcHRpb257LWZ9IG9yIEBvcHRpb257LWR9IG9wdGlvbiBpcyB1c2VkIGZvciBmaWxlbmFtZSBvcgorZGlyZWN0b3J5IG5hbWUgY29tcGxldGlvbiwgdGhlIHNoZWxsIHZhcmlhYmxlIEBlbnZ7RklHTk9SRX0gaXMKK3VzZWQgdG8gZmlsdGVyIHRoZSBtYXRjaGVzLgorQHhyZWZ7QmFzaCBWYXJpYWJsZXN9LCBmb3IgYSBkZXNjcmlwdGlvbiBvZiBAZW52e0ZJR05PUkV9LgorCitBbnkgY29tcGxldGlvbnMgc3BlY2lmaWVkIGJ5IGEgZmlsZW5hbWUgZXhwYW5zaW9uIHBhdHRlcm4gdG8gdGhlCitAb3B0aW9uey1HfSBvcHRpb24gYXJlIGdlbmVyYXRlZCBuZXh0LgorVGhlIHdvcmRzIGdlbmVyYXRlZCBieSB0aGUgcGF0dGVybiBuZWVkIG5vdCBtYXRjaCB0aGUgd29yZCBiZWluZyBjb21wbGV0ZWQuCitUaGUgQGVudntHTE9CSUdOT1JFfSBzaGVsbCB2YXJpYWJsZSBpcyBub3QgdXNlZCB0byBmaWx0ZXIgdGhlIG1hdGNoZXMsCitidXQgdGhlIEBlbnZ7RklHTk9SRX0gc2hlbGwgdmFyaWFibGUgaXMgdXNlZC4KKworTmV4dCwgdGhlIHN0cmluZyBzcGVjaWZpZWQgYXMgdGhlIGFyZ3VtZW50IHRvIHRoZSBAb3B0aW9uey1XfSBvcHRpb24KK2lzIGNvbnNpZGVyZWQuCitUaGUgc3RyaW5nIGlzIGZpcnN0IHNwbGl0IHVzaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBAZW52e0lGU30KK3NwZWNpYWwgdmFyaWFibGUgYXMgZGVsaW1pdGVycy4KK1NoZWxsIHF1b3RpbmcgaXMgaG9ub3JlZC4KK0VhY2ggd29yZCBpcyB0aGVuIGV4cGFuZGVkIHVzaW5nCiticmFjZSBleHBhbnNpb24sIHRpbGRlIGV4cGFuc2lvbiwgcGFyYW1ldGVyIGFuZCB2YXJpYWJsZSBleHBhbnNpb24sCitjb21tYW5kIHN1YnN0aXR1dGlvbiwgYW5kIGFyaXRobWV0aWMgZXhwYW5zaW9uLAorYXMgZGVzY3JpYmVkIGFib3ZlIChAcHhyZWZ7U2hlbGwgRXhwYW5zaW9uc30pLgorVGhlIHJlc3VsdHMgYXJlIHNwbGl0IHVzaW5nIHRoZSBydWxlcyBkZXNjcmliZWQgYWJvdmUKKyhAcHhyZWZ7V29yZCBTcGxpdHRpbmd9KS4KK1RoZSByZXN1bHRzIG9mIHRoZSBleHBhbnNpb24gYXJlIHByZWZpeC1tYXRjaGVkIGFnYWluc3QgdGhlIHdvcmQgYmVpbmcKK2NvbXBsZXRlZCwgYW5kIHRoZSBtYXRjaGluZyB3b3JkcyBiZWNvbWUgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zLgorCitBZnRlciB0aGVzZSBtYXRjaGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQsIGFueSBzaGVsbCBmdW5jdGlvbiBvciBjb21tYW5kCitzcGVjaWZpZWQgd2l0aCB0aGUgQG9wdGlvbnstRn0gYW5kIEBvcHRpb257LUN9IG9wdGlvbnMgaXMgaW52b2tlZC4KK1doZW4gdGhlIGNvbW1hbmQgb3IgZnVuY3Rpb24gaXMgaW52b2tlZCwgdGhlIEBlbnZ7Q09NUF9MSU5FfSBhbmQKK0BlbnZ7Q09NUF9QT0lOVH0gdmFyaWFibGVzIGFyZSBhc3NpZ25lZCB2YWx1ZXMgYXMgZGVzY3JpYmVkIGFib3ZlCisoQHB4cmVme0Jhc2ggVmFyaWFibGVzfSkuCitJZiBhIHNoZWxsIGZ1bmN0aW9uIGlzIGJlaW5nIGludm9rZWQsIHRoZSBAZW52e0NPTVBfV09SRFN9IGFuZAorQGVudntDT01QX0NXT1JEfSB2YXJpYWJsZXMgYXJlIGFsc28gc2V0LgorV2hlbiB0aGUgZnVuY3Rpb24gb3IgY29tbWFuZCBpcyBpbnZva2VkLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlCituYW1lIG9mIHRoZSBjb21tYW5kIHdob3NlIGFyZ3VtZW50cyBhcmUgYmVpbmcgY29tcGxldGVkLCB0aGUKK3NlY29uZCBhcmd1bWVudCBpcyB0aGUgd29yZCBiZWluZyBjb21wbGV0ZWQsIGFuZCB0aGUgdGhpcmQgYXJndW1lbnQKK2lzIHRoZSB3b3JkIHByZWNlZGluZyB0aGUgd29yZCBiZWluZyBjb21wbGV0ZWQgb24gdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lLgorTm8gZmlsdGVyaW5nIG9mIHRoZSBnZW5lcmF0ZWQgY29tcGxldGlvbnMgYWdhaW5zdCB0aGUgd29yZCBiZWluZyBjb21wbGV0ZWQKK2lzIHBlcmZvcm1lZDsgdGhlIGZ1bmN0aW9uIG9yIGNvbW1hbmQgaGFzIGNvbXBsZXRlIGZyZWVkb20gaW4gZ2VuZXJhdGluZwordGhlIG1hdGNoZXMuCisKK0FueSBmdW5jdGlvbiBzcGVjaWZpZWQgd2l0aCBAb3B0aW9uey1GfSBpcyBpbnZva2VkIGZpcnN0LgorVGhlIGZ1bmN0aW9uIG1heSB1c2UgYW55IG9mIHRoZSBzaGVsbCBmYWNpbGl0aWVzLCBpbmNsdWRpbmcgdGhlCitAY29kZXtjb21wZ2VufSBidWlsdGluIGRlc2NyaWJlZCBiZWxvdworKEBweHJlZntQcm9ncmFtbWFibGUgQ29tcGxldGlvbiBCdWlsdGluc30pLCB0byBnZW5lcmF0ZSB0aGUgbWF0Y2hlcy4KK0l0IG11c3QgcHV0IHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucyBpbiB0aGUgQGVudntDT01QUkVQTFl9IGFycmF5Cit2YXJpYWJsZS4KKworTmV4dCwgYW55IGNvbW1hbmQgc3BlY2lmaWVkIHdpdGggdGhlIEBvcHRpb257LUN9IG9wdGlvbiBpcyBpbnZva2VkCitpbiBhbiBlbnZpcm9ubWVudCBlcXVpdmFsZW50IHRvIGNvbW1hbmQgc3Vic3RpdHV0aW9uLgorSXQgc2hvdWxkIHByaW50IGEgbGlzdCBvZiBjb21wbGV0aW9ucywgb25lIHBlciBsaW5lLCB0bwordGhlIHN0YW5kYXJkIG91dHB1dC4KK0JhY2tzbGFzaCBtYXkgYmUgdXNlZCB0byBlc2NhcGUgYSBuZXdsaW5lLCBpZiBuZWNlc3NhcnkuCisKK0FmdGVyIGFsbCBvZiB0aGUgcG9zc2libGUgY29tcGxldGlvbnMgYXJlIGdlbmVyYXRlZCwgYW55IGZpbHRlcgorc3BlY2lmaWVkIHdpdGggdGhlIEBvcHRpb257LVh9IG9wdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSBsaXN0LgorVGhlIGZpbHRlciBpcyBhIHBhdHRlcm4gYXMgdXNlZCBmb3IgcGF0aG5hbWUgZXhwYW5zaW9uOyBhIEBzYW1weyZ9CitpbiB0aGUgcGF0dGVybiBpcyByZXBsYWNlZCB3aXRoIHRoZSB0ZXh0IG9mIHRoZSB3b3JkIGJlaW5nIGNvbXBsZXRlZC4KK0EgbGl0ZXJhbCBAc2FtcHsmfSBtYXkgYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoOyB0aGUgYmFja3NsYXNoCitpcyByZW1vdmVkIGJlZm9yZSBhdHRlbXB0aW5nIGEgbWF0Y2guCitBbnkgY29tcGxldGlvbiB0aGF0IG1hdGNoZXMgdGhlIHBhdHRlcm4gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuCitBIGxlYWRpbmcgQHNhbXB7IX0gbmVnYXRlcyB0aGUgcGF0dGVybjsgaW4gdGhpcyBjYXNlIGFueSBjb21wbGV0aW9uCitub3QgbWF0Y2hpbmcgdGhlIHBhdHRlcm4gd2lsbCBiZSByZW1vdmVkLgorCitGaW5hbGx5LCBhbnkgcHJlZml4IGFuZCBzdWZmaXggc3BlY2lmaWVkIHdpdGggdGhlIEBvcHRpb257LVB9IGFuZCBAb3B0aW9uey1TfQorb3B0aW9ucyBhcmUgYWRkZWQgdG8gZWFjaCBtZW1iZXIgb2YgdGhlIGNvbXBsZXRpb24gbGlzdCwgYW5kIHRoZSByZXN1bHQgaXMKK3JldHVybmVkIHRvIHRoZSBSZWFkbGluZSBjb21wbGV0aW9uIGNvZGUgYXMgdGhlIGxpc3Qgb2YgcG9zc2libGUKK2NvbXBsZXRpb25zLgorCitJZiB0aGUgcHJldmlvdXNseS1hcHBsaWVkIGFjdGlvbnMgZG8gbm90IGdlbmVyYXRlIGFueSBtYXRjaGVzLCBhbmQgdGhlCitAb3B0aW9uey1vIGRpcm5hbWVzfSBvcHRpb24gd2FzIHN1cHBsaWVkIHRvIEBjb2Rle2NvbXBsZXRlfSB3aGVuIHRoZQorY29tcHNwZWMgd2FzIGRlZmluZWQsIGRpcmVjdG9yeSBuYW1lIGNvbXBsZXRpb24gaXMgYXR0ZW1wdGVkLiAKKworSWYgdGhlIEBvcHRpb257LW8gcGx1c2RpcnN9IG9wdGlvbiB3YXMgc3VwcGxpZWQgdG8gQGNvZGV7Y29tcGxldGV9IHdoZW4KK3RoZSBjb21wc3BlYyB3YXMgZGVmaW5lZCwgZGlyZWN0b3J5IG5hbWUgY29tcGxldGlvbiBpcyBhdHRlbXB0ZWQgYW5kIGFueQorbWF0Y2hlcyBhcmUgYWRkZWQgdG8gdGhlIHJlc3VsdHMgb2YgdGhlIG90aGVyIGFjdGlvbnMuCisKK0J5IGRlZmF1bHQsIGlmIGEgY29tcHNwZWMgaXMgZm91bmQsIHdoYXRldmVyIGl0IGdlbmVyYXRlcyBpcyByZXR1cm5lZCB0bwordGhlIGNvbXBsZXRpb24gY29kZSBhcyB0aGUgZnVsbCBzZXQgb2YgcG9zc2libGUgY29tcGxldGlvbnMuCitUaGUgZGVmYXVsdCBCYXNoIGNvbXBsZXRpb25zIGFyZSBub3QgYXR0ZW1wdGVkLCBhbmQgdGhlIFJlYWRsaW5lIGRlZmF1bHQKK29mIGZpbGVuYW1lIGNvbXBsZXRpb24gaXMgZGlzYWJsZWQuCitJZiB0aGUgQG9wdGlvbnstbyBiYXNoZGVmYXVsdH0gb3B0aW9uIHdhcyBzdXBwbGllZCB0byBAY29kZXtjb21wbGV0ZX0gd2hlbgordGhlIGNvbXBzcGVjIHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBCYXNoIGNvbXBsZXRpb25zIGFyZSBhdHRlbXB0ZWQKK2lmIHRoZSBjb21wc3BlYyBnZW5lcmF0ZXMgbm8gbWF0Y2hlcy4KK0lmIHRoZSBAb3B0aW9uey1vIGRlZmF1bHR9IG9wdGlvbiB3YXMgc3VwcGxpZWQgdG8gQGNvZGV7Y29tcGxldGV9IHdoZW4gdGhlCitjb21wc3BlYyB3YXMgZGVmaW5lZCwgUmVhZGxpbmUncyBkZWZhdWx0IGNvbXBsZXRpb24gd2lsbCBiZSBwZXJmb3JtZWQKK2lmIHRoZSBjb21wc3BlYyAoYW5kLCBpZiBhdHRlbXB0ZWQsIHRoZSBkZWZhdWx0IEJhc2ggY29tcGxldGlvbnMpCitnZW5lcmF0ZSBubyBtYXRjaGVzLgorCitXaGVuIGEgY29tcHNwZWMgaW5kaWNhdGVzIHRoYXQgZGlyZWN0b3J5IG5hbWUgY29tcGxldGlvbiBpcyBkZXNpcmVkLAordGhlIHByb2dyYW1tYWJsZSBjb21wbGV0aW9uIGZ1bmN0aW9ucyBmb3JjZSBSZWFkbGluZSB0byBhcHBlbmQgYSBzbGFzaAordG8gY29tcGxldGVkIG5hbWVzIHdoaWNoIGFyZSBzeW1ib2xpYyBsaW5rcyB0byBkaXJlY3Rvcmllcywgc3ViamVjdCB0bwordGhlIHZhbHVlIG9mIHRoZSBAdmFye21hcmstZGlyZWN0b3JpZXN9IFJlYWRsaW5lIHZhcmlhYmxlLCByZWdhcmRsZXNzCitvZiB0aGUgc2V0dGluZyBvZiB0aGUgQHZhcnttYXJrLXN5bWxpbmtlZC1kaXJlY3Rvcmllc30gUmVhZGxpbmUgdmFyaWFibGUuCisKK0Bub2RlIFByb2dyYW1tYWJsZSBDb21wbGV0aW9uIEJ1aWx0aW5zCitAc2VjdGlvbiBQcm9ncmFtbWFibGUgQ29tcGxldGlvbiBCdWlsdGlucworQGNpbmRleCBjb21wbGV0aW9uIGJ1aWx0aW5zCisKK1R3byBidWlsdGluIGNvbW1hbmRzIGFyZSBhdmFpbGFibGUgdG8gbWFuaXB1bGF0ZSB0aGUgcHJvZ3JhbW1hYmxlIGNvbXBsZXRpb24KK2ZhY2lsaXRpZXMuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gY29tcGdlbgorQGJ0aW5kZXggY29tcGdlbgorQGV4YW1wbGUKK0Bjb2Rle2NvbXBnZW4gW0B2YXJ7b3B0aW9ufV0gW0B2YXJ7d29yZH1dfQorQGVuZCBleGFtcGxlCisKK0dlbmVyYXRlIHBvc3NpYmxlIGNvbXBsZXRpb24gbWF0Y2hlcyBmb3IgQHZhcnt3b3JkfSBhY2NvcmRpbmcgdG8KK3RoZSBAdmFye29wdGlvbn1zLCB3aGljaCBtYXkgYmUgYW55IG9wdGlvbiBhY2NlcHRlZCBieSB0aGUKK0Bjb2Rle2NvbXBsZXRlfQorYnVpbHRpbiB3aXRoIHRoZSBleGNlcHRpb24gb2YgQG9wdGlvbnstcH0gYW5kIEBvcHRpb257LXJ9LCBhbmQgd3JpdGUKK3RoZSBtYXRjaGVzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCitXaGVuIHVzaW5nIHRoZSBAb3B0aW9uey1GfSBvciBAb3B0aW9uey1DfSBvcHRpb25zLCB0aGUgdmFyaW91cyBzaGVsbCB2YXJpYWJsZXMKK3NldCBieSB0aGUgcHJvZ3JhbW1hYmxlIGNvbXBsZXRpb24gZmFjaWxpdGllcywgd2hpbGUgYXZhaWxhYmxlLCB3aWxsIG5vdAoraGF2ZSB1c2VmdWwgdmFsdWVzLgorCitUaGUgbWF0Y2hlcyB3aWxsIGJlIGdlbmVyYXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgaWYgdGhlIHByb2dyYW1tYWJsZQorY29tcGxldGlvbiBjb2RlIGhhZCBnZW5lcmF0ZWQgdGhlbSBkaXJlY3RseSBmcm9tIGEgY29tcGxldGlvbiBzcGVjaWZpY2F0aW9uCit3aXRoIHRoZSBzYW1lIGZsYWdzLgorSWYgQHZhcnt3b3JkfSBpcyBzcGVjaWZpZWQsIG9ubHkgdGhvc2UgY29tcGxldGlvbnMgbWF0Y2hpbmcgQHZhcnt3b3JkfQord2lsbCBiZSBkaXNwbGF5ZWQuCisKK1RoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSB1bmxlc3MgYW4gaW52YWxpZCBvcHRpb24gaXMgc3VwcGxpZWQsIG9yIG5vCittYXRjaGVzIHdlcmUgZ2VuZXJhdGVkLgorCitAaXRlbSBjb21wbGV0ZQorQGJ0aW5kZXggY29tcGxldGUKK0BleGFtcGxlCitAY29kZXtjb21wbGV0ZSBbLWFiY2RlZmdqa3N1dl0gWy1vIEB2YXJ7Y29tcC1vcHRpb259XSBbLUEgQHZhcnthY3Rpb259XSBbLUcgQHZhcntnbG9icGF0fV0gWy1XIEB2YXJ7d29yZGxpc3R9XQorWy1QIEB2YXJ7cHJlZml4fV0gWy1TIEB2YXJ7c3VmZml4fV0gWy1YIEB2YXJ7ZmlsdGVycGF0fV0gWy1GIEB2YXJ7ZnVuY3Rpb259XQorWy1DIEB2YXJ7Y29tbWFuZH1dIEB2YXJ7bmFtZX0gW0B2YXJ7bmFtZX0gQGRvdHN7fV19CitAY29kZXtjb21wbGV0ZSAtcHIgW0B2YXJ7bmFtZX0gQGRvdHN7fV19CitAZW5kIGV4YW1wbGUKKworU3BlY2lmeSBob3cgYXJndW1lbnRzIHRvIGVhY2ggQHZhcntuYW1lfSBzaG91bGQgYmUgY29tcGxldGVkLgorSWYgdGhlIEBvcHRpb257LXB9IG9wdGlvbiBpcyBzdXBwbGllZCwgb3IgaWYgbm8gb3B0aW9ucyBhcmUgc3VwcGxpZWQsIGV4aXN0aW5nCitjb21wbGV0aW9uIHNwZWNpZmljYXRpb25zIGFyZSBwcmludGVkIGluIGEgd2F5IHRoYXQgYWxsb3dzIHRoZW0gdG8gYmUKK3JldXNlZCBhcyBpbnB1dC4KK1RoZSBAb3B0aW9uey1yfSBvcHRpb24gcmVtb3ZlcyBhIGNvbXBsZXRpb24gc3BlY2lmaWNhdGlvbiBmb3IKK2VhY2ggQHZhcntuYW1lfSwgb3IsIGlmIG5vIEB2YXJ7bmFtZX1zIGFyZSBzdXBwbGllZCwgYWxsCitjb21wbGV0aW9uIHNwZWNpZmljYXRpb25zLgorCitUaGUgcHJvY2VzcyBvZiBhcHBseWluZyB0aGVzZSBjb21wbGV0aW9uIHNwZWNpZmljYXRpb25zIHdoZW4gd29yZCBjb21wbGV0aW9uCitpcyBhdHRlbXB0ZWQgaXMgZGVzY3JpYmVkIGFib3ZlIChAcHhyZWZ7UHJvZ3JhbW1hYmxlIENvbXBsZXRpb259KS4KKworT3RoZXIgb3B0aW9ucywgaWYgc3BlY2lmaWVkLCBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3MuCitUaGUgYXJndW1lbnRzIHRvIHRoZSBAb3B0aW9uey1HfSwgQG9wdGlvbnstV30sIGFuZCBAb3B0aW9uey1YfSBvcHRpb25zCisoYW5kLCBpZiBuZWNlc3NhcnksIHRoZSBAb3B0aW9uey1QfSBhbmQgQG9wdGlvbnstU30gb3B0aW9ucykKK3Nob3VsZCBiZSBxdW90ZWQgdG8gcHJvdGVjdCB0aGVtIGZyb20gZXhwYW5zaW9uIGJlZm9yZSB0aGUKK0Bjb2Rle2NvbXBsZXRlfSBidWlsdGluIGlzIGludm9rZWQuCisKKworQHRhYmxlIEBjb2RlCitAaXRlbSAtbyBAdmFye2NvbXAtb3B0aW9ufQorVGhlIEB2YXJ7Y29tcC1vcHRpb259IGNvbnRyb2xzIHNldmVyYWwgYXNwZWN0cyBvZiB0aGUgY29tcHNwZWMncyBiZWhhdmlvcgorYmV5b25kIHRoZSBzaW1wbGUgZ2VuZXJhdGlvbiBvZiBjb21wbGV0aW9ucy4KK0B2YXJ7Y29tcC1vcHRpb259IG1heSBiZSBvbmUgb2Y6IAorCitAdGFibGUgQGNvZGUKKworQGl0ZW0gYmFzaGRlZmF1bHQKK1BlcmZvcm0gdGhlIHJlc3Qgb2YgdGhlIGRlZmF1bHQgQmFzaCBjb21wbGV0aW9ucyBpZiB0aGUgY29tcHNwZWMKK2dlbmVyYXRlcyBubyBtYXRjaGVzLgorCitAaXRlbSBkZWZhdWx0CitVc2UgUmVhZGxpbmUncyBkZWZhdWx0IGZpbGVuYW1lIGNvbXBsZXRpb24gaWYgdGhlIGNvbXBzcGVjIGdlbmVyYXRlcworbm8gbWF0Y2hlcy4KKworQGl0ZW0gZGlybmFtZXMKK1BlcmZvcm0gZGlyZWN0b3J5IG5hbWUgY29tcGxldGlvbiBpZiB0aGUgY29tcHNwZWMgZ2VuZXJhdGVzIG5vIG1hdGNoZXMuCisKK0BpdGVtIGZpbGVuYW1lcworVGVsbCBSZWFkbGluZSB0aGF0IHRoZSBjb21wc3BlYyBnZW5lcmF0ZXMgZmlsZW5hbWVzLCBzbyBpdCBjYW4gcGVyZm9ybSBhbnkKK2ZpbGVuYW1lLXNwZWNpZmljIHByb2Nlc3NpbmcgKGxpa2UgYWRkaW5nIGEgc2xhc2ggdG8gZGlyZWN0b3J5IG5hbWVzIG9yCitzdXBwcmVzc2luZyB0cmFpbGluZyBzcGFjZXMpLiAgVGhpcyBvcHRpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoCitzaGVsbCBmdW5jdGlvbnMgc3BlY2lmaWVkIHdpdGggQG9wdGlvbnstRn0uCisKK0BpdGVtIG5vc3BhY2UKK1RlbGwgUmVhZGxpbmUgbm90IHRvIGFwcGVuZCBhIHNwYWNlICh0aGUgZGVmYXVsdCkgdG8gd29yZHMgY29tcGxldGVkIGF0Cit0aGUgZW5kIG9mIHRoZSBsaW5lLgorCitAaXRlbSBwbHVzZGlycworQWZ0ZXIgYW55IG1hdGNoZXMgZGVmaW5lZCBieSB0aGUgY29tcHNwZWMgYXJlIGdlbmVyYXRlZCwgCitkaXJlY3RvcnkgbmFtZSBjb21wbGV0aW9uIGlzIGF0dGVtcHRlZCBhbmQgYW55CittYXRjaGVzIGFyZSBhZGRlZCB0byB0aGUgcmVzdWx0cyBvZiB0aGUgb3RoZXIgYWN0aW9ucy4KKworQGVuZCB0YWJsZQorCitAaXRlbSAtQSBAdmFye2FjdGlvbn0KK1RoZSBAdmFye2FjdGlvbn0gbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBwb3NzaWJsZQorY29tcGxldGlvbnM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gYWxpYXMKK0FsaWFzIG5hbWVzLiAgTWF5IGFsc28gYmUgc3BlY2lmaWVkIGFzIEBvcHRpb257LWF9LgorCitAaXRlbSBhcnJheXZhcgorQXJyYXkgdmFyaWFibGUgbmFtZXMuCisKK0BpdGVtIGJpbmRpbmcKK1JlYWRsaW5lIGtleSBiaW5kaW5nIG5hbWVzIChAcHhyZWZ7QmluZGFibGUgUmVhZGxpbmUgQ29tbWFuZHN9KS4KKworQGl0ZW0gYnVpbHRpbgorTmFtZXMgb2Ygc2hlbGwgYnVpbHRpbiBjb21tYW5kcy4gIE1heSBhbHNvIGJlIHNwZWNpZmllZCBhcyBAb3B0aW9uey1ifS4KKworQGl0ZW0gY29tbWFuZAorQ29tbWFuZCBuYW1lcy4gIE1heSBhbHNvIGJlIHNwZWNpZmllZCBhcyBAb3B0aW9uey1jfS4KKworQGl0ZW0gZGlyZWN0b3J5CitEaXJlY3RvcnkgbmFtZXMuICBNYXkgYWxzbyBiZSBzcGVjaWZpZWQgYXMgQG9wdGlvbnstZH0uCisKK0BpdGVtIGRpc2FibGVkCitOYW1lcyBvZiBkaXNhYmxlZCBzaGVsbCBidWlsdGlucy4KKworQGl0ZW0gZW5hYmxlZAorTmFtZXMgb2YgZW5hYmxlZCBzaGVsbCBidWlsdGlucy4KKworQGl0ZW0gZXhwb3J0CitOYW1lcyBvZiBleHBvcnRlZCBzaGVsbCB2YXJpYWJsZXMuICBNYXkgYWxzbyBiZSBzcGVjaWZpZWQgYXMgQG9wdGlvbnstZX0uCisKK0BpdGVtIGZpbGUKK0ZpbGUgbmFtZXMuICBNYXkgYWxzbyBiZSBzcGVjaWZpZWQgYXMgQG9wdGlvbnstZn0uCisKK0BpdGVtIGZ1bmN0aW9uCitOYW1lcyBvZiBzaGVsbCBmdW5jdGlvbnMuCisKK0BpdGVtIGdyb3VwCitHcm91cCBuYW1lcy4gIE1heSBhbHNvIGJlIHNwZWNpZmllZCBhcyBAb3B0aW9uey1nfS4KKworQGl0ZW0gaGVscHRvcGljCitIZWxwIHRvcGljcyBhcyBhY2NlcHRlZCBieSB0aGUgQGNvZGV7aGVscH0gYnVpbHRpbiAoQHB4cmVme0Jhc2ggQnVpbHRpbnN9KS4KKworQGl0ZW0gaG9zdG5hbWUKK0hvc3RuYW1lcywgYXMgdGFrZW4gZnJvbSB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlCitAZW52e0hPU1RGSUxFfSBzaGVsbCB2YXJpYWJsZSAoQHB4cmVme0Jhc2ggVmFyaWFibGVzfSkuCisKK0BpdGVtIGpvYgorSm9iIG5hbWVzLCBpZiBqb2IgY29udHJvbCBpcyBhY3RpdmUuICBNYXkgYWxzbyBiZSBzcGVjaWZpZWQgYXMgQG9wdGlvbnstan0uCisKK0BpdGVtIGtleXdvcmQKK1NoZWxsIHJlc2VydmVkIHdvcmRzLiAgTWF5IGFsc28gYmUgc3BlY2lmaWVkIGFzIEBvcHRpb257LWt9LgorCitAaXRlbSBydW5uaW5nCitOYW1lcyBvZiBydW5uaW5nIGpvYnMsIGlmIGpvYiBjb250cm9sIGlzIGFjdGl2ZS4KKworQGl0ZW0gc2VydmljZQorU2VydmljZSBuYW1lcy4gIE1heSBhbHNvIGJlIHNwZWNpZmllZCBhcyBAb3B0aW9uey1zfS4KKworQGl0ZW0gc2V0b3B0CitWYWxpZCBhcmd1bWVudHMgZm9yIHRoZSBAb3B0aW9uey1vfSBvcHRpb24gdG8gdGhlIEBjb2Rle3NldH0gYnVpbHRpbgorKEBweHJlZntUaGUgU2V0IEJ1aWx0aW59KS4KKworQGl0ZW0gc2hvcHQKK1NoZWxsIG9wdGlvbiBuYW1lcyBhcyBhY2NlcHRlZCBieSB0aGUgQGNvZGV7c2hvcHR9IGJ1aWx0aW4KKyhAcHhyZWZ7QmFzaCBCdWlsdGluc30pLgorCitAaXRlbSBzaWduYWwKK1NpZ25hbCBuYW1lcy4KKworQGl0ZW0gc3RvcHBlZAorTmFtZXMgb2Ygc3RvcHBlZCBqb2JzLCBpZiBqb2IgY29udHJvbCBpcyBhY3RpdmUuCisKK0BpdGVtIHVzZXIKK1VzZXIgbmFtZXMuICBNYXkgYWxzbyBiZSBzcGVjaWZpZWQgYXMgQG9wdGlvbnstdX0uCisKK0BpdGVtIHZhcmlhYmxlCitOYW1lcyBvZiBhbGwgc2hlbGwgdmFyaWFibGVzLiAgTWF5IGFsc28gYmUgc3BlY2lmaWVkIGFzIEBvcHRpb257LXZ9LgorQGVuZCB0YWJsZQorCitAaXRlbSAtRyBAdmFye2dsb2JwYXR9CitUaGUgZmlsZW5hbWUgZXhwYW5zaW9uIHBhdHRlcm4gQHZhcntnbG9icGF0fSBpcyBleHBhbmRlZCB0byBnZW5lcmF0ZQordGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zLgorCitAaXRlbSAtVyBAdmFye3dvcmRsaXN0fQorVGhlIEB2YXJ7d29yZGxpc3R9IGlzIHNwbGl0IHVzaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQorQGVudntJRlN9IHNwZWNpYWwgdmFyaWFibGUgYXMgZGVsaW1pdGVycywgYW5kIGVhY2ggcmVzdWx0YW50IHdvcmQKK2lzIGV4cGFuZGVkLgorVGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zIGFyZSB0aGUgbWVtYmVycyBvZiB0aGUgcmVzdWx0YW50IGxpc3Qgd2hpY2gKK21hdGNoIHRoZSB3b3JkIGJlaW5nIGNvbXBsZXRlZC4KKworQGl0ZW0gLUMgQHZhcntjb21tYW5kfQorQHZhcntjb21tYW5kfSBpcyBleGVjdXRlZCBpbiBhIHN1YnNoZWxsIGVudmlyb25tZW50LCBhbmQgaXRzIG91dHB1dCBpcwordXNlZCBhcyB0aGUgcG9zc2libGUgY29tcGxldGlvbnMuCisKK0BpdGVtIC1GIEB2YXJ7ZnVuY3Rpb259CitUaGUgc2hlbGwgZnVuY3Rpb24gQHZhcntmdW5jdGlvbn0gaXMgZXhlY3V0ZWQgaW4gdGhlIGN1cnJlbnQgc2hlbGwKK2Vudmlyb25tZW50LgorV2hlbiBpdCBmaW5pc2hlcywgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zIGFyZSByZXRyaWV2ZWQgZnJvbSB0aGUgdmFsdWUKK29mIHRoZSBAZW52e0NPTVBSRVBMWX0gYXJyYXkgdmFyaWFibGUuCisKK0BpdGVtIC1YIEB2YXJ7ZmlsdGVycGF0fQorQHZhcntmaWx0ZXJwYXR9IGlzIGEgcGF0dGVybiBhcyB1c2VkIGZvciBmaWxlbmFtZSBleHBhbnNpb24uCitJdCBpcyBhcHBsaWVkIHRvIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zIGdlbmVyYXRlZCBieSB0aGUKK3ByZWNlZGluZyBvcHRpb25zIGFuZCBhcmd1bWVudHMsIGFuZCBlYWNoIGNvbXBsZXRpb24gbWF0Y2hpbmcKK0B2YXJ7ZmlsdGVycGF0fSBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuCitBIGxlYWRpbmcgQHNhbXB7IX0gaW4gQHZhcntmaWx0ZXJwYXR9IG5lZ2F0ZXMgdGhlIHBhdHRlcm47IGluIHRoaXMKK2Nhc2UsIGFueSBjb21wbGV0aW9uIG5vdCBtYXRjaGluZyBAdmFye2ZpbHRlcnBhdH0gaXMgcmVtb3ZlZC4KKworQGl0ZW0gLVAgQHZhcntwcmVmaXh9CitAdmFye3ByZWZpeH0gaXMgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBvc3NpYmxlIGNvbXBsZXRpb24KK2FmdGVyIGFsbCBvdGhlciBvcHRpb25zIGhhdmUgYmVlbiBhcHBsaWVkLgorCitAaXRlbSAtUyBAdmFye3N1ZmZpeH0KK0B2YXJ7c3VmZml4fSBpcyBhcHBlbmRlZCB0byBlYWNoIHBvc3NpYmxlIGNvbXBsZXRpb24KK2FmdGVyIGFsbCBvdGhlciBvcHRpb25zIGhhdmUgYmVlbiBhcHBsaWVkLgorQGVuZCB0YWJsZQorCitUaGUgcmV0dXJuIHZhbHVlIGlzIHRydWUgdW5sZXNzIGFuIGludmFsaWQgb3B0aW9uIGlzIHN1cHBsaWVkLCBhbiBvcHRpb24KK290aGVyIHRoYW4gQG9wdGlvbnstcH0gb3IgQG9wdGlvbnstcn0gaXMgc3VwcGxpZWQgd2l0aG91dCBhIEB2YXJ7bmFtZX0KK2FyZ3VtZW50LCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVtb3ZlIGEgY29tcGxldGlvbiBzcGVjaWZpY2F0aW9uIGZvcgorYSBAdmFye25hbWV9IGZvciB3aGljaCBubyBzcGVjaWZpY2F0aW9uIGV4aXN0cywgb3IKK2FuIGVycm9yIG9jY3VycyBhZGRpbmcgYSBjb21wbGV0aW9uIHNwZWNpZmljYXRpb24uCisKK0BlbmQgdGFibGUKK0BlbmQgaWZzZXQKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2RvYy9ybHVzZXJtYW4ucGRmIGIvcmVhZGxpbmUvZG9jL3JsdXNlcm1hbi5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyMTg0YgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRsaW5lL2RvYy9ybHVzZXJtYW4ucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2RvYy9ybHVzZXJtYW4udGV4aSBiL3JlYWRsaW5lL2RvYy9ybHVzZXJtYW4udGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjgwYjMxCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZG9jL3JsdXNlcm1hbi50ZXhpCkBAIC0wLDAgKzEsODggQEAKK1xpbnB1dCB0ZXhpbmZvICAgIEBjIC0qLXRleGluZm8tKi0KK0Bjb21tZW50ICUqKnN0YXJ0IG9mIGhlYWRlciAoVGhpcyBpcyBmb3IgcnVubmluZyBUZXhpbmZvIG9uIGEgcmVnaW9uLikKK0BzZXRmaWxlbmFtZSBybHVzZXJtYW4uaW5mbworQHNldHRpdGxlIEdOVSBSZWFkbGluZSBMaWJyYXJ5CitAY29tbWVudCAlKiplbmQgb2YgaGVhZGVyIChUaGlzIGlzIGZvciBydW5uaW5nIFRleGluZm8gb24gYSByZWdpb24uKQorCitAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCisKK0BpbmNsdWRlIHZlcnNpb24udGV4aQorCitAY29weWluZworVGhpcyBtYW51YWwgZGVzY3JpYmVzIHRoZSBlbmQgdXNlciBpbnRlcmZhY2Ugb2YgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5CisodmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0sIEB2YWx1ZXtVUERBVEVEfSksIGEgbGlicmFyeSB3aGljaCBhaWRzIGluIHRoZQorY29uc2lzdGVuY3kgb2YgdXNlciBpbnRlcmZhY2UgYWNyb3NzIGRpc2NyZXRlIHByb2dyYW1zIHdoaWNoIHByb3ZpZGUKK2EgY29tbWFuZCBsaW5lIGludGVyZmFjZS4KKworQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTg4LTIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworQHF1b3RhdGlvbgorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIGRvY3VtZW50Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbiAxLjEgb3IKK2FueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3aXRoIG5vCitJbnZhcmlhbnQgU2VjdGlvbnMsIHdpdGggdGhlIEZyb250LUNvdmVyIHRleHRzIGJlaW5nIGBgQSBHTlUgTWFudWFsLCcnCithbmQgd2l0aCB0aGUgQmFjay1Db3ZlciBUZXh0cyBhcyBpbiAoYSkgYmVsb3cuICBBIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMKK2luY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGVudGl0bGVkIGBgR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlLicnCisKKyhhKSBUaGUgRlNGJ3MgQmFjay1Db3ZlciBUZXh0IGlzOiBgYFlvdSBoYXZlIGZyZWVkb20gdG8gY29weSBhbmQgbW9kaWZ5Cit0aGlzIEdOVSBNYW51YWwsIGxpa2UgR05VIHNvZnR3YXJlLiAgQ29waWVzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiByYWlzZSBmdW5kcyBmb3IgR05VIGRldmVsb3BtZW50LicnCitAZW5kIHF1b3RhdGlvbgorQGVuZCBjb3B5aW5nCisKK0BkaXJjYXRlZ29yeSBMaWJyYXJpZXMKK0BkaXJlbnRyeQorKiBSTHVzZXJtYW46IChybHVzZXJtYW4pLiAgICAgICBUaGUgR05VIHJlYWRsaW5lIGxpYnJhcnkgVXNlcidzIE1hbnVhbC4KK0BlbmQgZGlyZW50cnkKKworQHRpdGxlcGFnZQorQHRpdGxlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IFVzZXIgSW50ZXJmYWNlCitAc3VidGl0bGUgRWRpdGlvbiBAdmFsdWV7RURJVElPTn0sIGZvciBAY29kZXtSZWFkbGluZSBMaWJyYXJ5fSBWZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfS4KK0BzdWJ0aXRsZSBAdmFsdWV7VVBEQVRFRC1NT05USH0KK0BhdXRob3IgQ2hldCBSYW1leSwgQ2FzZSBXZXN0ZXJuIFJlc2VydmUgVW5pdmVyc2l0eQorQGF1dGhvciBCcmlhbiBGb3gsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorCitAcGFnZQorQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorQGluc2VydGNvcHlpbmcKKworQHNwIDEKK1B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEAqCis1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQCoKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNyBAKgorVVNBIEAqCisKK0BlbmQgdGl0bGVwYWdlCisKK0Bjb250ZW50cworCitAaWZub3R0ZXgKK0Bub2RlIFRvcAorQHRvcCBHTlUgUmVhZGxpbmUgTGlicmFyeQorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgZW5kIHVzZXIgaW50ZXJmYWNlIG9mIHRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSwKK2EgdXRpbGl0eSB3aGljaCBhaWRzIGluIHRoZSBjb25zaXN0ZW5jeSBvZiB1c2VyIGludGVyZmFjZSBhY3Jvc3MgZGlzY3JldGUKK3Byb2dyYW1zIHdoaWNoIHByb3ZpZGUgYSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgorCitAbWVudQorKiBDb21tYW5kIExpbmUgRWRpdGluZzo6CSAgIEdOVSBSZWFkbGluZSBVc2VyJ3MgTWFudWFsLgorKiBDb3B5aW5nIFRoaXMgTWFudWFsOjoJCUNvcHlpbmcgVGhpcyBNYW51YWwuCitAZW5kIG1lbnUKK0BlbmQgaWZub3R0ZXgKKworQGluY2x1ZGUgcmx1c2VyLnRleGkKKworQG5vZGUgQ29weWluZyBUaGlzIE1hbnVhbAorQGFwcGVuZGl4IENvcHlpbmcgVGhpcyBNYW51YWwKKworQG1lbnUKKyogR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlOjoJTGljZW5zZSBmb3IgY29weWluZyB0aGlzIG1hbnVhbC4KK0BlbmQgbWVudQorCitAaW5jbHVkZSBmZGwudGV4aQorCitAYnllCmRpZmYgLS1naXQgYS9yZWFkbGluZS9kb2MvdmVyc2lvbi50ZXhpIGIvcmVhZGxpbmUvZG9jL3ZlcnNpb24udGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTgxNmJmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZG9jL3ZlcnNpb24udGV4aQpAQCAtMCwwICsxLDEwIEBACitAaWdub3JlCitDb3B5cmlnaHQgKEMpIDE5ODgtMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gCitAZW5kIGlnbm9yZQorCitAc2V0IEVESVRJT04gNS4xLWJldGExCitAc2V0IFZFUlNJT04gNS4xLWJldGExCitAc2V0IFVQREFURUQgMTEgTm92ZW1iZXIgMjAwNQorQHNldCBVUERBVEVELU1PTlRIIE5vdmVtYmVyIDIwMDUKKworQHNldCBMQVNUQ0hBTkdFIEZyaSBOb3YgMTEgMTk6NTA6NTEgRVNUIDIwMDUKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2V4YW1wbGVzL3JsLWZnZXRzLmMgYi9yZWFkbGluZS9leGFtcGxlcy9ybC1mZ2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MTJiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbGluZS9leGFtcGxlcy9ybC1mZ2V0cy5jCkBAIC0wLDAgKzEsMzc0IEBACisvKgorRGF0ZTogVHVlLCAxNiBNYXIgMjAwNCAxOTozODo0MCAtMDgwMAorRnJvbTogSGFyb2xkIExldnkgPEhhcm9sZC5MZXZ5QHN5bm9wc3lzLmNvbT4KK1N1YmplY3Q6IGZnZXRzKHN0ZGluKSAtLT4gcmVhZGxpbmUoKSByZWRpcmVjdG9yCitUbzogY2hldEBwby5jd3J1LmVkdQorCitIaSBDaGV0LAorCitIZXJlIGlzIHNvbWV0aGluZyB5b3UgbWF5IGZpbmQgdXNlZnVsIGVub3VnaCB0byBpbmNsdWRlIGluIHRoZSByZWFkbGluZQorZGlzdHJpYnV0aW9uLiAgSXQgaXMgYSBzaGFyZWQgbGlicmFyeSB0aGF0IHJlZGlyZWN0cyBjYWxscyB0byBmZ2V0cyhzdGRpbikKK3RvIHJlYWRsaW5lKCkgdmlhIExEX1BSRUxPQUQsIGFuZCBpdCBzdXBwb3J0cyBhIGN1c3RvbSBwcm9tcHQgYW5kIGxpc3Qgb2YKK2NvbW1hbmQgbmFtZXMuICBNYW55IHBlb3BsZSBoYXZlIGFza2VkIG1lIGZvciB0aGlzIGZpbGUsIHNvIEkgdGhvdWdodCBJJ2QKK3Bhc3MgaXQgeW91ciB3YXkgaW4gaG9wZSBvZiBqdXN0IGluY2x1ZGluZyBpdCB3aXRoIHJlYWRsaW5lIHRvIGJlZ2luIHdpdGguCisKK0Jlc3QgUmVnYXJkcywKKworLUhhcm9sZAorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAKKyAgRklMRSBOQU1FOiAgICBmZ2V0cy5jICAgICAgICAgICAgICAgICAgVEFSR0VUOiAgIGxpYmZnZXRzLnNvCisgIEFVVEhPUjogICAgICAgSGFyb2xkIExldnkgICAgICAgICAgICAgIFZFUlNJT046ICAxLjAKKyAgICAgICAgICAgICAgICBobGV2eUBzeW5vcHN5cy5jb20KKyAgCisgIEFCU1RSQUNUOiAgQ3VzdG9taXplIGZnZXRzKCkgYmVoYXZpb3IgdmlhIExEX1BSRUxPQUQgaW4gdGhlIGZvbGxvd2luZyB3YXlzOgorICAKKyAgICAtLSBJZiBmZ2V0cyhzdGRpbikgaXMgY2FsbGVkLCByZWRpcmVjdCB0byBHTlUgcmVhZGxpbmUoKSB0byBvYnRhaW4KKyAgICAgICBjb21tYW5kLWxpbmUgZWRpdGluZywgZmlsZS1uYW1lIGNvbXBsZXRpb24sIGhpc3RvcnksIGV0Yy4KKyAgCisgICAgLS0gQSBsaXN0IG9mIGNvbW1hbmRzIGZvciBjb21tYW5kLW5hbWUgY29tcGxldGlvbiBjYW4gYmUgY29uZmlndXJlZCBieQorICAgICAgIHNldHRpbmcgdGhlIGVudmlyb25tZW50LXZhcmlhYmxlIEZHRVRTX0NPTU1BTkRfRklMRSB0byBhIGZpbGUgY29udGFpbmluZworICAgICAgIHRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIGJlIHVzZWQuCisgIAorICAgIC0tIENvbW1hbmQtbGluZSBlZGl0aW5nIHdpdGggcmVhZGxpbmUoKSB3b3JrcyBiZXN0IHdoZW4gdGhlIHByb21wdCBzdHJpbmcKKyAgICAgICBpcyBrbm93bjsgeW91IGNhbiBzZXQgdGhpcyB3aXRoIHRoZSBGR0VUU19QUk9NUFQgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgIAorICAgIC0tIFRoZXJlIHNwZWNpYWwgc3RyaW5ncyB0aGF0IGxpYmZnZXRzIHdpbGwgaW50ZXJwcmV0IGFzIGludGVybmFsIGNvbW1hbmRzOgorICAKKyAgICAgICAgICAgX2ZnZXRzX3Jlc2V0XyAgICByZXNldCB0aGUgY29tbWFuZCBsaXN0CisgIAorICAgICAgICAgICBfZmdldHNfZHVtcF8gICAgIGR1bXAgc3RhdHVzCisgIAorICAgICAgICAgICBfZmdldHNfZGVidWdfICAgIHRvZ2dsZSBkZWJ1ZyBtZXNzYWdlcworCisgIEhPVyBUTyBCVUlMRDogIEhlcmUgYXJlIGV4YW1wbGVzIG9mIGhvdyB0byBidWlsZCBsaWJmZ2V0cy5zbyBvbiB2YXJpb3VzCisgIHBsYXRmb3JtczsgeW91IHdpbGwgaGF2ZSB0byBhZGQgLUkgYW5kIC1MIGZsYWdzIHRvIGNvbmZpZ3VyZSBhY2Nlc3MgdG8KKyAgdGhlIHJlYWRsaW5lIGhlYWRlciBhbmQgbGlicmFyeSBmaWxlcy4KKworICAoMzItYml0IGJ1aWxkcyB3aXRoIGdjYykKKyAgQUlYOiAgIGdjYyAtZlBJQyBmZ2V0cy5jIC1zaGFyZWQgLW8gbGliZmdldHMuc28gLWxjIC1sZGwgLWxyZWFkbGluZSAtbHRlcm1jYXAKKyAgSFAtVVg6IGdjYyAtZlBJQyBmZ2V0cy5jIC1zaGFyZWQgLW8gbGliZmdldHMuc28gLWxjIC1sZGxkIC1scmVhZGxpbmUKKyAgTGludXg6IGdjYyAtZlBJQyBmZ2V0cy5jIC1zaGFyZWQgLW8gbGliZmdldHMuc28gLWxjIC1sZGwgLWxyZWFkbGluZQorICBTdW5PUzogZ2NjIC1mUElDIGZnZXRzLmMgLXNoYXJlZCAtbyBsaWJmZ2V0cy5zbyAtbGMgLWxkbCAtbGdlbiAtbHJlYWRsaW5lCisKKyAgKDY0LWJpdCBidWlsZHMgd2l0aG91dCBnY2MpCisgIFN1bk9TOiBTVU5Xc3Byby9iaW4vY2MgLURfTEFSR0VGSUxFNjRfU09VUkNFPTEgLXh0YXJnZXQ9dWx0cmEgLXhhcmNoPXY5IFwKKyAgICAgICAgICAgLUtQSUMgZmdldHMuYyAtQmR5bmFtaWMgLWxjIC1sZGwgLWxnZW4gLWx0ZXJtY2FwIC1scmVhZGxpbmUKKyAgCisgIEhPVyBUTyBVU0U6ICBEaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgbGV2ZWxzIG9mIHN1cHBvcnQKKyAgZm9yIHRoZSBMRF9QUkVMT0FEIGNvbmNlcHQuICBUaGUgZ2VuZXJpYyBtZXRob2QgZm9yIDMyLWJpdCBwbGF0Zm9ybXMgaXMgdG8KKyAgcHV0IGxpYnRlcm1jYXAuc28sIGxpYmZnZXRzLnNvLCBhbmQgbGlicmVhZGxpbmUuc28gKHdpdGggYWJzb2x1dGUgcGF0aHMpCisgIGluIHRoZSBMRF9QUkVMT0FEIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgdG8gcHV0IHRoZWlyIHBhcmVudCBkaXJlY3RvcmllcworICBpbiB0aGUgTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiAgVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubworICBnZW5lcmljIG1ldGhvZCBmb3IgNjQtYml0IHBsYXRmb3JtczsgZS5nLiBmb3IgNjQtYml0IFN1bk9TLCB5b3Ugd291bGQgaGF2ZQorICB0byBidWlsZCBib3RoIDMyLWJpdCBhbmQgNjQtYml0IGxpYmZnZXRzIGFuZCBsaWJyZWFkbGluZSBsaWJyYXJpZXMsIGFuZAorICB1c2UgdGhlIExEX0ZMQUdTXzMyIGFuZCBMRF9GTEFHU182NCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCBwcmVsb2FkIGFuZAorICBsaWJyYXJ5X3BhdGggY29uZmlndXJhdGlvbnMgKGEgbWl4IG9mIDMyLWJpdCBhbmQgNjQtYml0IGNhbGxzIGFyZSBtYWRlIHVuZGVyCisgIDY0LWJpdCBTdW5PUykuCisgIAorICBFWEFNUExFIFdSQVBQRVI6ICBIZXJlIGlzIGFuIGV4YW1wbGUgc2hlbGwgc2NyaXB0IHdyYXBwZXIgYXJvdW5kIHRoZQorICBwcm9ncmFtICJmb28iIHRoYXQgdXNlcyBmZ2V0cygpIGZvciBjb21tYW5kLWxpbmUgaW5wdXQ6CisKKyAgICAgICMhL2Jpbi9jc2gKKyAgICAgICMjIyMgcmVwbGFjZSB0aGlzIHdpdGggdGhlIGxpYnRlcm1jYXAuc28gZGlyZWN0b3J5OgorICAgICAgc2V0IGRpcjEgPSAiL3Vzci9saWIiCisgICAgICAjIyMjIHJlcGxhY2UgdGhpcyB3aXRoIHRoZSBsaWJmZ2V0cy5zbyBkaXJlY3Rvcnk6CisgICAgICBzZXQgZGlyMiA9ICIvdXNyL2ZnZXRzIgorICAgICAgIyMjIyByZXBsYWNlIHRoaXMgd2l0aCB0aGUgbGlicmVhZGxpbmUuc28gZGlyZWN0b3J5OgorICAgICAgc2V0IGRpcjMgPSAiL3Vzci9sb2NhbC9saWIiCisgICAgICBzZXQgbGliMSA9ICIke2RpcjF9L2xpYnRlcm1jYXAuc28iCisgICAgICBzZXQgbGliMiA9ICIke2RpcjJ9L2xpYmZnZXRzLnNvIgorICAgICAgc2V0IGxpYjMgPSAiJHtkaXIzfS9saWJyZWFkbGluZS5zbyIKKyAgICAgIGlmICggIiR7P0xEX1BSRUxPQUR9IiApIHRoZW4KKyAgICAgICAgc2V0ZW52IExEX1BSRUxPQUQgIiR7bGliMX06JHtsaWIyfToke2xpYjN9OiR7TERfUFJFTE9BRH0iCisgICAgICBlbHNlCisgICAgICAgIHNldGVudiBMRF9QUkVMT0FEICIke2xpYjF9OiR7bGliMn06JHtsaWIzfSIKKyAgICAgIGVuZGlmCisgICAgICBpZiAoICIkez9MRF9MSUJSQVJZX1BBVEh9IiApIHRoZW4KKyAgICAgICAgc2V0ZW52IExEX0xJQlJBUllfUEFUSCAiJHtkaXIxfToke2RpcjJ9OiR7ZGlyM306JHtMRF9MSUJSQVJZX1BBVEh9IgorICAgICAgZWxzZQorICAgICAgICBzZXRlbnYgTERfTElCUkFSWV9QQVRIICIke2RpcjF9OiR7ZGlyMn06JHtkaXIzfSIKKyAgICAgIGVuZGlmCisgICAgICBzZXRlbnYgRkdFVFNfQ09NTUFORF9GSUxFICIke2RpcjJ9L2Zvby5jb21tYW5kcyIKKyAgICAgIHNldGVudiBGR0VUU19QUk9NUFQgICAgICAgImZvbz4gIgorICAgICAgZXhlYyAiZm9vIiAkKgorICAKKyAgQ29weXJpZ2h0IChDKakyMDAzLTIwMDQgSGFyb2xkIExldnkuCisgIAorICBUaGlzIGNvZGUgbGlua3MgdG8gdGhlIEdOVSByZWFkbGluZSBsaWJyYXJ5LCBhbmQgYXMgc3VjaCBpcyBib3VuZCBieSB0aGUKKyAgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kIGlzCisgIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdCBoYXZlIGEKKyAgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlLAorICBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEgVVNBLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCisgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAgZGV0YWlscy4KKyAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworDAorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgorI2luY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4KKworCisMCisvKiBmb3IgZHluYW1pY2FsbHkgY29ubmVjdGluZyB0byB0aGUgbmF0aXZlIGZnZXRzKCkgKi8KKyNpZiBkZWZpbmVkKFJUTERfTkVYVCkKKyNkZWZpbmUgUkVBTF9MSUJDIFJUTERfTkVYVAorI2Vsc2UKKyNkZWZpbmUgUkVBTF9MSUJDICgodm9pZCAqKSAtMUwpCisjZW5kaWYKK3R5cGVkZWYgY2hhciAqICggKiBmZ2V0c190ICkgKCBjaGFyICogcywgaW50IG4sIEZJTEUgKiBzdHJlYW0gKSA7CisKKworDAorLyogcHJpdmF0ZSBkYXRhICovCisvKiAtLSB3cml0ZWFibGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5J3MgZGF0YSBzZWdtZW50CisgICAtLSBldmVyeSBwcm9jZXNzIHRoYXQgdXNlcyB0aGUgc2hhcmVkIGxpYnJhcnkgZ2V0cyBhIHByaXZhdGUgbWVtb3J5IGNvcHkgb2YKKyAgICAgIGl0cyBlbnRpcmUgZGF0YSBzZWdtZW50CisgICAtLSBzdGF0aWMgZGF0YSBpbiB0aGUgc2hhcmVkIGxpYnJhcnkgaXMgbm90IGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24KKyAgIC0tIG9ubHkgcmVhZC1vbmx5IChpLmUuICdjb25zdCcpIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBzaGFyZWQgbGlicmFyeSdzCisgICAgICB0ZXh0IHNlZ21lbnQKKyovCitzdGF0aWMgY2hhciAqKiBteV9mZ2V0c19uYW1lcyAgICAgICAgICAgPSBOVUxMIDsKK3N0YXRpYyBpbnQgICAgIG15X2ZnZXRzX251bWJlcl9vZl9uYW1lcyA9IDAgICAgOworc3RhdGljIGludCAgICAgbXlfZmdldHNfZGVidWdfZmxhZyAgICAgID0gMCAgICA7CisKKworDAorLyogaW52b2tlZCB3aXRoIF9mZ2V0c19yZXNldF8gKi8KK3N0YXRpYyB2b2lkCitteV9mZ2V0c19yZXNldCAoCisgIHZvaWQKKykgeworICBpZiAoIG15X2ZnZXRzX25hbWVzICYmIChteV9mZ2V0c19udW1iZXJfb2ZfbmFtZXMgPiAwKSApIHsKKyAgICBpbnQgaSA7CisgICAgaWYgKCBteV9mZ2V0c19kZWJ1Z19mbGFnICkgeworICAgICAgcHJpbnRmICggImxpYmZnZXRzOiAgcmVtb3ZpbmcgY29tbWFuZCBsaXN0XG4iICkgOworICAgIH0KKyAgICBmb3IgKCBpID0gMCA7IGkgPCBteV9mZ2V0c19udW1iZXJfb2ZfbmFtZXMgOyBpICsrICkgeworICAgICAgaWYgKCBteV9mZ2V0c19uYW1lc1tpXSApIGZyZWUgKCBteV9mZ2V0c19uYW1lc1tpXSApIDsKKyAgICB9CisgICAgZnJlZSAoIG15X2ZnZXRzX25hbWVzICkgOworICB9CisgIG15X2ZnZXRzX25hbWVzID0gTlVMTCA7CisgIG15X2ZnZXRzX251bWJlcl9vZl9uYW1lcyA9IDAgOworfQorCisKKwwKKy8qIGludm9rZWQgd2l0aCBfZmdldHNfZHVtcF8gKi8KK3N0YXRpYyB2b2lkCitteV9mZ2V0c19kdW1wICgKKyAgdm9pZAorKSB7CisgIGNoYXIgKiBzIDsKKyAgcHJpbnRmICggIlxuIiApIDsKKyAgcyA9IGdldGVudiAoICJGR0VUU19QUk9NUFQiICkgOworICBwcmludGYgKCAiRkdFVFNfUFJPTVBUICAgICAgID0gJXNcbiIsIHMgPyBzIDogIiIgKSA7CisgIHMgPSBnZXRlbnYgKCAiRkdFVFNfQ09NTUFORF9GSUxFIiApIDsKKyAgcHJpbnRmICggIkZHRVRTX0NPTU1BTkRfRklMRSA9ICVzXG4iLCBzID8gcyA6ICIiICkgOworICBwcmludGYgKCAiZGVidWcgZmxhZyAgICAgICAgID0gJWRcbiIsIG15X2ZnZXRzX2RlYnVnX2ZsYWcgKSA7CisgIHByaW50ZiAoICIjY29tbWFuZHMgICAgICAgICAgPSAlZFxuIiwgbXlfZmdldHNfbnVtYmVyX29mX25hbWVzICkgOworICBpZiAoIG15X2ZnZXRzX2RlYnVnX2ZsYWcgKSB7CisgICAgaWYgKCBteV9mZ2V0c19uYW1lcyAmJiAobXlfZmdldHNfbnVtYmVyX29mX25hbWVzID4gMCkgKSB7CisgICAgICBpbnQgaSA7CisgICAgICBmb3IgKCBpID0gMCA7IGkgPCBteV9mZ2V0c19udW1iZXJfb2ZfbmFtZXMgOyBpICsrICkgeworICAgICAgICBwcmludGYgKCAiJXNcbiIsIG15X2ZnZXRzX25hbWVzW2ldICkgOworICAgICAgfQorICAgIH0KKyAgfQorICBwcmludGYgKCAiXG4iICkgOworfQorCisKKwwKKy8qIGludm9rZWQgd2l0aCBfZmdldHNfZGVidWdfICovCitzdGF0aWMgdm9pZAorbXlfZmdldHNfZGVidWdfdG9nZ2xlICgKKyAgdm9pZAorKSB7CisgIG15X2ZnZXRzX2RlYnVnX2ZsYWcgPSBteV9mZ2V0c19kZWJ1Z19mbGFnID8gMCA6IDEgOworICBpZiAoIG15X2ZnZXRzX2RlYnVnX2ZsYWcgKSB7CisgICAgcHJpbnRmICggImxpYmZnZXRzOiAgZGVidWcgZmxhZyA9ICVkXG4iLCBteV9mZ2V0c19kZWJ1Z19mbGFnICkgOworICB9Cit9CisKKworDAorLyogcmVhZCB0aGUgY29tbWFuZCBsaXN0IGlmIG5lZWRlZCwgcmV0dXJuIHRoZSBpLXRoIG5hbWUgKi8KK3N0YXRpYyBjaGFyICoKK215X2ZnZXRzX2xvb2t1cCAoCisgIGludCBpbmRleAorKSB7CisgIGlmICggKCEgbXlfZmdldHNfbmFtZXMpIHx8ICghIG15X2ZnZXRzX251bWJlcl9vZl9uYW1lcykgKSB7CisgICAgY2hhciAqIGZuYW1lIDsKKyAgICBGSUxFICogZnAgOworICAgIGZnZXRzX3QgX2ZnZXRzIDsKKyAgICBpbnQgaSA7CisgICAgY2hhciBidWYxWzI1Nl0sIGJ1ZjJbMjU2XSA7CisgICAgZm5hbWUgPSBnZXRlbnYgKCAiRkdFVFNfQ09NTUFORF9GSUxFIiApIDsKKyAgICBpZiAoICEgZm5hbWUgKSB7CisgICAgICBpZiAoIG15X2ZnZXRzX2RlYnVnX2ZsYWcgKSB7CisgICAgICAgIHByaW50ZiAoICJsaWJmZ2V0czogIGVtcHR5IG9yIHVuc2V0IEZHRVRTX0NPTU1BTkRfRklMRVxuIiApIDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOVUxMIDsKKyAgICB9CisgICAgZnAgPSBmb3BlbiAoIGZuYW1lLCAiciIgKSA7CisgICAgaWYgKCAhIGZwICkgeworICAgICAgaWYgKCBteV9mZ2V0c19kZWJ1Z19mbGFnICkgeworICAgICAgICBwcmludGYgKCAibGliZmdldHM6ICBjYW5ub3Qgb3BlbiAnJXMnIGZvciByZWFkaW5nXG4iLCBmbmFtZSApIDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOVUxMIDsKKyAgICB9CisgICAgX2ZnZXRzID0gKGZnZXRzX3QpIGRsc3ltICggUkVBTF9MSUJDLCAiZmdldHMiICkgOworICAgIGlmICggISBfZmdldHMgKSB7CisgICAgICBmcHJpbnRmICggc3RkZXJyLAorICAgICAgICAibGliZmdldHM6ICBmYWlsZWQgdG8gZHluYW1pY2FsbHkgbGluayB0byBuYXRpdmUgZmdldHMoKVxuIgorICAgICAgKSA7CisgICAgICByZXR1cm4gTlVMTCA7CisgICAgfQorICAgIGZvciAoIGkgPSAwIDsgX2ZnZXRzKGJ1ZjEsMjU1LGZwKSA7IGkgKysgKSA7CisgICAgaWYgKCAhIGkgKSB7IGZjbG9zZShmcCkgOyByZXR1cm4gTlVMTCA7IH0KKyAgICBteV9mZ2V0c19uYW1lcyA9IChjaGFyKiopIGNhbGxvYyAoIGksIHNpemVvZihjaGFyKikgKSA7CisgICAgcmV3aW5kICggZnAgKSA7CisgICAgaSA9IDAgOworICAgIHdoaWxlICggX2ZnZXRzKGJ1ZjEsMjU1LGZwKSApIHsKKyAgICAgIGJ1ZjFbMjU1XSA9IDAgOworICAgICAgaWYgKCAxID09IHNzY2FuZihidWYxLCIlcyIsYnVmMikgKSB7CisgICAgICAgIG15X2ZnZXRzX25hbWVzW2ldID0gc3RyZHVwKGJ1ZjIpIDsKKyAgICAgICAgaSArKyA7CisgICAgICB9CisgICAgfQorICAgIGZjbG9zZSAoIGZwICkgOworICAgIG15X2ZnZXRzX251bWJlcl9vZl9uYW1lcyA9IGkgOworICAgIGlmICggbXlfZmdldHNfZGVidWdfZmxhZyApIHsKKyAgICAgIHByaW50ZiAoICJsaWJmZ2V0czogIHN1Y2Nlc3NmdWxseSByZWFkICVkIGNvbW1hbmRzXG4iLCBpICkgOworICAgIH0KKyAgfQorICBpZiAoIGluZGV4IDwgbXlfZmdldHNfbnVtYmVyX29mX25hbWVzICkgeworICAgIHJldHVybiBteV9mZ2V0c19uYW1lc1tpbmRleF0gOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMIDsKKyAgfQorfQorCisKKwwKKy8qIGdlbmVyYXRlIGEgbGlzdCBvZiBwYXJ0aWFsIG5hbWUgbWF0Y2hlcyBmb3IgcmVhZGxpbmUoKSAqLworc3RhdGljIGNoYXIgKgorbXlfZmdldHNfZ2VuZXJhdG9yICgKKyAgY29uc3QgY2hhciAqIHRleHQsCisgIGludCAgICAgICAgICBzdGF0ZQorKQoreworICBzdGF0aWMgaW50IGxpc3RfaW5kZXgsIGxlbiA7CisgIGNoYXIgKiAgICAgbmFtZSA7CisgIGlmICggISBzdGF0ZSApIHsKKyAgICBsaXN0X2luZGV4ID0gMCA7CisgICAgbGVuID0gc3RybGVuICggdGV4dCApIDsKKyAgfQorICB3aGlsZSAoICggbmFtZSA9IG15X2ZnZXRzX2xvb2t1cChsaXN0X2luZGV4KSApICkgeworICAgIGxpc3RfaW5kZXggKysgOworICAgIGlmICggISBzdHJuY21wICggbmFtZSwgdGV4dCwgbGVuICkgKSB7CisgICAgICByZXR1cm4gKCBzdHJkdXAgKCBuYW1lICkgKSA7CisgICAgfQorICB9CisgIHJldHVybiAoIE5VTEwgKSA7Cit9CisKKworDAorLyogcGFydGlhbCBuYW1lIGNvbXBsZXRpb24gY2FsbGJhY2sgZm9yIHJlYWRsaW5lKCkgKi8KK3N0YXRpYyBjaGFyICoqCitteV9mZ2V0c19jb21wbGV0aW9uICgKKyAgY29uc3QgY2hhciAqIHRleHQsCisgIGludCAgICAgICAgICBzdGFydCwKKyAgaW50ICAgICAgICAgIGVuZAorKQoreworICBjaGFyICoqIG1hdGNoZXMgOworICBtYXRjaGVzID0gTlVMTCA7CisgIGlmICggISBzdGFydCApIHsKKyAgICBtYXRjaGVzID0gcmxfY29tcGxldGlvbl9tYXRjaGVzICggdGV4dCwgbXlfZmdldHNfZ2VuZXJhdG9yICkgOworICB9CisgIHJldHVybiAoIG1hdGNoZXMgKSA7Cit9CisKKworDAorLyogZmdldHMoKSBpbnRlcmNlcHQgKi8KK2NoYXIgKgorZmdldHMgKAorICBjaGFyICogcywKKyAgaW50ICAgIG4sCisgIEZJTEUgKiBzdHJlYW0KKykKK3sKKyAgaWYgKCAhIHMgKSByZXR1cm4gTlVMTCA7CisgIGlmICggc3RyZWFtID09IHN0ZGluICkgeworICAgIGNoYXIgKiBwcm9tcHQgOworICAgIGNoYXIgKiBteV9mZ2V0c19saW5lIDsKKyAgICBybF9hbHJlYWR5X3Byb21wdGVkID0gMSA7CisgICAgcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fZnVuY3Rpb24gPSBteV9mZ2V0c19jb21wbGV0aW9uIDsKKyAgICBybF9jYXRjaF9zaWduYWxzID0gMSA7CisgICAgcmxfY2F0Y2hfc2lnd2luY2ggPSAxIDsKKyAgICBybF9zZXRfc2lnbmFscyAoKSA7CisgICAgcHJvbXB0ID0gZ2V0ZW52ICggIkZHRVRTX1BST01QVCIgKSA7CisgICAgZm9yICgKKyAgICAgIG15X2ZnZXRzX2xpbmUgPSAwIDsgISBteV9mZ2V0c19saW5lIDsgbXlfZmdldHNfbGluZT1yZWFkbGluZShwcm9tcHQpCisgICAgKSA7CisgICAgaWYgKCAhIHN0cm5jbXAobXlfZmdldHNfbGluZSwgIl9mZ2V0c19yZXNldF8iLCAxMykgKSB7CisgICAgICBteV9mZ2V0c19yZXNldCAoKSA7CisgICAgICBmcmVlICggbXlfZmdldHNfbGluZSApIDsKKyAgICAgIHN0cmNweSAoIHMsICJcbiIgKSA7CisgICAgICByZXR1cm4gKCBzICkgOworICAgIH0KKyAgICBpZiAoICEgc3RybmNtcChteV9mZ2V0c19saW5lLCAiX2ZnZXRzX2R1bXBfIiwgMTIpICkgeworICAgICAgbXlfZmdldHNfZHVtcCAoKSA7CisgICAgICBmcmVlICggbXlfZmdldHNfbGluZSApIDsKKyAgICAgIHN0cmNweSAoIHMsICJcbiIgKSA7CisgICAgICByZXR1cm4gKCBzICkgOworICAgIH0KKyAgICBpZiAoICEgc3RybmNtcChteV9mZ2V0c19saW5lLCAiX2ZnZXRzX2RlYnVnXyIsIDEzKSApIHsKKyAgICAgIG15X2ZnZXRzX2RlYnVnX3RvZ2dsZSAoKSA7CisgICAgICBmcmVlICggbXlfZmdldHNfbGluZSApIDsKKyAgICAgIHN0cmNweSAoIHMsICJcbiIgKSA7CisgICAgICByZXR1cm4gKCBzICkgOworICAgIH0KKyAgICAodm9pZCkgc3RybmNweSAoIHMsIG15X2ZnZXRzX2xpbmUsIG4tMSApIDsKKyAgICAodm9pZCkgc3RyY2F0ICggcywgIlxuIiApIDsKKyAgICBpZiAoICpteV9mZ2V0c19saW5lICkgYWRkX2hpc3RvcnkgKCBteV9mZ2V0c19saW5lICkgOworICAgIGZyZWUgKCBteV9mZ2V0c19saW5lICkgOworICAgIHJldHVybiAoIHMgKSA7CisgIH0gZWxzZSB7CisgICAgc3RhdGljIGZnZXRzX3QgX2ZnZXRzIDsKKyAgICBfZmdldHMgPSAoZmdldHNfdCkgZGxzeW0gKCBSRUFMX0xJQkMsICJmZ2V0cyIgKSA7CisgICAgaWYgKCAhIF9mZ2V0cyApIHsKKyAgICAgIGZwcmludGYgKCBzdGRlcnIsCisgICAgICAgICJsaWJmZ2V0czogIGZhaWxlZCB0byBkeW5hbWljYWxseSBsaW5rIHRvIG5hdGl2ZSBmZ2V0cygpXG4iCisgICAgICApIDsKKyAgICAgIHN0cmNweSAoIHMsICJcbiIgKSA7CisgICAgICByZXR1cm4gKCBzICkgOworICAgIH0KKyAgICByZXR1cm4gKAorICAgICAgX2ZnZXRzICggcywgbiwgc3RyZWFtICkKKyAgICApIDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9DaGFuZ2VMb2cgYi9yZWFkbGluZS9leGFtcGxlcy9ybGZlL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTQxYjJiCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9DaGFuZ2VMb2cKQEAgLTAsMCArMSwzNyBAQAorMjAwNC0xMS0wNCAgUGVyIEJvdGhuZXIgIDxwZXJAYm90aG5lci5jb20+CisKKwkqIHB0eS5jOiAgSW1wb3J0IGZyb20gc2NyZWVuLTQuMC4yLgorCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgY29uZmlnLmguaW46ICBTZXQgdXAgYXV0b2NvbmYgaGFuZGxpbmcsCisJY29weWluZyBhIGJ1bmsgb2Ygc3R1ZmYgb3ZlciBmcm9tIHNjcmVlbi4KKwkqIHJsZmUuYzogIFVzZSBPcGVuUFRZIGZyb20gcHR5LmMgaW5zdGVhZCBvZiBnZXRfbWFzdGVyX3B0eS4KKworMjAwNC0xMS0wMyAgUGVyIEJvdGhuZXIgIDxwZXJAYm90aG5lci5jb20+CisKKwkqIHJsZmUuYzogIEdldCBpbnB1dCBlbXBoYXNpcyAoYm9sZGVuaW5nKSBtb3JlIHJvYnVzdC4KKworCSogcmxmZS5jOiAgVmFyaW91cyBjbGVhbnVwcyBvbiBjb21tZW50cyBhbmQgbmFtZXMuCisKKzIwMDMtMTEtMDcgV29sZmdhbmcgVGFldWJlciA8d29sZmdhbmdfdGFldWJlckBhZ2lsZW50LmNvbT4KKworCSogU3BlY2lmeSBhIGhpc3RvcnkgZmlsZSBhbmQgdGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgZmlsZSB3aXRoIGNvbW1hbmQKKwkqIGxpbmUgb3B0aW9uczsgdXNlIEVESVRPUi9WSVNVQUwgdG8gc2V0IHZpL2VtYWNzIHByZWZlcmVuY2UuCisKKzE5OTktMDktMDMgIENoZXQgUmFtZXkgPGNoZXRAbmlrZS5pbnMuY3dydS5lZHU+CisKKwkqIGZlcC5jOiBNZW1tb3ZlIGlzIG5vdCB1bml2ZXJzYWxseSBhdmFpbGFibGUuICBUaGlzIHBhdGNoIGFzc3VtZXMKKyAJdGhhdCBhbiBhdXRvY29uZiB0ZXN0IGhhcyBiZWVuIHBlcmZvcm1lZCwgYW5kIHRoYXQgbWVtY3B5IGlzCisgCWF2YWlsYWJsZSB3aXRob3V0IGNoZWNraW5nLgorCisJKiBmZXAuYzogVkRJU0NBUkQgaXMgbm90IHVuaXZlcnNhbGx5IGF2YWlsYWJsZSwgZXZlbiB3aGVuIHRlcm1pb3MgaXMuCisKKwkqIGZlcC5jOiBJZiBhIHN5c3RlbSBkb2Vzbid0IGhhdmUgVElPQ1NDVFRZLCB0aGUgZmlyc3QgYG9wZW4nCisgCXBlcmZvcm1lZCBhZnRlciBzZXRzaWQgYWxsb2NhdGVzIGEgY29udHJvbGxpbmcgdGVybWluYWwuICBUaGUKKyAJb3JpZ2luYWwgY29kZSB3b3VsZCBsZWF2ZSB0aGUgY2hpbGQgcHJvY2VzcyBydW5uaW5nIG9uIHRoZSBzbGF2ZSBwdHkKKyAJd2l0aG91dCBhIGNvbnRyb2xsaW5nIHR0eSBpZiBUSU9DU0NUVFkgd2FzIG5vdCBhdmFpbGFibGUuCisKKwkqIGZlcC5jOiBNb3N0IHZlcnNpb25zIG9mIFNWUjQsIGluY2x1ZGluZyBzb2xhcmlzLCBkb24ndCBhbGxvdworCXRlcm1pbmFsIGlvY3RsIGNhbGxzIG9uIHRoZSBtYXN0ZXIgc2lkZSBvZiB0aGUgcHR5LgorCisxOTk5LTA4LTI4ICBQZXIgQm90aG5lciAgPHBlckBib3RobmVyLmNvbT4KKworCSogZmVwLmM6ICBJbml0aWFsIHJlbGVhc2UuCmRpZmYgLS1naXQgYS9yZWFkbGluZS9leGFtcGxlcy9ybGZlL01ha2VmaWxlLmluIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjUzZGVjCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE3NiBAQAorIworIyBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgcmxmZSAKKyMKKyMgU2VlIG1hY2hpbmUgZGVwZW5kYW50IGNvbmZpZy5oIGZvciBtb3JlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyMKKworc3JjZGlyID0gQHNyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworREVTVERJUiA9IAorCisjIFdoZXJlIHRvIGluc3RhbGwgc2NyZWVuLgorCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACisKKyMgZG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSBtYW5kaXIgYW5kIGluZm9kaXIgaW4gZG9jL01ha2VmaWxlLgorYmluZGlyICA9ICQoZXhlY19wcmVmaXgpL2JpbgorCitWRVJTSU9OID0gQFZFUlNJT05ACitTQ1JFRU4gPSBzY3JlZW4tJChWRVJTSU9OKQorCitDQyA9IEBDQ0AKK0NGTEFHUyA9IEBDRkxBR1NACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKKyNMREZMQUdTID0gLUwkKFJFQURMSU5FX0RJUikKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQlMgPSAtbHJlYWRsaW5lIC1saGlzdG9yeSAtbG5jdXJzZXMKKworQ1BQPUBDUFBACitDUFBfREVQRU5EPSQoQ0MpIC1NTQorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKKworQVdLID0gQEFXS0AKKworT1BUSU9OUz0KKyNPUFRJT05TPSAtRERFQlVHCisKK1NIRUxMPS9iaW4vc2gKKworQ0ZJTEVTPQlybGZlLmMgcHR5LmMKK0hGSUxFUz0gZXh0ZXJuLmggb3MuaCBzY3JlZW4uaAorRVhUUkFfRElTVD1jb25maWd1cmUuaW4gY29uZmlndXJlIE1ha2VmaWxlLmluIGNvbmZpZy5oLmluIENoYW5nZUxvZyBSRUFETUUKK09GSUxFUz0JcmxmZS5vIHB0eS5vCisKK2FsbDoJcmxmZQorCitybGZlOiAkKE9GSUxFUykKKwkkKENDKSAkKExERkxBR1MpIC1vICRAICQoT0ZJTEVTKSAkKExJQlMpCisKK3JsZmUtJChWRVJTSU9OKS50YXIuZ3o6CisJdGFyIGN6ZiAkQCAkKENGSUxFUykgJChIRklMRVMpICQoRVhUUkFfRElTVCkKKworLmMubzoKKwkkKENDKSAtYyAtSS4gLUkkKHNyY2RpcikgJChNX0NGTEFHUykgJChERUZTKSAkKE9QVElPTlMpICQoQ0ZMQUdTKSAkPAorCitpbnN0YWxsX2JpbjogLnZlcnNpb24gc2NyZWVuCisJLWlmIFsgLWYgJChERVNURElSKSQoYmluZGlyKS8kKFNDUkVFTikgXSAmJiBbICEgLWYgJChERVNURElSKSQoYmluZGlyKS8kKFNDUkVFTikub2xkIF07IFwKKwkJdGhlbiBtdiAkKERFU1RESVIpJChiaW5kaXIpLyQoU0NSRUVOKSAkKERFU1RESVIpJChiaW5kaXIpLyQoU0NSRUVOKS5vbGQ7IGZpCisJJChJTlNUQUxMX1BST0dSQU0pIHNjcmVlbiAkKERFU1RESVIpJChiaW5kaXIpLyQoU0NSRUVOKQorCS1jaG93biByb290ICQoREVTVERJUikkKGJpbmRpcikvJChTQ1JFRU4pICYmIGNobW9kIDQ3NTUgJChERVNURElSKSQoYmluZGlyKS8kKFNDUkVFTikKKyMgVGhpcyBkb2Vzbid0IHdvcmsgaWYgJChiaW5kaXIpL3NjcmVlbiBpcyBhIHN5bWxpbmsKKwktaWYgWyAtZiAkKERFU1RESVIpJChiaW5kaXIpL3NjcmVlbiBdICYmIFsgISAtZiAkKERFU1RESVIpJChiaW5kaXIpL3NjcmVlbi5vbGQgXTsgdGhlbiBtdiAkKERFU1RESVIpJChiaW5kaXIpL3NjcmVlbiAkKERFU1RESVIpJChiaW5kaXIpL3NjcmVlbi5vbGQ7IGZpCisJcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9zY3JlZW4KKwkoY2QgJChERVNURElSKSQoYmluZGlyKSAmJiBsbiAtc2YgJChTQ1JFRU4pIHNjcmVlbikKKwljcCAkKHNyY2RpcikvdXRmOGVuY29kaW5ncy8/PyAkKERFU1RESVIpJChTQ1JFRU5FTkNPRElOR1MpCisKKwordW5pbnN0YWxsOiAudmVyc2lvbgorCXJtIC1mICQoREVTVERJUikkKGJpbmRpcikvJChTQ1JFRU4pCisJcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9zY3JlZW4KKwktbXYgJChERVNURElSKSQoYmluZGlyKS9zY3JlZW4ub2xkICQoREVTVERJUikkKGJpbmRpcikvc2NyZWVuCisJcm0gLWYgJChERVNURElSKSQoRVRDU0NSRUVOUkMpCisJY2QgZG9jOyAkKE1BS0UpIHVuaW5zdGFsbAorCitzaGFkb3c6CisJbWtkaXIgc2hhZG93OworCWNkIHNoYWRvdzsgbG4gLXMgLi4vKi5bY2hdIC4uLyouaW4gLi4vKi5zaCAuLi9jb25maWd1cmUgLi4vZG9jIC4uL3Rlcm1pbmZvIC4uL2V0YyAuCisJcm0gLWYgc2hhZG93L3Rlcm0uaCBzaGFkb3cvdHR5LmMgc2hhZG93L2NvbW0uaCBzaGFkb3cvb3NkZWYuaAorCWVjaG8gImluc3RhbGwgYWxsIE1ha2VmaWxlcyBhbmQgY29uZmlnOiIgPiBzaGFkb3cvTWFrZWZpbGUKKwllY2hvICIJcm0gLWYgY29uZmlnLmNhY2hlIiA+PiBzaGFkb3cvTWFrZWZpbGUKKwllY2hvICIJc2ggLi9jb25maWd1cmUiID4+IHNoYWRvdy9NYWtlZmlsZQorCit0ZXJtLmg6IHRlcm0uYyB0ZXJtLnNoCisJQVdLPSQoQVdLKSBzcmNkaXI9JChzcmNkaXIpIHNoICQoc3JjZGlyKS90ZXJtLnNoCisKK2ttYXBkZWYuYzogdGVybS5oCisKK3R0eS5jOgl0dHkuc2ggCisJc2ggJChzcmNkaXIpL3R0eS5zaCB0dHkuYworCittb3N0bHljbGVhbjoKKwlybSAtZiAkKE9GSUxFUykgcmxmZSAqLm8KKworY2xlYW4gY2VsYW46IG1vc3RseWNsZWFuCisJcm0gLWYgdHR5LmMgdGVybS5oIGNvbW0uaCBvc2RlZi5oIGttYXBkZWYuYyBjb3JlCisKKyMgRGVsZXRlIGFsbCBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGFyZSBjcmVhdGVkIGJ5IAorIyBjb25maWd1cmluZyBvciBidWlsZGluZyB0aGUgcHJvZ3JhbS4KKyMgYnVpbGRpbmcgb2YgdGVybS5oL2NvbW0uaCByZXF1aXJlcyBhd2suIEtlZXAgaXQgaW4gdGhlIGRpc3RyaWJ1dGlvbgorIyB3ZSBrZWVwIGNvbmZpZy5oLCBhcyB0aGlzIGZpbGUga25vd3Mgd2hlcmUgJ21ha2UgZGlzdCcgZmluZHMgdGhlIEVUQ1NDUkVFTlJDLgorI2Rpc3RjbGVhbjoJbW9zdGx5Y2xlYW4KKyMJcm0gLWYgJChTQ1JFRU4pLnRhciAkKFNDUkVFTikudGFyLmd6CisjCXJtIC1mIGNvbmZpZy5zdGF0dXMgTWFrZWZpbGUKKyMJcm0gLWYgb3NkZWYuaCBkb2MvTWFrZWZpbGUKKworbWFpbnRhaW5lci1jbGVhbjoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIG5vdCBldmVuIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKworCisjIERlbGV0ZSBldmVyeXRoaW5nIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgY2FuIGJlCisjIHJlY29uc3RydWN0ZWQgd2l0aCB0aGlzIE1ha2VmaWxlLgorcmVhbGNsZWFuOiAudmVyc2lvbiBtb3N0bHljbGVhbgorCXJtIC1mICQoU0NSRUVOKS50YXIgJChTQ1JFRU4pLnRhci5negorCXJtIC1mIGNvbmZpZy5zdGF0dXMgTWFrZWZpbGUgZG9jL01ha2VmaWxlCisJcm0gLWYgdHR5LmMgdGVybS5oIGNvbW0uaCBvc2RlZi5oIGttYXBkZWYuYworCXJtIC1mIGNvbmZpZy5oCisJZWNobyAiaW5zdGFsbCBhbGwgTWFrZWZpbGVzIGFuZCBjb25maWc6IiA+IE1ha2VmaWxlCisJZWNobyAiICBzaCAuL2NvbmZpZ3VyZSIgPj4gTWFrZWZpbGUKKwordGFncyBUQUdTOiAkKENGSUxFUykKKwktY3RhZ3MgICAgKi5zaCAkKENGSUxFUykgKi5oCisJLWN0YWdzIC1lICouc2ggJChDRklMRVMpICouaAorCitkaXN0OiAudmVyc2lvbiAkKFNDUkVFTikudGFyLmd6CisKKworIyBQZXJmb3JtIHNlbGYtdGVzdHMgKGlmIGFueSkuCitjaGVjazoKKworY29uZmlnOgorCXJtIC1mIGNvbmZpZy5jYWNoZQorCXNoIC4vY29uZmlndXJlCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisudmVyc2lvbjoKKwlAcmV2PWBzZWQgPCAkKHNyY2RpcikvcGF0Y2hsZXZlbC5oIC1uIC1lICcvI2RlZmluZSBSRVYvcy8jZGVmaW5lIFJFViAgKi8vcCdgOyBcCisJdmVycz1gc2VkIDwgJChzcmNkaXIpL3BhdGNobGV2ZWwuaCAtbiAtZSAnLyNkZWZpbmUgVkVSUy9zLyNkZWZpbmUgVkVSUyAgKi8vcCdgOyBcCisJcGF0PWBzZWQgPCAkKHNyY2RpcikvcGF0Y2hsZXZlbC5oIC1uIC1lICcvI2RlZmluZSBQQVRDSExFVkVML3MvI2RlZmluZSBQQVRDSExFVkVMICAqLy9wJ2A7IFwKKwlpZiBbICIkJHtyZXZ9LiQke3ZlcnN9LiQke3BhdH0iICE9ICIkKFZFUlNJT04pIiBdOyB0aGVuIFwKKwllY2hvICJUaGlzIGRpc3RyaWJ1dGlvbiBpcyBzY3JlZW4tJCR7cmV2fS4kJHt2ZXJzfS4kJHtwYXR9LCBidXQiOyBcCisJZWNobyAidGhlIE1ha2VmaWxlIGlzIGZyb20gJChWRVJTSU9OKS4gUGxlYXNlIHVwZGF0ZSEiOyBleGl0IDE7IGZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworbWRlcGVuZDogJChDRklMRVMpIHRlcm0uaAorCUBybSAtZiBERVBFTkQgOyBcCisJZm9yIGkgaW4gJHtDRklMRVN9IDsgZG8gXAorCSAgZWNobyAiJCRpIiA7IFwKKwkgIGVjaG8gYGVjaG8gIiQkaSIgfCBzZWQgLWUgJ3MvLmMkJC8uby8nYCI6ICQkaSIgYFwKKyAgICAgICAgICAgIGNjIC1FICQkaSB8XAorICAgICAgICAgICAgZ3JlcCAnXiMgLioiXC4vLipcLmgiJyB8XAorICAgICAgICAgICAgKHNvcnQgLXQnIicgLXUgLWsgMiwyIDI+L2Rldi9udWxsIHx8IHNvcnQgLXQnIicgLXUgKzEgLTIpIHxcCisgICAgICAgICAgICBzZWQgLWUgJ3MvLioiXC5cL1woLipcKSIuKi9cMS8nXAorICAgICAgICAgIGAgPj4gREVQRU5EIDsgXAorCWRvbmUKKworZGVwZW5kOiBkZXBlbmQuaW4KKwkuL2NvbmZpZy5zdGF0dXMgfHwgLi9jb25maWd1cmUKKworZGVwZW5kLmluOiAkKENGSUxFUykgdGVybS5oCisJY3AgTWFrZWZpbGUuaW4gTWFrZWZpbGUuaW5+CisJc2VkIC1lICcvXCNcI1wjIERlcGVuZGVuY2llcy9xJyA8IE1ha2VmaWxlLmluID4gdG1wX21ha2UKKwlmb3IgaSBpbiAkKENGSUxFUyk7IGRvIGVjaG8gJCRpOyAkKENQUF9ERVBFTkQpICQkaSA+PiB0bXBfbWFrZTsgZG9uZSAKKwltdiB0bXBfbWFrZSBNYWtlZmlsZS5pbgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyBEZXBlbmRlbmNpZXM6CitwdHkubzogcHR5LmMgY29uZmlnLmgKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2V4YW1wbGVzL3JsZmUvUkVBRE1FIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxZjY4OQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRsaW5lL2V4YW1wbGVzL3JsZmUvUkVBRE1FCkBAIC0wLDAgKzEsNzggQEAKK3JsZmUgKFJlYWRMaW5lIEZyb250LUVuZCkgaXMgYSAidW5pdmVyc2FsIHdyYXBwZXIiIGFyb3VuZCByZWFkbGluZS4KK1lvdSBzcGVjaWZ5IGFuIGludGVyYWN0aXZlIHByb2dyYW0gdG8gcnVuICh0eXBpY2FsbHkgYSBzaGVsbCksIGFuZAorcmVhZGxpbmUgaXMgdXNlZCB0byBlZGl0IGlucHV0IGxpbmVzLgorCitUaGVyZSBhcmUgb3RoZXIgc3VjaCBmcm9udC1lbmRzOyB3aGF0IGRpc3Rpbmd1aXNoZXMgdGhpcyBvbmUgaXMgdGhhdAoraXQgbW9uaXRvcnMgdGhlIHN0YXRlIG9mIHRoZSBpbmZlcmlvciBwdHksIGFuZCBpZiB0aGUgaW5mZXJpb3IgcHJvZ3JhbQorc3dpdGNoZXMgaXRzIHRlcm1pbmFsIHRvIHJhdyBtb2RlLCB0aGVuIHJsZmUgcGFzc2VzIHlvdXIgY2hhcmFjdGVycwordGhyb3VnaCBkaXJlY3RseS4gIFRoaXMgYmFzaWNhbGx5IG1lYW5zIHlvdSBjYW4gcnVuIHlvdXIgZW50aXJlCitzZXNzaW9uIChpbmNsdWRpbmcgYmFzaCBhbmQgdGVybWluYWwtbW9kZSBlbWFjcykgdW5kZXIgcmxmZS4KKworRkVBVFVSRVMKKworKiBDYW4gdXNlIGFsbCByZWFkbGluZSBjb21tYW5kcyAoYW5kIGhpc3RvcnkpIGluIGNvbW1hbmRzIHRoYXQKK3JlYWQgaW5wdXQgbGluZXMgaW4gImNhbm9uaWNhbCBtb2RlIiAtIGV2ZW4gJ2NhdCchCisKKyogQXV0b21hdGljYWxseSBzd2l0Y2hlcyBiZXR3ZWVuICJyZWFkbGluZS1lZGl0aW5nIG1vZGUiIGFuZCAicmF3IG1vZGUiCitkZXBlbmRpbmcgb24gdGhlIHRlcm1pbmFsIG1vZGUuICBJZiB0aGUgaW5mZXJpb3IgcHJvZ3JhbSBpbnZva2VzCityZWFkbGluZSBpdHNlbGYsIGl0IHdpbGwgZG8gaXRzIG93biBsaW5lIGVkaXRpbmcuICAoVGhlIGluZmVyaW9yCityZWFkbGluZSB3aWxsIG5vdCBrbm93IGFib3V0IHJsZmUsIGFuZCBpdCB3aWxsIGhhdmUgaXRzIG93biBoaXN0b3J5LikKK1lvdSBjYW4gZXZlbiBydW4gcHJvZ3JhbXMgbGlrZSAnZW1hdnMgLW53JyBhbmQgJ3ZpJyB1bmRlciBybGZlLgorVGhlIGdvYWwgaXMgeW91IGNvdWxkIGxlYXZlIHJsZmUgYWx3YXlzIG9uIHdpdGhvdXQgZXZlbiBrbm93aW5nCithYm91dCBpdC4gIChXZSdyZSBub3QgcXVpdGUgdGhlcmUsIGJ1dCBpdCB3b3JrcyB0b2xlcmFibHkgd2VsbC4pCisKKyogVGhlIGlucHV0IGxpbmUgKGFmdGVyIGFueSBwcm9tcHQpIGlzIGNoYW5nZWQgdG8gYm9sZC1mYWNlLgorCitJTlNUQUxMCisKK1RoZSB1c3VhbDogLi9jb25maWd1cmUgJiYgbWFrZSAmJiBtYWtlIGluc3RhbGwKKworTm90ZSBzbyBmYXIgcmxmZSBoYXMgb25seSBiZWVuIHRlc3RlZCBvbiBHTlUgTGludXggKEZlZG9yYSBDb3JlIDIpCithbmQgTWFjIE9TIFggKDEwLjMpLgorCitUaGlzIGFzc3VtZXMgcmVhZGxpbmUgaGVhZGVyIGZpbGVzIGFuZCBsaWJyYXJpZXMgYXJlIGluIHRoZSBkZWZhdWx0CitwbGFjZXMuICBJZiBub3QsIHlvdSBjYW4gY3JlYXRlIGEgbGluayBuYW1lZCByZWFkbGluZSBwb2ludGluZyB0byB0aGUKK3JlYWRsaW5lIHNvdXJjZXMuICBUbyBsaW5rIHdpdGggbGlicmVhZGxpbmUuYSBhbmQgbGliaGlzdG9yeS5hCit5b3UgY2FuIGNvcHkgb3IgbGluayB0aGVtLCBvciBhZGQgTERGTEFHUz0nLS9wYXRoL3RvL3JlYWRsaW5lJyB0bwordGhlIG1ha2UgY29tbWFuZC1saW5lLgorCitVU0FHRQorCitKdXN0IHJ1biBpdC4gIFRoYXQgYnkgZGVmYXVsdCBydW5zIGJhc2guICBZb3UgY2FuIHJ1biBzb21lIG90aGVyCitjb21tYW5kIGJ5IGdpdmluZyBpdCBhcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorCitUaGVyZSBhcmUgYSBmZXcgdHdlYWtzOiAgLWggYWxsb3dzIHlvdSB0byBuYW1lIHRoZSBoaXN0b3J5IGZpbGUsCithbmQgLXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGl0cyBzaXplLiAgSXQgZGVmYXVsdCB0byAiZW1hY3MiIG1vZGUsCitidXQgaWYgdGhlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBFRElUT1IgaXMgc2V0IHRvICJ2aSIgdGhhdAorbW9kZSBpcyBjaG9zZW4uCisKK0lTU1VFUworCisqIFRoZSBtb2RlIHN3aXRjaGluZyBkZXBlbmRzIG9uIHRoZSB0ZXJtaW5hbCBtb2RlIHNldCBieSB0aGUgaW5mZXJpb3IKK3Byb2dyYW0uICBUaHVzIHNzaC90ZWxuZXQvc2NyZWVuLXR5cGUgcHJvZ3JhbXMgd2lsbCB0eXBpY2FsbHkgYmUgaW4KK3JhdyBtb2RlLCBzbyBybGZlIHdvbid0IGJlIG11Y2ggdXNlLCBldmVuIGlmIHJlbW90ZSBwcm9ncmFtcyBydW4gaW4KK2Nhbm9uaWNhbCBtb2RlLiAgVGhlIHdvcmstYXJvdW5kIGlzIHRvIHJ1biBybGZlIG9uIHRoZSByZW1vdGUgZW5kLgorCisqIEVjaG8gc3VwcmVzc2lvbiBhbmQgcHJvbXB0IHJlY29nbml0aW9uIGFyZSBzb21ld2hhdCBmcmFnaWxlLgorKEEgcHJvdG9jb2wgc28gdGhhdCB0aGUgby9zIHR0eSBjb2RlIGNhbiByZWxpYWJseSBjb21tdW5pY2F0ZSBpdHMKK3N0YXRlIHRvIHJsZmUgY291bGQgc29sdmUgdGhpcyBwcm9ibGVtLCBhbmQgdGhlIHByZXZpb3VzIG9uZS4pCisKKyogU2VlIHRoZSBpbnRybyB0byBybGZlLmMgZm9yIG1vcmUgbm90ZXMuCisKKyogQXNzdW1lcyBhIFZUMTAwLWNvbXBhdGlibGUgdGVybWluYWwsIHRob3VnaCB0aGF0IGNvdWxkIGJlIGdlbmVyYWxpemVkCitpZiBhbnlib2R5IGNhcmVzLgorCisqIFJlcXVpcmVzIG5jdXJzZXMuCisKKyogSXQgd291bGQgYmUgdXNlZnVsIHRvIGludGVncmF0ZSBybGZlJ3MgbG9naWMgaW4gYSB0ZXJtaW5hbCBlbXVsYXRvci4KK1RoYXQgd291bGQgbWFrZSBpdCBlYXNpZXIgdG8gcmVwb3NpdGlvbiB0aGUgZWRpdCBwb3NpdGlvbiB3aXRoIGEgbW91c2UsCitpbnRlZ3JhdGUgY3V0LWFuZC1wYXN0ZSB3aXRoIHRoZSBzeXN0ZW0gY2xpcGJvYXJkLCBhbmQgbW9yZSByb2J1c3RseQoraGFuZGxlIGVzY2FwZSBzZXF1ZW5jZSBhbmQgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzIG1vcmUgcm9idXN0bHkuCisKK0FVVEhPUgorCitQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPgorCitMSUNFTlNFCisKK0dQTC4KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2V4YW1wbGVzL3JsZmUvY29uZmlnLmguaW4gYi9yZWFkbGluZS9leGFtcGxlcy9ybGZlL2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZmYxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbGluZS9leGFtcGxlcy9ybGZlL2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsMzc1IEBACisvKiBDb3B5cmlnaHQgMjAwNCBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPgorICogQmFzZWQgb24gY29uZmlnLmggZnJvbSBzY3JlZW4tNC4wLjIuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMtMjAwMAorICogICAgICBKdWVyZ2VuIFdlaWdlcnQgKGpud2VpZ2VyQGltbWQ0LmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlKQorICogICAgICBNaWNoYWVsIFNjaHJvZWRlciAobWxzY2hyb2VAaW1tZDQuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGUpCisgKiBDb3B5cmlnaHQgKGMpIDE5ODcgT2xpdmVyIExhdW1hbm4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChzZWUgdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAkSWQkIEZBVQorICovCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglVc2VyIENvbmZpZ3VyYXRpb24gU2VjdGlvbgorICovCisKKworLyogCisgKiBkZWZpbmUgUFRZTU9ERSBpZiB5b3UgZG8gbm90IGxpa2UgdGhlIGRlZmF1bHQgb2YgMDYyMiwgd2hpY2ggYWxsb3dzIAorICogcHVibGljIHdyaXRlIHRvIHlvdXIgcHR5LgorICogZGVmaW5lIFBUWUdST1VQIHRvIHNvbWUgbnVtZXJpY2FsIGdyb3VwLWlkIGlmIHlvdSBkbyBub3Qgd2FudCB0aGUKKyAqIHR0eSB0byBiZSBpbiAieW91ciIgZ3JvdXAuCisgKiBOb3RlLCBzY3JlZW4gaXMgdW5hYmxlIHRvIGNoYW5nZSBtb2RlIG9yIGdyb3VwIG9mIHRoZSBwdHkgaWYgaXQKKyAqIGlzIG5vdCBpbnN0YWxsZWQgd2l0aCBzdWZmaWNpZW50IHByaXZpbGVnZS4gKGUuZy4gc2V0LXVpZC1yb290KQorICogZGVmaW5lIFBUWVJPRlMgaWYgdGhlIC9kZXYvcHR5IGRldmljZXMgYXJlIG1vdW50ZWQgb24gYSByZWFkLW9ubHkgCisgKiBmaWxlc3lzdGVtIHNvIHNjcmVlbiBzaG91bGQgbm90IGV2ZW4gYXR0ZW1wdCB0byBzZXQgbW9kZSBvciBncm91cCAgCisgKiBldmVuIGlmIHJ1bm5pbmcgYXMgcm9vdCAoZS5nLiBvbiBUaVZvKS4KKyAqLworI3VuZGVmIFBUWU1PREUKKyN1bmRlZiBQVFlHUk9VUAorI3VuZGVmIFBUWVJPRlMKKworLyoKKyAqIElmIHNjcmVlbiBpcyBOT1QgaW5zdGFsbGVkIHNldC11aWQgcm9vdCwgc2NyZWVuIGNhbiBwcm92aWRlIHR0eQorICogc2VjdXJpdHkgYnkgZXhjbHVzaXZlbHkgbG9ja2luZyB0aGUgcHR5cy4gIFdoaWxlIHRoaXMga2VlcHMgb3RoZXIKKyAqIHVzZXJzIGZyb20gb3BlbmluZyB5b3VyIHB0eXMsIGl0IGFsc28ga2VlcHMgeW91ciBvd24gc3VicHJvY2Vzc2VzCisgKiBmcm9tIGJlaW5nIGFibGUgdG8gb3BlbiAvZGV2L3R0eS4gIERlZmluZSBMT0NLUFRZIHRvIGFkZCB0aGlzCisgKiBleGNsdXNpdmUgbG9ja2luZy4KKyAqLworI3VuZGVmIExPQ0tQVFkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUVuZCBvZiBVc2VyIENvbmZpZ3VyYXRpb24gU2VjdGlvbgorICoKKyAqICAgICAgUmVzdCBvZiB0aGlzIGZpbGUgaXMgbW9kaWZpZWQgYnkgJ2NvbmZpZ3VyZScKKyAqICAgICAgQ2hhbmdlIGF0IHlvdXIgb3duIHJpc2shCisgKgorICovCisKKy8qCisgKiBTb21lIGRlZmluZXMgdG8gaWRlbnRpZnkgc3BlY2lhbCB1bml4IHZhcmlhbnRzCisgKi8KKyNpZm5kZWYgU1ZSNAorI3VuZGVmIFNWUjQKKyNlbmRpZgorCisjaWZuZGVmIF9QT1NJWF9TT1VSQ0UKKyN1bmRlZiBfUE9TSVhfU09VUkNFCisjZW5kaWYKKworLyoKKyAqIERlZmluZSBQT1NJWCBpZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyBJRUVFIFN0ZCAxMDAzLjEtMTk4OCAoUE9TSVgpLgorICovCisjdW5kZWYgUE9TSVgKKworLyoKKyAqIERlZmluZSBURVJNSU8gaWYgeW91IGhhdmUgc3RydWN0IHRlcm1pbyBpbnN0ZWFkIG9mIHN0cnVjdCBzZ3R0eWIuCisgKiBUaGlzIGlzIHVzdWFsbHkgdGhlIGNhc2UgZm9yIFNWSUQgc3lzdGVtcywgd2hlcmUgQlNEIHVzZXMgc2d0dHliLgorICogUE9TSVggc3lzdGVtcyBzaG91bGQgZGVmaW5lIHRoaXMgYW55d2F5LCBldmVuIHRob3VnaCB0aGV5IHVzZQorICogc3RydWN0IHRlcm1pb3MuCisgKi8KKyN1bmRlZiBURVJNSU8KKworLyoKKyAqIERlZmluZSBDWVRFUk1JTyBpZiB5b3UgaGF2ZSBjeXJpbGxpYyB0ZXJtaW8gbW9kZXMuCisgKi8KKyN1bmRlZiBDWVRFUk1JTworCisvKgorICogRGVmaW5lIFRFUk1JTkZPIGlmIHlvdXIgbWFjaGluZSBlbXVsYXRlcyB0aGUgdGVybWNhcCByb3V0aW5lcworICogd2l0aCB0aGUgdGVybWluZm8gZGF0YWJhc2UuCisgKiBUaHVzIHRoZSAuc2NyZWVucmMgZmlsZSBpcyBwYXJzZWQgZm9yCisgKiB0aGUgY29tbWFuZCAndGVybWluZm8nIGFuZCBub3QgJ3Rlcm1jYXAnLgorICovCisjdW5kZWYgVEVSTUlORk8KKworLyoKKyAqIElmIHlvdXIgbGlicmFyeSBkb2VzIG5vdCBkZWZpbmUgb3NwZWVkLCBkZWZpbmUgdGhpcy4KKyAqLworI3VuZGVmIE5FRURfT1NQRUVECisKKy8qCisgKiBEZWZpbmUgU1lTViBpZiB5b3VyIG1hY2hpbmUgaXMgU1lTViBjb21wbGllbnQgKFN5cyBWLCBIUFVYLCBBL1VYKQorICovCisjaWZuZGVmIFNZU1YKKyN1bmRlZiBTWVNWCisjZW5kaWYKKworLyoKKyAqIERlZmluZSBTSUdWT0lEIGlmIHlvdXIgc2lnbmFsIGhhbmRsZXJzIHJldHVybiB2b2lkLiAgT24gb2xkZXIKKyAqIHN5c3RlbXMsIHNpZ25hbCByZXR1cm5zIGludCwgYnV0IG9uIG5ld2VyIG9uZXMsIGl0IHJldHVybnMgdm9pZC4KKyAqLworI3VuZGVmIFNJR1ZPSUQgCisKKy8qCisgKiBEZWZpbmUgVVNFU0lHU0VUIGlmIHlvdSBoYXZlIHNpZ3NldCBmb3IgQlNEIDQuMSByZWxpYWJsZSBzaWduYWxzLgorICovCisjdW5kZWYgVVNFU0lHU0VUCisKKy8qCisgKiBEZWZpbmUgU1lTVlNJR1MgaWYgc2lnbmFsIGhhbmRsZXJzIG11c3QgYmUgcmVpbnN0YWxsZWQgYWZ0ZXIKKyAqIHRoZXkgaGF2ZSBiZWVuIGNhbGxlZC4KKyAqLworI3VuZGVmIFNZU1ZTSUdTCisKKy8qCisgKiBEZWZpbmUgQlNEV0FJVCBpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIGEgJ3VuaW9uIHdhaXQnIGluIDxzeXMvd2FpdC5oPgorICoKKyAqIE9ubHkgYWxsb3cgQlNEV0FJVCBpLmUuIHdhaXQzIG9uIG5vbnBvc2l4IHN5c3RlbXMsIHNpbmNlCisgKiBwb3NpeCBpbXBsaWVzIHdhaXQoMykgYW5kIHdhaXRwaWQoMykuIHZkbGluZGVuQGZ3aS51dmEubmwKKyAqIAorICovCisjaWZuZGVmIFBPU0lYCisjdW5kZWYgQlNEV0FJVAorI2VuZGlmCisKKy8qCisgKiBPbiBSSVNDT1Mgd2UgcHJlZmVyIHdhaXQyKCkgb3ZlciB3YWl0MygpLiByb3VpbGpAc25pLXVzYS5jb20gCisgKi8KKyNpZmRlZiBCU0RXQUlUCisjdW5kZWYgVVNFX1dBSVQyCisjZW5kaWYKKworLyoKKyAqIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdXRlbXB0ZXIgdXRtcCBoZWxwZXIgcHJvZ3JhbQorICovCisjdW5kZWYgSEFWRV9VVEVNUFRFUgorCisvKgorICogSWYgdHR5c2xvdCgpIGJyZWFrcyBnZXRsb2dpbigpIGJ5IHJldHVybmluZyBpbmRleGVzIHRvIHV0bXAgZW50cmllcworICogb2YgdHlwZSBERUFEX1BST0NFU1MsIHRoZW4gb3VyIGdldGxvZ2luKCkgcmVwbGFjZW1lbnQgc2hvdWxkIGJlCisgKiBzZWxlY3RlZCBieSBkZWZpbmluZyBCVUdHWUdFVExPR0lOLgorICovCisjdW5kZWYgQlVHR1lHRVRMT0dJTgorCisvKgorICogSWYgeW91ciBzeXN0ZW0gaGFzIHRoZSBjYWxscyBzZXRyZXVpZCgpIGFuZCBzZXRyZWdpZCgpLAorICogZGVmaW5lIEhBVkVfU0VUUkVVSUQuIE90aGVyd2lzZSBzY3JlZW4gd2lsbCB1c2UgYSBmb3JrZWQgcHJvY2VzcyB0bworICogc2FmZWx5IGNyZWF0ZSBvdXRwdXQgZmlsZXMgd2l0aG91dCByZXRhaW5pbmcgYW55IHNwZWNpYWwgcHJpdmlsZWdlcy4KKyAqLworI3VuZGVmIEhBVkVfU0VUUkVVSUQKKworLyoKKyAqIElmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIEJTRDQuNCdzIHNldGV1aWQoKSBhbmQgc2V0ZWdpZCgpLCBkZWZpbmUKKyAqIEhBVkVfU0VURVVJRC4KKyAqLworI3VuZGVmIEhBVkVfU0VURVVJRAorCisvKgorICogSWYgeW91IHdhbnQgdGhlICJ0aW1lIiBjb21tYW5kIHRvIGRpc3BsYXkgdGhlIGN1cnJlbnQgbG9hZCBhdmVyYWdlCisgKiBkZWZpbmUgTE9BREFWLiBNYXliZSB5b3UgbXVzdCBpbnN0YWxsIHNjcmVlbiB3aXRoIHRoZSBuZWVkZWQKKyAqIHByaXZpbGVnZXMgdG8gcmVhZCAvZGV2L2ttZW0uCisgKiBOb3RlIHRoYXQgTkxJU1RfIHN0dWZmIGlzIG9ubHkgY2hlY2tlZCwgd2hlbiBnZXRsb2FkYXZnKCkgaXMgbm90IGF2YWlsYWJsZS4KKyAqLworI3VuZGVmIExPQURBVgorCisjdW5kZWYgTE9BREFWX05VTQorI3VuZGVmIExPQURBVl9UWVBFCisjdW5kZWYgTE9BREFWX1NDQUxFCisjdW5kZWYgTE9BREFWX0dFVExPQURBVkcKKyN1bmRlZiBMT0FEQVZfVU5JWAorI3VuZGVmIExPQURBVl9BVkVOUlVOCisjdW5kZWYgTE9BREFWX1VTRV9OTElTVDY0CisKKyN1bmRlZiBOTElTVF9ERUNMQVJFRAorI3VuZGVmIE5MSVNUX1NUUlVDVAorI3VuZGVmIE5MSVNUX05BTUVfVU5JT04KKworLyoKKyAqIElmIHlvdXIgc3lzdGVtIGhhcyB0aGUgbmV3IGZvcm1hdCAvZXRjL3R0eXMgKGxpa2UgNC4zIEJTRCkgYW5kIHRoZQorICogZ2V0dHR5ZW50KDMpIGxpYnJhcnkgZnVuY3Rpb25zLCBkZWZpbmUgR0VUVFRZRU5ULgorICovCisjdW5kZWYgR0VUVFRZRU5UCisKKy8qCisgKiBEZWZpbmUgVVNFQkNPUFkgaWYgdGhlIGJjb3B5L21lbWNweSBmcm9tIHlvdXIgc3lzdGVtJ3MgQyBsaWJyYXJ5CisgKiBzdXBwb3J0cyB0aGUgb3ZlcmxhcHBpbmcgb2Ygc291cmNlIGFuZCBkZXN0aW5hdGlvbiBibG9ja3MuICBXaGVuCisgKiB1bmRlZmluZWQsIHNjcmVlbiB1c2VzIGl0cyBvd24gKHByb2JhYmx5IHNsb3dlcikgdmVyc2lvbiBvZiBiY29weSgpLgorICogCisgKiBTWVNWIG1hY2hpbmVzIG1heSBoYXZlIGEgd29ya2luZyBtZW1jcHkoKSAtLSBPaCwgdGhpcyBpcyAKKyAqIHF1aXRlIHVubGlrZWx5LiBUZWxsIG1lIGlmIHlvdSBzZWUgb25lLgorICogIkJ1dCB0aGVuLCBtZW1tb3ZlKCkgc2hvdWxkIHdvcmssIGlmIGF0IGFsbCBhdmFpbGFibGUiIGhlIHRob3VnaHQuLi4KKyAqIEJvaW5nLCBuZXZlciBzYXkgIndvcmtzIGV2ZXJ5d2hlcmUiIHVubGVzcyB5b3UgY2hlY2tlZCBTQ08gVU5JWC4KKyAqIFRoZWlyIG1lbW92ZSBmYWlscyB0aGUgdGVzdCBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4gU2lnaC4gKEp1ZXJnZW4pCisgKi8KKyN1bmRlZiBVU0VCQ09QWQorI3VuZGVmIFVTRU1FTUNQWQorI3VuZGVmIFVTRU1FTU1PVkUKKworLyoKKyAqIElmIHlvdXIgc3lzdGVtIGhhcyB2c3ByaW50ZigpIGFuZCByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBtYWNyb3MgaW4KKyAqICJ2YXJhcmdzLmgiIHRvIHVzZSBmdW5jdGlvbnMgd2l0aCB2YXJpYWJsZSBhcmd1bWVudHMsCisgKiBkZWZpbmUgVVNFVkFSQVJHUy4KKyAqLworI3VuZGVmIFVTRVZBUkFSR1MKKworLyoKKyAqIElmIHlvdXIgc3lzdGVtIGhhcyBzdHJlcnJvcigpIGRlZmluZSB0aGlzLgorICovCisjdW5kZWYgSEFWRV9TVFJFUlJPUgorCisvKgorICogSWYgdGhlIHNlbGVjdCByZXR1cm4gdmFsdWUgZG9lc24ndCB0cmVhdCBhIGRlc2NyaXB0b3IgdGhhdCBpcworICogdXNhYmxlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGFzIHR3byBoaXRzLCBkZWZpbmUgU0VMRUNUX0JST0tFTi4KKyAqLworI3VuZGVmIFNFTEVDVF9CUk9LRU4KKworLyoKKyAqIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIG5hbWVkIHBpcGVzLgorICovCisjdW5kZWYgTkFNRURQSVBFCisKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBleGl0cyBzZWxlY3QoKSBpbW1lZGlhdGx5IGlmIGEgcGlwZSBpcworICogb3BlbmVkIHJlYWQtb25seSBhbmQgbm8gd3JpdGVyIGhhcyBvcGVuZWQgaXQuCisgKi8KKyN1bmRlZiBCUk9LRU5fUElQRQorCisvKgorICogRGVmaW5lIHRoaXMgaWYgdGhlIHVuaXgtZG9tYWluIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0CisgKiBjcmVhdGUgYSBzb2NrZXQgaW4gdGhlIGZpbGVzeXN0ZW0uCisgKi8KKyN1bmRlZiBTT0NLX05PVF9JTl9GUworCisvKgorICogSWYgeW91ciBzeXN0ZW0gaGFzIHNldGVudigpIGFuZCB1bnNldGVudigpIGRlZmluZSBVU0VTRVRFTlYKKyAqLworI3VuZGVmIFVTRVNFVEVOVgorCisvKgorICogSWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgY29tZSB3aXRoIGEgc2V0ZW52KCkvcHV0ZW52KCkvZ2V0ZW52KCkKKyAqIGZ1bmN0aW9ucywgeW91IG1heSBicmluZyBpbiBvdXIgb3duIGNvZGUgYnkgZGVmaW5pbmcgTkVFRFBVVEVOVi4KKyAqLworI3VuZGVmIE5FRURQVVRFTlYKKworLyoKKyAqIElmIHRoZSBwYXNzd29yZHMgYXJlIHN0b3JlZCBpbiBhIHNoYWRvdyBmaWxlIGFuZCB5b3Ugd2FudCB0aGUKKyAqIGJ1aWx0aW4gbG9jayB0byB3b3JrIHByb3Blcmx5LCBkZWZpbmUgU0hBRE9XUFcuCisgKi8KKyN1bmRlZiBTSEFET1dQVworCisvKgorICogSWYgeW91IGFyZSBvbiBhIFNZUyBWIG1hY2hpbmUgdGhhdCByZXN0cmljdHMgZmlsZW5hbWUgbGVuZ3RoIHRvIDE0IAorICogY2hhcmFjdGVycywgeW91IG1heSBuZWVkIHRvIGVuZm9yY2UgdGhhdCBieSBzZXR0aW5nIE5BTUVfTUFYIHRvIDE0CisgKi8KKyN1bmRlZiBOQU1FX01BWAkJLyogS0VFUF9VTkRFRl9IRVJFIG92ZXJyaWRlIHN5c3RlbSB2YWx1ZSAqLworI3VuZGVmIE5BTUVfTUFYCisKKy8qCisgKiBkZWZpbmUgSEFWRV9SRU5BTUUgaWYgeW91ciBzeXN0ZW0gaGFzIGEgcmVuYW1lKCkgZnVuY3Rpb24KKyAqLworI3VuZGVmIEhBVkVfUkVOQU1FCisKKy8qCisgKiBkZWZpbmUgSEFWRV9fRVhJVCBpZiB5b3VyIHN5c3RlbSBoYXMgdGhlIF9leGl0KCkgY2FsbC4KKyAqLworI3VuZGVmIEhBVkVfX0VYSVQKKworLyoKKyAqIGRlZmluZSBIQVZFX0xTVEFUIGlmIHlvdXIgc3lzdGVtIGhhcyBzeW1saW5rcyBhbmQgdGhlIGxzdGF0KCkgY2FsbC4KKyAqLworI3VuZGVmIEhBVkVfTFNUQVQKKworLyoKKyAqIGRlZmluZSBIQVZFX1VUSU1FUyBpZiB5b3VyIHN5c3RlbSBoYXMgdGhlIHV0aW1lcygpIGNhbGwuCisgKi8KKyN1bmRlZiBIQVZFX1VUSU1FUworCisvKgorICogZGVmaW5lIEhBVkVfRkNIT1dOIGlmIHlvdXIgc3lzdGVtIGhhcyB0aGUgZmNob3duKCkgY2FsbC4KKyAqLworI3VuZGVmIEhBVkVfRkNIT1dOCisKKy8qCisgKiBkZWZpbmUgSEFWRV9GQ0hNT0QgaWYgeW91ciBzeXN0ZW0gaGFzIHRoZSBmY2htb2QoKSBjYWxsLgorICovCisjdW5kZWYgSEFWRV9GQ0hNT0QKKworLyoKKyAqIGRlZmluZSBIQVZFX1ZTTlBSSU5URiBpZiB5b3VyIHN5c3RlbSBoYXMgdnNucHJpbnRmKCkgKEdOVSBsaWIpLgorICovCisjdW5kZWYgSEFWRV9WU05QUklOVEYKKworLyoKKyAqIGRlZmluZSBIQVZFX0dFVENXRCBpZiB5b3VyIHN5c3RlbSBoYXMgdGhlIGdldGN3ZCgpIGNhbGwuCisgKi8KKyN1bmRlZiBIQVZFX0dFVENXRAorCisvKgorICogZGVmaW5lIEhBVkVfU0VUTE9DQUxFIGlmIHlvdXIgc3lzdGVtIGhhcyB0aGUgc2V0bG9jYWxlKCkgY2FsbC4KKyAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qCisgKiBkZWZpbmUgSEFWRV9TVFJGVElNRSBpZiB5b3VyIHN5c3RlbSBoYXMgdGhlIHN0cmZ0aW1lKCkgY2FsbC4KKyAqLworI3VuZGVmIEhBVkVfU1RSRlRJTUUKKworLyoKKyAqIGRlZmluZSBIQVZFX05MX0xBTkdJTkZPIGlmIHlvdXIgc3lzdGVtIGhhcyB0aGUgbmxfbGFuZ2luZm8oKSBjYWxsCisgKiBhbmQgPGxhbmdpbmZvLmg+IGRlZmluZXMgQ09ERVNFVC4KKyAqLworI3VuZGVmIEhBVkVfTkxfTEFOR0lORk8KKworLyoKKyAqIE5ld2VyIHZlcnNpb25zIG9mIFNvbGFyaXMgaW5jbHVkZSBmZHdhbGssIHdoaWNoIGNhbiBncmVhdGx5IGltcHJvdmUKKyAqIHRoZSBzdGFydHVwIHRpbWUgb2Ygc2NyZWVuOyBvdGhlcndpc2Ugc2NyZWVuIHNwZW5kcyBhIGxvdCBvZiB0aW1lCisgKiBjbG9zaW5nIGZpbGUgZGVzY3JpcHRvcnMuCisgKi8KKyN1bmRlZiBIQVZFX0ZEV0FMSworCisvKgorICogZGVmaW5lIEhBVkVfREVWX1BUQyBpZiB5b3UgaGF2ZSBhIC9kZXYvcHRjIGNoYXJhY3RlciBzcGVjaWFsCisgKiBkZXZpY2UuCisgKi8KKyN1bmRlZiBIQVZFX0RFVl9QVEMKKworLyoKKyAqIGRlZmluZSBIQVZFX1NWUjRfUFRZUyBpZiB5b3UgaGF2ZSBhIC9kZXYvcHRteCBjaGFyYWN0ZXIgc3BlY2lhbAorICogZGV2aWNlIGFuZCBzdXBwb3J0IHRoZSBwdHNuYW1lKCksIGdyYW50cHQoKSwgdW5sb2NrcHQoKSBmdW5jdGlvbnMuCisgKi8KKyN1bmRlZiBIQVZFX1NWUjRfUFRZUworCisvKgorICogZGVmaW5lIEhBVkVfR0VUUFQgaWYgeW91IGhhdmUgdGhlIGdldHB0KCkgZnVuY3Rpb24uCisgKi8KKyN1bmRlZiBIQVZFX0dFVFBUCisKKy8qCisgKiBkZWZpbmUgSEFWRV9PUEVOUFRZIGlmIHlvdXIgc3lzdGVtIGhhcyB0aGUgb3BlbnB0eSgpIGNhbGwuCisgKi8KKyN1bmRlZiBIQVZFX09QRU5QVFkKKworLyogCisgKiBkZWZpbmUgUFRZUkFOR0UwIGFuZCBvciBQVFlSQU5HRTEgaWYgeW91IHdhbnQgdG8gYWRhcHQgc2NyZWVuCisgKiB0byB1bnVzdWFsIGVudmlyb25tZW50cy4gRS5nLiBGb3IgU3VuT3MgdGhlIGRlZmF1bHRzIGFyZSAicXByIiBhbmQgCisgKiAiMDEyMzQ1Njc4OWFiY2RlZiIuIEZvciBTdW5PcyA0LjEuMiAKKyAqICNkZWZpbmUgUFRZUkFOR0UwICJwcXJzdHV2d3h5elBRUlNUIiAKKyAqIGlzIHJlY29tbWVuZGVkIGJ5IERhbiBKYWNvYnNvbi4KKyAqLworI3VuZGVmIFBUWVJBTkdFMAorI3VuZGVmIFBUWVJBTkdFMQorCisjZGVmaW5lIFVTRVZBUkFSR1MKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2V4YW1wbGVzL3JsZmUvY29uZmlndXJlIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmE4MjAyNgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRsaW5lL2V4YW1wbGVzL3JsZmUvY29uZmlndXJlCkBAIC0wLDAgKzEsNTQwMCBAQAorIyEgL2Jpbi9zaAorIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkuCisjCisjIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKworIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCiskYXNfdW5zZXQgRU5WIE1BSUwgTUFJTFBBVEgKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorZm9yIGFzX3ZhciBpbiBcCisgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCisgIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCisgIExDX1RFTEVQSE9ORSBMQ19USU1FCitkbworICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgorICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgorICBlbHNlCisgICAgJGFzX3Vuc2V0ICRhc192YXIKKyAgZmkKK2RvbmUKKworIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworCisjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCithc19tZT1gJGFzX2Jhc2VuYW1lICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKSQnIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorCisKKyMgUEFUSCBuZWVkcyBDUiwgYW5kIExJTkVOTyBuZWVkcyBDUiBhbmQgUEFUSC4KKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAgfHwgeworICAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBwYXRoIGF0IGFsbAorICAjIHJlbGF0aXZlIG9yIG5vdC4KKyAgY2FzZSAkMCBpbgorICAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCitkb25lCisKKyAgICAgICA7OworICBlc2FjCisgICMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyAgIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCisgIGlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgICBhc19teXNlbGY9JDAKKyAgZmkKKyAgaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIHBhdGgiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCisgIGNhc2UgJENPTkZJR19TSEVMTCBpbgorICAnJykKKyAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgY2FzZSAkYXNfZGlyIGluCisJIC8qKQorCSAgIGlmICgiJGFzX2Rpci8kYXNfYmFzZSIgLWMgJworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICcpIDI+L2Rldi9udWxsOyB0aGVuCisJICAgICAkYXNfdW5zZXQgQkFTSF9FTlYgfHwgdGVzdCAiJHtCQVNIX0VOVitzZXR9IiAhPSBzZXQgfHwgeyBCQVNIX0VOVj07IGV4cG9ydCBCQVNIX0VOVjsgfQorCSAgICAgJGFzX3Vuc2V0IEVOViB8fCB0ZXN0ICIke0VOVitzZXR9IiAhPSBzZXQgfHwgeyBFTlY9OyBleHBvcnQgRU5WOyB9CisJICAgICBDT05GSUdfU0hFTEw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAkezErIiRAIn0KKwkgICBmaTs7CisJIGVzYWMKKyAgICAgICBkb25lCitkb25lCis7OworICBlc2FjCisKKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBiZWZvcmUgZWFjaCBsaW5lOyB0aGUgc2Vjb25kICdzZWQnIGRvZXMgdGhlIHJlYWwKKyAgIyB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoIGxpbmUtbnVtYmVyIGxpbmUKKyAgIyB3aXRoIHRoZSBudW1iZXJlZCBsaW5lLCBhbmQgYXBwZW5kcyB0cmFpbGluZyAnLScgZHVyaW5nCisgICMgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsIGNhc2UgYXQgbGluZSBlbmQuCisgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAnPScgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBOCisgICAgICBzLCQsLSwKKyAgICAgIDogbG9vcAorICAgICAgcyxeXChbJyRhc19jcl9kaWdpdHMnXSpcKVwoLipcKVskXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dXCksXDFcMlwxXDMsCisgICAgICB0IGxvb3AKKyAgICAgIHMsLSQsLAorICAgICAgcyxeWyckYXNfY3JfZGlnaXRzJ10qXG4sLAorICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggJGFzX21lLmxpbmVubyB8fAorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaWJsZSB0byB0aGlzKS4KKyAgLiAuLyRhc19tZS5saW5lbm8KKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworCitjYXNlIGBlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzYCxgZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzYCBpbgorICAqYyosLW4qKSBFQ0hPX049IEVDSE9fQz0nCisnIEVDSE9fVD0nCScgOzsKKyAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gRUNIT19UPSA7OworICAqKSAgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIEVDSE9fVD0gOzsKK2VzYWMKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitlY2hvID5jb25mJCQuZmlsZQoraWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICMgV2UgY291bGQganVzdCBjaGVjayBmb3IgREpHUFA7IGJ1dCB0aGlzIHRlc3QgYSkgd29ya3MgYikgaXMgbW9yZSBnZW5lcmljCisgICMgYW5kIGMpIHdpbGwgcmVtYWluIHZhbGlkIG9uY2UgREpHUFAgc3VwcG9ydHMgc3ltbGlua3MgKERKR1BQIDIuMDQpLgorICBpZiB0ZXN0IC1mIGNvbmYkJC5leGU7IHRoZW4KKyAgICAjIERvbid0IHVzZSBsbiBhdCBhbGw7IHdlIGRvbid0IGhhdmUgYW55IGxpbmtzCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsc2UKKyAgICBhc19sbl9zPSdsbiAtcycKKyAgZmkKK2VsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2xuX3M9bG4KK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPToKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworYXNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuCithc19ubD0nCisnCitJRlM9IiAJJGFzX25sIgorCisjIENEUEFUSC4KKyRhc191bnNldCBDRFBBVEgKKworCisjIE5hbWUgb2YgdGhlIGhvc3QuCisjIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBMaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAorIyBzbyB1bmFtZSBnZXRzIHJ1biB0b28uCithY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKworZXhlYyA2PiYxCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY29uZmlnX2xpYm9ial9kaXI9LgorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorIyBUaGlzIHZhcmlhYmxlIHNlZW1zIG9ic29sZXRlLiAgSXQgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQsIGFuZAorIyBvbmx5IGFjX21heF9zZWRfbGluZXMgc2hvdWxkIGJlIHVzZWQuCis6ICR7YWNfbWF4X2hlcmVfbGluZXM9Mzh9CisKKyMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgorUEFDS0FHRV9OQU1FPQorUEFDS0FHRV9UQVJOQU1FPQorUEFDS0FHRV9WRVJTSU9OPQorUEFDS0FHRV9TVFJJTkc9CitQQUNLQUdFX0JVR1JFUE9SVD0KKworYWNfdW5pcXVlX2ZpbGU9InJsZmUuYyIKK2FjX3N1YnN0X3ZhcnM9J1NIRUxMIFBBVEhfU0VQQVJBVE9SIFBBQ0tBR0VfTkFNRSBQQUNLQUdFX1RBUk5BTUUgUEFDS0FHRV9WRVJTSU9OIFBBQ0tBR0VfU1RSSU5HIFBBQ0tBR0VfQlVHUkVQT1JUIGV4ZWNfcHJlZml4IHByZWZpeCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpciBidWlsZF9hbGlhcyBob3N0X2FsaWFzIHRhcmdldF9hbGlhcyBERUZTIEVDSE9fQyBFQ0hPX04gRUNIT19UIExJQlMgVkVSU0lPTiBDQyBDRkxBR1MgTERGTEFHUyBDUFBGTEFHUyBhY19jdF9DQyBFWEVFWFQgT0JKRVhUIENQUCBFR1JFUCBBV0sgV1JJVEVQQVRIIFhURVJNUEFUSCBMSUJPQkpTIExUTElCT0JKUycKK2FjX3N1YnN0X2ZpbGVzPScnCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KK2FjX2luaXRfaGVscD0KK2FjX2luaXRfdmVyc2lvbj1mYWxzZQorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2NhY2hlX2ZpbGU9L2Rldi9udWxsCitleGVjX3ByZWZpeD1OT05FCitub19jcmVhdGU9Citub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCisKKyMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgorIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCisjIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAorIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgorIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBhY19vcHRhcmc9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4W149XSo9XCguKlwpJ2AKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgJGFjX29wdGlvbiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7CisKKyAgLS1jb25maWctY2FjaGUgfCAtQykKKyAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi1fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZSB8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyRhY19mZWF0dXJlPW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgJGFjX29wdGlvbiBpbgorICAgICAgKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyRhY19mZWF0dXJlPSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKKyAgICBhY19pbml0X2hlbHA9bG9uZyA7OworICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCisgICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OworICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCisgICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9JGFjX29wdGFyZyA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQorICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi1fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICRhY19vcHRpb24gaW4KKyAgICAgICo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJGFjX3BhY2thZ2U9JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2UgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJGFjX3BhY2thZ2U9bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKKworICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkYWNfb3B0aW9uCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICA7OworCisgICo9KikKKyAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfZW52dmFyIiA6ICIuKlteXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YXJpYWJsZSBuYW1lOiAkYWNfZW52dmFyIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAKKyAgICBldmFsICIkYWNfZW52dmFyPSckYWNfb3B0YXJnJyIKKyAgICBleHBvcnQgJGFjX2VudnZhciA7OworCisgICopCisgICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgorICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCisgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKKyAgICA6ICR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259CisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgcGF0aHMuCitmb3IgYWNfdmFyIGluIGV4ZWNfcHJlZml4IHByZWZpeAorZG8KKyAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiB8IE5PTkUgfCAnJyApIDs7CisgICAgKikgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIHBhdGhzLgorZm9yIGFjX3ZhciBpbiBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBcCisJICAgICAgbG9jYWxzdGF0ZWRpciBsaWJkaXIgaW5jbHVkZWRpciBvbGRpbmNsdWRlZGlyIGluZm9kaXIgbWFuZGlyCitkbworICBldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKKyAgICAqKSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIGVzYWMKK2RvbmUKKworIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitidWlsZD0kYnVpbGRfYWxpYXMKK2hvc3Q9JGhvc3RfYWxpYXMKK3RhcmdldD0kdGFyZ2V0X2FsaWFzCisKKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2lmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgorICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKKyAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCisgICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQuIiA+JjIKKyAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKKyAgZmkKK2ZpCisKK2FjX3Rvb2xfcHJlZml4PQordGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQorCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIDY+L2Rldi9udWxsCisKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX2NvbmZkaXI9YChkaXJuYW1lICIkMCIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiQwIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJDAiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRhY19jb25mZGlyIG9yIC4uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBlbHNlCisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCitmaQorKGNkICRzcmNkaXIgJiYgdGVzdCAtciAuLyRhY191bmlxdWVfZmlsZSkgMj4vZGV2L251bGwgfHwKKyAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorc3JjZGlyPWBlY2hvICIkc3JjZGlyIiB8IHNlZCAncyVcKFteXFwvXVwpW1xcL10qJCVcMSUnYAorYWNfZW52X2J1aWxkX2FsaWFzX3NldD0ke2J1aWxkX2FsaWFzK3NldH0KK2FjX2Vudl9idWlsZF9hbGlhc192YWx1ZT0kYnVpbGRfYWxpYXMKK2FjX2N2X2Vudl9idWlsZF9hbGlhc19zZXQ9JHtidWlsZF9hbGlhcytzZXR9CithY19jdl9lbnZfYnVpbGRfYWxpYXNfdmFsdWU9JGJ1aWxkX2FsaWFzCithY19lbnZfaG9zdF9hbGlhc19zZXQ9JHtob3N0X2FsaWFzK3NldH0KK2FjX2Vudl9ob3N0X2FsaWFzX3ZhbHVlPSRob3N0X2FsaWFzCithY19jdl9lbnZfaG9zdF9hbGlhc19zZXQ9JHtob3N0X2FsaWFzK3NldH0KK2FjX2N2X2Vudl9ob3N0X2FsaWFzX3ZhbHVlPSRob3N0X2FsaWFzCithY19lbnZfdGFyZ2V0X2FsaWFzX3NldD0ke3RhcmdldF9hbGlhcytzZXR9CithY19lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPSR0YXJnZXRfYWxpYXMKK2FjX2N2X2Vudl90YXJnZXRfYWxpYXNfc2V0PSR7dGFyZ2V0X2FsaWFzK3NldH0KK2FjX2N2X2Vudl90YXJnZXRfYWxpYXNfdmFsdWU9JHRhcmdldF9hbGlhcworYWNfZW52X0NDX3NldD0ke0NDK3NldH0KK2FjX2Vudl9DQ192YWx1ZT0kQ0MKK2FjX2N2X2Vudl9DQ19zZXQ9JHtDQytzZXR9CithY19jdl9lbnZfQ0NfdmFsdWU9JENDCithY19lbnZfQ0ZMQUdTX3NldD0ke0NGTEFHUytzZXR9CithY19lbnZfQ0ZMQUdTX3ZhbHVlPSRDRkxBR1MKK2FjX2N2X2Vudl9DRkxBR1Nfc2V0PSR7Q0ZMQUdTK3NldH0KK2FjX2N2X2Vudl9DRkxBR1NfdmFsdWU9JENGTEFHUworYWNfZW52X0xERkxBR1Nfc2V0PSR7TERGTEFHUytzZXR9CithY19lbnZfTERGTEFHU192YWx1ZT0kTERGTEFHUworYWNfY3ZfZW52X0xERkxBR1Nfc2V0PSR7TERGTEFHUytzZXR9CithY19jdl9lbnZfTERGTEFHU192YWx1ZT0kTERGTEFHUworYWNfZW52X0NQUEZMQUdTX3NldD0ke0NQUEZMQUdTK3NldH0KK2FjX2Vudl9DUFBGTEFHU192YWx1ZT0kQ1BQRkxBR1MKK2FjX2N2X2Vudl9DUFBGTEFHU19zZXQ9JHtDUFBGTEFHUytzZXR9CithY19jdl9lbnZfQ1BQRkxBR1NfdmFsdWU9JENQUEZMQUdTCithY19lbnZfQ1BQX3NldD0ke0NQUCtzZXR9CithY19lbnZfQ1BQX3ZhbHVlPSRDUFAKK2FjX2N2X2Vudl9DUFBfc2V0PSR7Q1BQK3NldH0KK2FjX2N2X2Vudl9DUFBfdmFsdWU9JENQUAorCisjCisjIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCisjCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgorICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICBjYXQgPDxfQUNFT0YKK1xgY29uZmlndXJlJyBjb25maWd1cmVzIHRoaXMgcGFja2FnZSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCisgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCisgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQorCitfQUNFT0YKKworICBjYXQgPDxfQUNFT0YKK0luc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisJCQkgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisJCQkgIFtQUkVGSVhdCisKK0J5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgorXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKK2FuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCitmb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgorCitGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KKworRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1iaW5kaXI9RElSICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtQUkVGSVgvbWFuXQorX0FDRU9GCisKKyAgY2F0IDw8XF9BQ0VPRgorX0FDRU9GCitmaQorCitpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorCisgIGNhdCA8PFxfQUNFT0YKKworT3B0aW9uYWwgUGFja2FnZXM6CisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0td2l0aC1wdHktbW9kZT1tb2RlICAgIGRlZmF1bHQgbW9kZSBmb3IgcHR5cworICAtLXdpdGgtcHR5LWdyb3VwPWdyb3VwICBkZWZhdWx0IGdyb3VwIGZvciBwdHlzCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBDUFBGTEFHUyAgICBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmIHlvdSBoYXZlCisgICAgICAgICAgICAgIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorCitVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAoraXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgYWNfcG9wZGlyPWBwd2RgCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAkYWNfZGlyIHx8IGNvbnRpbnVlCisgICAgYWNfYnVpbGRkaXI9LgorCitpZiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKKyAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLi4vLGcnYAorZWxzZQorICBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXI9CitmaQorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KKyAgICAgICBhY190b3Bfc3JjZGlyPS4KKyAgICBlbHNlCisgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAorICAgIGZpIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyIDs7Citlc2FjCisKKyMgRG8gbm90IHVzZSBgY2QgZm9vICYmIHB3ZGAgdG8gY29tcHV0ZSBhYnNvbHV0ZSBwYXRocywgYmVjYXVzZQorIyB0aGUgZGlyZWN0b3JpZXMgbWF5IG5vdCBleGlzdC4KK2Nhc2UgYHB3ZGAgaW4KKy4pIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworKikKKyAgY2FzZSAiJGFjX2RpciIgaW4KKyAgLikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyAgKikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgLyIkYWNfZGlyIjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworKikKKyAgY2FzZSAke2FjX3RvcF9idWlsZGRpcn0uIGluCisgIC4pIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgKikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyLyR7YWNfdG9wX2J1aWxkZGlyfS47OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3NyY2RpciBpbgorICAuKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisgICopIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3RvcF9zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworICAqKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY190b3Bfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCisKKyAgICBjZCAkYWNfZGlyCisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KKyAgICBpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmdudTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlLmdudSAgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlICAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmFjIHx8CisJICAgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgorICAgICAgZWNobworICAgICAgJGFjX2NvbmZpZ3VyZSAtLWhlbHAKKyAgICBlbHNlCisgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkKKyAgICBjZCAkYWNfcG9wZGlyCisgIGRvbmUKK2ZpCisKK3Rlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgMAoraWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgorICBjYXQgPDxcX0FDRU9GCisKK0NvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCitfQUNFT0YKKyAgZXhpdCAwCitmaQorZXhlYyA1PmNvbmZpZy5sb2cKK2NhdCA+JjUgPDxfQUNFT0YKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorCitJdCB3YXMgY3JlYXRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgJCAkMCAkQAorCitfQUNFT0YKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAoraG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGVjaG8gIlBBVEg6ICRhc19kaXIiCitkb25lCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX3NlcD0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9cIlwnXSopCisgICAgICBhY19hcmc9YGVjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhY19jb25maWd1cmVfYXJnczA9IiRhY19jb25maWd1cmVfYXJnczAgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhY19jb25maWd1cmVfYXJnczE9IiRhY19jb25maWd1cmVfYXJnczEgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MkYWNfc2VwJyRhY19hcmcnIgorICAgICAgIyBHZXQgcmlkIG9mIHRoZSBsZWFkaW5nIHNwYWNlLgorICAgICAgYWNfc2VwPSIgIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKK2RvbmUKKyRhc191bnNldCBhY19jb25maWd1cmVfYXJnczAgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczArc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MwPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMDsgfQorJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMSB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMStzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczE9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MxOyB9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogQmUgc3VyZSBub3QgdG8gdXNlIHNpbmdsZSBxdW90ZXMgaW4gdGhlcmUsIGFzIHNvbWUgc2hlbGxzLAorIyBzdWNoIGFzIG91ciBEVSA1LjAgZnJpZW5kLCB3aWxsIHRoZW4gYGNsb3NlJyB0aGUgdHJhcC4KK3RyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgorICB7CisgICAgZWNobworCisgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgZWNobworICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCit7CisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgYChhY19zcGFjZT0nIiciJyAnIiciJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgICAqYWNfc3BhY2U9XCAqKQorICAgICAgc2VkIC1uIFwKKwkicy8nIiciJy8nIiciJ1xcXFwnIiciJyciJyInL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSciJyInXFwyJyInIicvcCIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNlZCAtbiBcCisJInMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9XFwyL3AiCisgICAgICA7OworICAgIGVzYWM7Cit9CisgICAgZWNobworCisgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE91dHB1dCB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisgICAgICBlY2hvICIkYWNfdmFyPSciJyInJGFjX3ZhbCciJyInIgorICAgIGRvbmUgfCBzb3J0CisgICAgZWNobworCisgICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IGZpbGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgICBlY2hvCisgICAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF9maWxlcworICAgICAgZG8KKwlldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKwllY2hvICIkYWNfdmFyPSciJyInJGFjX3ZhbCciJyInIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIHNlZCAiL14kL2QiIGNvbmZkZWZzLmggfCBzb3J0CisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICBlY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKKyAgICBlY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIgorICB9ID4mNQorICBybSAtZiBjb3JlICouY29yZSAmJgorICBybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisgICAgICcgMAorZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCisgIHRyYXAgJ2FjX3NpZ25hbD0nJGFjX3NpZ25hbCc7IHsgKGV4aXQgMSk7IGV4aXQgMTsgfScgJGFjX3NpZ25hbAorZG9uZQorYWNfc2lnbmFsPTAKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID5jb25mZGVmcy5oCisKKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIkUEFDS0FHRV9UQVJOQU1FIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIkUEFDS0FHRV9CVUdSRVBPUlQiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKKyAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCisgIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KKyAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAkY2FjaGVfZmlsZTs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuIC4vJGNhY2hlX2ZpbGU7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwKKwkgICAgICAgc2VkIC1uICdzL15hY19lbnZfXChbYS16QS1aXzAtOV0qXClfc2V0PS4qL1wxL3AnYDsgZG8KKyAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19vbGRfdmFsPSJcJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUiCisgIGV2YWwgYWNfbmV3X3ZhbD0iXCRhY19lbnZfJHthY192YXJ9X3ZhbHVlIgorICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisgICAgc2V0LCkKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLHNldCkKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mNQorZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjI7fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mNQorZWNobyAiJGFzX21lOiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjI7fQorCWFjX2NhY2hlX2NvcnJ1cHRlZD06CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9cIlwnXSopCisgICAgICBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKKyAgICBlc2FjCisgICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCisgICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KKyAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgICAgICAgYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKKworVkVSU0lPTj0wLjQKKworCisKK29sZF9DRkxBR1M9IiRDRkxBR1MiCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIENDPSRhY19jdF9DQworZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImNjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQ0M9JGFjX2N0X0NDCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworICAgICAgIGNvbnRpbnVlCisgICAgIGZpCisgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgZm9yIGFjX3Byb2cgaW4gY2wKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgQ0M9JGFjX2N0X0NDCitmaQorCitmaQorCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorZWNobyAiJGFzX21lOiRMSU5FTk86IiBcCisgICAgICJjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK2FjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCisjIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCisjIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCisjIG9mIGV4ZWV4dC4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gJEVDSE9fQyIgPiY2CithY19saW5rX2RlZmF1bHQ9YGVjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rX2RlZmF1bHRcIiIpID4mNQorICAoZXZhbCAkYWNfbGlua19kZWZhdWx0KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICMgRmluZCB0aGUgb3V0cHV0LCBzdGFydGluZyBmcm9tIHRoZSBtb3N0IGxpa2VseS4gIFRoaXMgc2NoZW1lIGlzCisjIG5vdCByb2J1c3QgdG8ganVuayBpbiBgLicsIGhlbmNlIGdvIHRvIHdpbGRjYXJkcyAoYS4qKSBvbmx5IGFzIGEgbGFzdAorIyByZXNvcnQuCisKKyMgQmUgY2FyZWZ1bCB0byBpbml0aWFsaXplIHRoaXMgdmFyaWFibGUsIHNpbmNlIGl0IHVzZWQgdG8gYmUgY2FjaGVkLgorIyBPdGhlcndpc2UgYW4gb2xkIGNhY2hlIHZhbHVlIG9mIGBubycgbGVkIHRvIGBFWEVFWFQgPSBubycgaW4gYSBNYWtlZmlsZS4KK2FjX2N2X2V4ZWV4dD0KKyMgYi5vdXQgaXMgY3JlYXRlZCBieSBpOTYwIGNvbXBpbGVycy4KK2ZvciBhY19maWxlIGluIGFfb3V0LmV4ZSBhLmV4ZSBjb25mdGVzdC5leGUgYS5vdXQgY29uZnRlc3QgYS4qIGNvbmZ0ZXN0LiogYi5vdXQKK2RvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm8gfCAqLm9iaiApCisJOzsKKyAgICBjb25mdGVzdC4kYWNfZXh0ICkKKwkjIFRoaXMgaXMgdGhlIHNvdXJjZSBmaWxlLgorCTs7CisgICAgW2FiXS5vdXQgKQorCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CisJIyBjZXJ0YWlubHkgcmlnaHQuCisJYnJlYWs7OworICAgICouKiApCisJYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJIyBGSVhNRTogSSBiZWxpZXZlIHdlIGV4cG9ydCBhY19jdl9leGVleHQgZm9yIExpYnRvb2wsCisJIyBidXQgaXQgd291bGQgYmUgY29vbCB0byBmaW5kIG91dCBpZiBpdCdzIHRydWUuICBEb2VzIGFueWJvZHkKKwkjIG1haW50YWluIExpYnRvb2w/IC0tYWtpbS4KKwlleHBvcnQgYWNfY3ZfZXhlZXh0CisJYnJlYWs7OworICAgICogKQorCWJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorZmkKKworYWNfZXhlZXh0PSRhY19jdl9leGVleHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19maWxlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19maWxlIiA+JjYKKworIyBDaGVjayB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gJEVDSE9fQyIgPiY2CisjIEZJWE1FOiBUaGVzZSBjcm9zcyBjb21waWxlciBoYWNrcyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgQXV0b2NvbmYgMy4wCisjIElmIG5vdCBjcm9zcyBjb21waWxpbmcsIGNoZWNrIHRoYXQgd2UgY2FuIHJ1biBhIHNpbXBsZSBwcm9ncmFtLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCisgIGlmIHsgYWNfdHJ5PScuLyRhY19maWxlJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBmaQorICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNgorCitybSAtZiBhLm91dCBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisjIENoZWNrIHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gJEVDSE9fQyIgPiY2CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRjcm9zc19jb21waWxpbmciID4mNgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisjIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKKyMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCisjIGBybScuCitmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkgIGV4cG9ydCBhY19jdl9leGVleHQKKwkgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCitybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2V4ZWV4dCIgPiY2CisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0VYRUVYVD0kYWNfY3ZfZXhlZXh0CithY19leGVleHQ9JEVYRUVYVAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICBmb3IgYWNfZmlsZSBpbiBgKGxzIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqOyBscyBjb25mdGVzdC4qKSAyPi9kZXYvbnVsbGA7IGRvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vYmpleHQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X29iamV4dCIgPiY2CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNgorR0NDPWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCitDRkxBR1M9Ii1nIgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19zdGRjPW5vCithY19zYXZlX0NDPSRDQworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkMSBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQxLiAgKi8KK2ludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCisjIERvbid0IHRyeSBnY2MgLWFuc2k7IHRoYXQgdHVybnMgb2ZmIHVzZWZ1bCBleHRlbnNpb25zIGFuZAorIyBicmVha3Mgc29tZSBzeXN0ZW1zJyBoZWFkZXIgZmlsZXMuCisjIEFJWAkJCS1xbGFuZ2x2bD1hbnNpCisjIFVsdHJpeCBhbmQgT1NGLzEJLXN0ZDEKKyMgSFAtVVggMTAuMjAgYW5kIGxhdGVyCS1BZQorIyBIUC1VWCBvbGRlciB2ZXJzaW9ucwktQWEgLURfSFBVWF9TT1VSQ0UKKyMgU1ZSNAkJCS1YYyAtRF9fRVhURU5TSU9OU19fCitmb3IgYWNfYXJnIGluICIiIC1xbGFuZ2x2bD1hbnNpIC1zdGQxIC1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3N0ZGM9JGFjX2FyZworYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Citkb25lCitybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQKK0NDPSRhY19zYXZlX0NDCisKK2ZpCisKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19zdGRjIiBpbgorICB4fHhubykKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CitlY2hvICIke0VDSE9fVH1ub25lIG5lZWRlZCIgPiY2IDs7CisgICopCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2Nfc3RkYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19zdGRjIiA+JjYKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX3N0ZGMiIDs7Citlc2FjCisKKyMgU29tZSBwZW9wbGUgdXNlIGEgQysrIGNvbXBpbGVyIHRvIGNvbXBpbGUgQy4gIFNpbmNlIHdlIHVzZSBgZXhpdCcsCisjIGluIEMrKyB3ZSBuZWVkIHRvIGRlY2xhcmUgaXQuICBJbiBjYXNlIHNvbWVvbmUgdXNlcyB0aGUgc2FtZSBjb21waWxlcgorIyBmb3IgYm90aCBjb21waWxpbmcgQyBhbmQgQysrIHdlIG5lZWQgdG8gaGF2ZSB0aGUgQysrIGNvbXBpbGVyIGRlY2lkZQorIyB0aGUgZGVjbGFyYXRpb24gb2YgZXhpdCwgc2luY2UgaXQncyB0aGUgbW9zdCBkZW1hbmRpbmcgZW52aXJvbm1lbnQuCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyAgY2hva2UgbWUKKyNlbmRpZgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGZvciBhY19kZWNsYXJhdGlvbiBpbiBcCisgICAnJyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIHN0ZDo6ZXhpdCAoaW50KSB0aHJvdyAoKTsgdXNpbmcgc3RkOjpleGl0OycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KSB0aHJvdyAoKTsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsnIFwKKyAgICd2b2lkIGV4aXQgKGludCk7JworZG8KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfZGVjbGFyYXRpb24KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2ludAorbWFpbiAoKQoreworZXhpdCAoNDIpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2RlY2xhcmF0aW9uCitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorcm0gLWYgY29uZnRlc3QqCitpZiB0ZXN0IC1uICIkYWNfZGVjbGFyYXRpb24iOyB0aGVuCisgIGVjaG8gJyNpZmRlZiBfX2NwbHVzcGx1cycgPj5jb25mZGVmcy5oCisgIGVjaG8gJGFjX2RlY2xhcmF0aW9uICAgICAgPj5jb25mZGVmcy5oCisgIGVjaG8gJyNlbmRpZicgICAgICAgICAgICAgPj5jb25mZGVmcy5oCitmaQorCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICRFQ0hPX0MiID4mNgorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorICBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1BQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIkQ0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgorICAgIGRvCisgICAgICBhY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCisKK2ZpCisgIENQUD0kYWNfY3ZfcHJvZ19DUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9JENQUAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDUFAiID4mNQorZWNobyAiJHtFQ0hPX1R9JENQUCIgPiY2CithY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICA6CitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19lZ3JlcCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAoZ3JlcCAtRSAnKGF8YiknKSA+L2Rldi9udWxsIDI+JjEKKyAgICB0aGVuIGFjX2N2X3Byb2dfZWdyZXA9J2dyZXAgLUUnCisgICAgZWxzZSBhY19jdl9wcm9nX2VncmVwPSdlZ3JlcCcKKyAgICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2VncmVwIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2VncmVwIiA+JjYKKyBFR1JFUD0kYWNfY3ZfcHJvZ19lZ3JlcAorCisKK2lmIHRlc3QgJGFjX2N2X2NfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIG5lZWRzIC10cmFkaXRpb25hbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIG5lZWRzIC10cmFkaXRpb25hbC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgICBhY19wYXR0ZXJuPSJBdXRvY29uZi4qJ3gnIgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzZ3R0eS5oPgorQXV0b2NvbmYgVElPQ0dFVFAKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgIiRhY19wYXR0ZXJuIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWw9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKKworICBpZiB0ZXN0ICRhY19jdl9wcm9nX2djY190cmFkaXRpb25hbCA9IG5vOyB0aGVuCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8dGVybWlvLmg+CitBdXRvY29uZiBUQ0dFVEEKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgIiRhY19wYXR0ZXJuIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWw9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCisKKyAgZmkKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsIiA+JjYKKyAgaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC10cmFkaXRpb25hbCIKKyAgZmkKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHN0cmVycm9yIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzdHJlcnJvci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3N0cmVycm9yK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworYWNfY3Zfc2VhcmNoX3N0cmVycm9yPW5vCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBzdHJlcnJvciAoKTsKK2ludAorbWFpbiAoKQoreworc3RyZXJyb3IgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3Zfc2VhcmNoX3N0cmVycm9yPSJub25lIHJlcXVpcmVkIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgIiRhY19jdl9zZWFyY2hfc3RyZXJyb3IiID0gbm87IHRoZW4KKyAgZm9yIGFjX2xpYiBpbiBjcG9zaXg7IGRvCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHN0cmVycm9yICgpOworaW50CittYWluICgpCit7CitzdHJlcnJvciAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9zZWFyY2hfc3RyZXJyb3I9Ii1sJGFjX2xpYiIKK2JyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitmaQorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9zdHJlcnJvciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2VhcmNoX3N0cmVycm9yIiA+JjYKK2lmIHRlc3QgIiRhY19jdl9zZWFyY2hfc3RyZXJyb3IiICE9IG5vOyB0aGVuCisgIHRlc3QgIiRhY19jdl9zZWFyY2hfc3RyZXJyb3IiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19jdl9zZWFyY2hfc3RyZXJyb3IgJExJQlMiCisKK2ZpCisKKworaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworbWFpbigpe2V4aXQoMCk7fQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorCitpZiB0ZXN0ICRDQyAhPSBjYyA7IHRoZW4KK2VjaG8gIllvdXIgJENDIGZhaWxlZCAtIHJlc3RhcnRpbmcgd2l0aCBDQz1jYyIgMT4mNgorCitlY2hvICIiIDE+JjYKKworQ0M9Y2MKK2V4cG9ydCBDQworZXhlYyAkMCAkY29uZmlndXJlX2FyZ3MKK2ZpCisKK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworbWFpbigpe2V4aXQoMCk7fQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorZXhlYyA1PiYyCitldmFsICRhY19saW5rCitlY2hvICJDQz0kQ0M7IENGTEFHUz0kQ0ZMQUdTOyBMSUJTPSRMSUJTOyIgMT4mNgorCitlY2hvICIkYWNfY29tcGlsZSIgMT4mNgorCit7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDYW4ndCBydW4gdGhlIGNvbXBpbGVyIC0gc29ycnkiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQ2FuJ3QgcnVuIHRoZSBjb21waWxlciAtIHNvcnJ5IiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworbWFpbigpCit7CisgIGludCBfX3NvbWV0aGluZ19zdHJhbmdlXygpOworICBfX3NvbWV0aGluZ19zdHJhbmdlXygwKTsKK30KKworX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogWW91ciBjb21waWxlciBkb2VzIG5vdCBzZXQgdGhlIGV4aXQgc3RhdHVzIC0gc29ycnkiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogWW91ciBjb21waWxlciBkb2VzIG5vdCBzZXQgdGhlIGV4aXQgc3RhdHVzIC0gc29ycnkiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19BV0src2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitBV0s9JGFjX2N2X3Byb2dfQVdLCitpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQVdLIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRBV0siID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIHRlc3QgLW4gIiRBV0siICYmIGJyZWFrCitkb25lCisKKworaWYgdGVzdCAtZiBldGMvdG9vbGNoZWNrOyB0aGVuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYnVnZ3kgdG9vbHMuLi4iID4mNQorZWNobyAiJGFzX21lOiBjaGVja2luZyBmb3IgYnVnZ3kgdG9vbHMuLi4iID4mNjt9CitzaCBldGMvdG9vbGNoZWNrIDE+JjYKK2ZpCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIFN5c3RlbSBWLi4uIiA+JjUKK2VjaG8gIiRhc19tZTogY2hlY2tpbmcgZm9yIFN5c3RlbSBWLi4uIiA+JjY7fQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KK2ludAorbWFpbiAoKQoreworaW50IHggPSBTSUdDSExEIHwgRk5ERUxBWTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFNZU1YgMQorX0FDRU9GCisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBTb2xhcmlzIDIueC4uLiIgPiY1CitlY2hvICIkYXNfbWU6IGNoZWNraW5nIGZvciBTb2xhcmlzIDIueC4uLiIgPiY2O30KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmIGRlZmluZWQoU1ZSNCkgJiYgZGVmaW5lZChzdW4pCisgIHllcworI2VuZGlmCisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgInllcyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIExJQlM9IiRMSUJTIC1sc29ja2V0IC1sbnNsIC1sa3N0YXQiCitmaQorcm0gLWYgY29uZnRlc3QqCisKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzZWxlY3QuLi4iID4mNQorZWNobyAiJGFzX21lOiBjaGVja2luZyBzZWxlY3QuLi4iID4mNjt9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CitzZWxlY3QoMCwgMCwgMCwgMCwgMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitMSUJTPSIkTElCUyAtbG5ldCAtbG5zbCIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNlbGVjdCB3aXRoICRMSUJTLi4uIiA+JjUKK2VjaG8gIiRhc19tZTogY2hlY2tpbmcgc2VsZWN0IHdpdGggJExJQlMuLi4iID4mNjt9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CitzZWxlY3QoMCwgMCwgMCwgMCwgMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAhISEgbm8gc2VsZWN0IC0gbm8gc2NyZWVuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6ICEhISBubyBzZWxlY3QgLSBubyBzY3JlZW4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2VsZWN0IHJldHVybiB2YWx1ZS4uLiIgPiY1CitlY2hvICIkYXNfbWU6IGNoZWNraW5nIHNlbGVjdCByZXR1cm4gdmFsdWUuLi4iID4mNjt9CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK2NoYXIgKm5hbSA9ICIvdG1wL2NvbmZ0ZXN0JCQiOworCisjaWZkZWYgTkFNRURQSVBFCisKKyNpZm5kZWYgT19OT05CTE9DSworI2RlZmluZSBPX05PTkJMT0NLIE9fTkRFTEFZCisjZW5kaWYKKyNpZm5kZWYgU19JRklGTworI2RlZmluZSBTX0lGSUZPIDAwMTAwMDAKKyNlbmRpZgorCisKK21haW4oKQoreworI2lmZGVmIEZEX1NFVAorICBmZF9zZXQgZjsKKyNlbHNlCisgIGludCBmOworI2VuZGlmCisKKyNpZmRlZiBfX0ZyZWVCU0RfXworLyogRnJvbSBBbmRyZXcgQS4gQ2hlcm5vdiAoYWNoZUBhc3RyYWwubXNrLnN1KToKKyAqIG9wZW5pbmcgUkRXUiBmaWZvIGZhaWxzIGluIEJTRCA0LjQsIGJ1dCBzZWxlY3QgcmV0dXJuIHZhbHVlcyBhcmUKKyAqIHJpZ2h0LgorICovCisgIGV4aXQoMCk7CisjZW5kaWYKKyAgKHZvaWQpYWxhcm0oNSk7CisjaWZkZWYgUE9TSVgKKyAgaWYgKG1rZmlmbyhuYW0sIDA3NzcpKQorI2Vsc2UKKyAgaWYgKG1rbm9kKG5hbSwgU19JRklGT3wwNzc3LCAwKSkKKyNlbmRpZgorICAgIGV4aXQoMSk7CisgIGNsb3NlKDApOworICBpZiAob3BlbihuYW0sIE9fUkRXUiB8IE9fTk9OQkxPQ0spKQorICAgIGV4aXQoMSk7CisgIGlmICh3cml0ZSgwLCAiVEVTVCIsIDQpID09IC0xKQorICAgIGV4aXQoMSk7CisKKyNlbHNlCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisKK21haW4oKQoreworICBpbnQgczEsIHMyLCBsOworICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYTsKKyNpZmRlZiBGRF9TRVQKKyAgZmRfc2V0IGY7CisjZWxzZQorICBpbnQgZjsKKyNlbmRpZgorCisgICh2b2lkKWFsYXJtKDUpOworICBpZiAoKHMxID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisgICAgZXhpdCgxKTsKKyAgYS5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgc3RyY3B5KGEuc3VuX3BhdGgsIG5hbSk7CisgICh2b2lkKSB1bmxpbmsobmFtKTsKKyAgaWYgKGJpbmQoczEsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmEsIHN0cmxlbihuYW0pKzIpID09IC0xKQorICAgIGV4aXQoMSk7CisgIGlmIChsaXN0ZW4oczEsIDIpKQorICAgIGV4aXQoMSk7CisgIGlmIChmb3JrKCkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoKHMyID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisJa2lsbChnZXRwcGlkKCksIDMpOworICAgICAgKHZvaWQpY29ubmVjdChzMiwgKHN0cnVjdCBzb2NrYWRkciAqKSZhLCBzdHJsZW4obmFtKSArIDIpOworICAgICAgaWYgKHdyaXRlKHMyLCAiSEVMTE8iLCA1KSA9PSAtMSkKKwlraWxsKGdldHBwaWQoKSwgMyk7CisgICAgICBleGl0KDApOworICAgIH0KKyAgbCA9IHNpemVvZihhKTsKKyAgY2xvc2UoMCk7CisgIGlmIChhY2NlcHQoczEsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYSwgJmwpKQorICAgIGV4aXQoMSk7CisjZW5kaWYKKworCisjaWZkZWYgRkRfU0VUCisgIEZEX1NFVCgwLCAmZik7CisjZWxzZQorICBmID0gMTsKKyNlbmRpZgorICBpZiAoc2VsZWN0KDEsICZmLCAwLCAwLCAwKSA9PSAtMSkKKyAgICBleGl0KDEpOworICBpZiAoc2VsZWN0KDEsICZmLCAmZiwgMCwgMCkgIT0gMikKKyAgICBleGl0KDEpOworICBleGl0KDApOworfQorCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBlY2hvICItIHNlbGVjdCBpcyBvayIgMT4mNgorCitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisoIGV4aXQgJGFjX3N0YXR1cyApCitlY2hvICItIHNlbGVjdCBjYW4ndCBjb3VudCIgMT4mNgorIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFNFTEVDVF9CUk9LRU4gMQorX0FDRU9GCisKK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHRnZXRlbnQuLi4iID4mNQorZWNobyAiJGFzX21lOiBjaGVja2luZyBmb3IgdGdldGVudC4uLiIgPiY2O30KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK3RnZXRlbnQoKGNoYXIgKikwLCAoY2hhciAqKTApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworb2xpYnM9IiRMSUJTIgorTElCUz0iLWxjdXJzZXMgJG9saWJzIgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgbGliY3Vyc2VzLi4uIiA+JjUKK2VjaG8gIiRhc19tZTogY2hlY2tpbmcgbGliY3Vyc2VzLi4uIiA+JjY7fQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisjaWZkZWYgX19ocHV4CitfX3NvcnJ5X2hwdXhfbGliY3Vyc2VzX2lzX3RvdGFsbHlfYnJva2VuX2luXzEwXzEwKCk7CisjZWxzZQordGdldGVudCgoY2hhciAqKTAsIChjaGFyICopMCk7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworTElCUz0iLWx0ZXJtY2FwICRvbGlicyIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGxpYnRlcm1jYXAuLi4iID4mNQorZWNobyAiJGFzX21lOiBjaGVja2luZyBsaWJ0ZXJtY2FwLi4uIiA+JjY7fQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQorewordGdldGVudCgoY2hhciAqKTAsIChjaGFyICopMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitMSUJTPSItbHRlcm1saWIgJG9saWJzIgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgbGlidGVybWxpYi4uLiIgPiY1CitlY2hvICIkYXNfbWU6IGNoZWNraW5nIGxpYnRlcm1saWIuLi4iID4mNjt9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7Cit0Z2V0ZW50KChjaGFyICopMCwgKGNoYXIgKikwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK0xJQlM9Ii1sbmN1cnNlcyAkb2xpYnMiCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBsaWJuY3Vyc2VzLi4uIiA+JjUKK2VjaG8gIiRhc19tZTogY2hlY2tpbmcgbGlibmN1cnNlcy4uLiIgPiY2O30KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK3RnZXRlbnQoKGNoYXIgKikwLCAoY2hhciAqKTApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogISEhIG5vIHRnZXRlbnQgLSBubyBzY3JlZW4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogISEhIG5vIHRnZXRlbnQgLSBubyBzY3JlZW4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworbWFpbigpCit7CisgZXhpdChzdHJjbXAodGdvdG8oIiVwMSVkIiwgMCwgMSksICIxIikgPyAwIDogMSk7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBlY2hvICItIHlvdSB1c2UgdGhlIHRlcm1jYXAgZGF0YWJhc2UiIDE+JjYKKworZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorZWNobyAiLSB5b3UgdXNlIHRoZSB0ZXJtaW5mbyBkYXRhYmFzZSIgMT4mNgorIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFRFUk1JTkZPIDEKK19BQ0VPRgorCitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBvc3BlZWQuLi4iID4mNQorZWNobyAiJGFzX21lOiBjaGVja2luZyBvc3BlZWQuLi4iID4mNjt9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK2V4dGVybiBzaG9ydCBvc3BlZWQ7CitpbnQKK21haW4gKCkKK3sKK29zcGVlZD01OworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgTkVFRF9PU1BFRUQgMQorX0FDRU9GCisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgL2Rldi9wdGMuLi4iID4mNQorZWNobyAiJGFzX21lOiBjaGVja2luZyBmb3IgL2Rldi9wdGMuLi4iID4mNjt9CitpZiB0ZXN0IC1yIC9kZXYvcHRjOyB0aGVuCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFVl9QVEMgMQorX0FDRU9GCisKK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBTVlI0IHB0eXMuLi4iID4mNQorZWNobyAiJGFzX21lOiBjaGVja2luZyBmb3IgU1ZSNCBwdHlzLi4uIiA+JjY7fQorc3lzdnI0cHR5cz0KK2lmIHRlc3QgLWMgL2Rldi9wdG14IDsgdGhlbgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworcHRzbmFtZSgwKTtncmFudHB0KDApO3VubG9ja3B0KDApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfU1ZSNF9QVFlTIDEKK19BQ0VPRgorCitzeXN2cjRwdHlzPTEKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2ZvciBhY19mdW5jIGluIGdldHB0CitkbworYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICRhY19mdW5jCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCitjaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSAkYWNfZnVuYzsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBldmFsICIkYXNfYWNfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCitpZiB0ZXN0IC16ICIkc3lzdnI0cHR5cyI7IHRoZW4KKworZm9yIGFjX2Z1bmMgaW4gb3BlbnB0eQorZG8KK2FzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY192YXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYworCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkYWNfZnVuYworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorY2hhciAoKmYpICgpID0gJGFjX2Z1bmM7CisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgIT0gJGFjX2Z1bmM7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2V2YWwgIiRhc19hY192YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY2CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBvcGVucHR5IGluIC1sdXRpbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBvcGVucHR5IGluIC1sdXRpbC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3V0aWxfb3BlbnB0eStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHV0aWwgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgb3BlbnB0eSAoKTsKK2ludAorbWFpbiAoKQoreworb3BlbnB0eSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfdXRpbF9vcGVucHR5PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9saWJfdXRpbF9vcGVucHR5PW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3V0aWxfb3BlbnB0eSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3V0aWxfb3BlbnB0eSIgPiY2CitpZiB0ZXN0ICRhY19jdl9saWJfdXRpbF9vcGVucHR5ID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfT1BFTlBUWSAxCitfQUNFT0YKKyBMSUJTPSIkTElCUyAtbHV0aWwiCitmaQorCitmaQorZG9uZQorCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHR5cmFuZ2VzLi4uIiA+JjUKK2VjaG8gIiRhc19tZTogY2hlY2tpbmcgZm9yIHB0eXJhbmdlcy4uLiIgPiY2O30KK2lmIHRlc3QgLWQgL2Rldi9wdHltIDsgdGhlbgorcGRpcj0nL2Rldi9wdHltJworZWxzZQorcGRpcj0nL2RldicKK2ZpCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBNX1VOSVgKKyAgIHllczsKKyNlbmRpZgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ5ZXMiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBwdHlzPWBlY2hvIC9kZXYvcHR5cD8/YAorZWxzZQorICBwdHlzPWBlY2hvICRwZGlyL3B0eT8/YAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICIkcHR5cyIgIT0gIiRwZGlyL3B0eT8/IiA7IHRoZW4KK3AwPWBlY2hvICRwdHlzIHwgdHIgJyAnICdcMDEyJyB8IHNlZCAtZSAncy9eLipcKC5cKS4kL1wxL2cnIHwgc29ydCAtdSB8IHRyIC1kICdcMDEyJ2AKK3AxPWBlY2hvICRwdHlzIHwgdHIgJyAnICdcMDEyJyB8IHNlZCAtZSAncy9eLipcKC5cKSQvXDEvZycgIHwgc29ydCAtdSB8IHRyIC1kICdcMDEyJ2AKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUFRZUkFOR0UwICIkcDAiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQVFlSQU5HRTEgIiRwMSIKK19BQ0VPRgorCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcHR5LW1vZGUgb3IgLS13aXRob3V0LXB0eS1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9wdHlfbW9kZStzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9wdHlfbW9kZSIKKyAgIHB0eW1vZGU9IiR7d2l0aHZhbH0iCitmaTsKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1wdHktZ3JvdXAgb3IgLS13aXRob3V0LXB0eS1ncm91cCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcHR5X2dyb3VwK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX3B0eV9ncm91cCIKKyAgIHB0eWdycD0iJHt3aXRodmFsfSIKK2ZpOwordGVzdCAtbiAiJHB0eW1vZGUiIHx8IHB0eW1vZGU9MDYyMAoraWYgdGVzdCAtbiAiJHB0eWdycCIgOyB0aGVuCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBUWU1PREUgJHB0eW1vZGUKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBUWUdST1VQICRwdHlncnAKK19BQ0VPRgorCitlbHNlCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGRlZmF1bHQgdHR5IHBlcm1pc3Npb25zL2dyb3VwLi4uIiA+JjUKK2VjaG8gIiRhc19tZTogY2hlY2tpbmcgZGVmYXVsdCB0dHkgcGVybWlzc2lvbnMvZ3JvdXAuLi4iID4mNjt9CitybSAtZiBjb25mdGVzdF9ncnAKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KK21haW4oKQoreworICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgY2hhciAqeCwqdHR5bmFtZSgpOworICBpbnQgb20sIG07CisgIEZJTEUgKmZwOworCisgIGlmICghKHggPSB0dHluYW1lKDApKSkgZXhpdCgxKTsKKyAgaWYgKHN0YXQoeCwgJnNiKSkgZXhpdCgxKTsKKyAgb20gPSBzYi5zdF9tb2RlOworICBpZiAob20gJiAwMDIpIGV4aXQoMCk7CisgIG0gPSBzeXN0ZW0oIm1lc2cgeSIpOworICBpZiAobSA9PSAtMSB8fCBtID09IDEyNykgZXhpdCgxKTsKKyAgaWYgKHN0YXQoeCwgJnNiKSkgZXhpdCgxKTsKKyAgbSA9IHNiLnN0X21vZGU7CisgIGlmIChjaG1vZCh4LCBvbSkpIGV4aXQoMSk7CisgIGlmIChtICYgMDAyKSBleGl0KDApOworICBpZiAoc2Iuc3RfZ2lkID09IGdldGdpZCgpKSBleGl0KDEpOworICBpZiAoIShmcD1mb3BlbigiY29uZnRlc3RfZ3JwIiwgInciKSkpCisgICAgZXhpdCgxKTsKKyAgZnByaW50ZihmcCwgIiVkXG4iLCBzYi5zdF9naWQpOworICBmY2xvc2UoZnApOworICBleGl0KDApOworfQorCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorCisgICAgaWYgdGVzdCAtZiBjb25mdGVzdF9ncnA7IHRoZW4KKwlwdHlncnA9YGNhdCBjb25mdGVzdF9ncnBgCisJZWNobyAiLSBwdHkgbW9kZTogJHB0eW1vZGUsIGdyb3VwOiAkcHR5Z3JwIiAxPiY2CisKKwljYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBUWU1PREUgJHB0eW1vZGUKK19BQ0VPRgorCisJY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQVFlHUk9VUCAkcHR5Z3JwCitfQUNFT0YKKworICAgIGVsc2UKKwllY2hvICItIHB0eXMgYXJlIHdvcmxkIGFjY2Vzc2FibGUiIDE+JjYKKworICAgIGZpCisKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKKworICAgIFdSSVRFUEFUSD0nJworICAgIFhURVJNUEFUSD0nJworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAid3JpdGUiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHdyaXRlOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wYXRoX1dSSVRFUEFUSCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXNlICRXUklURVBBVEggaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfV1JJVEVQQVRIPSIkV1JJVEVQQVRIIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX1dSSVRFUEFUSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCisgIDs7Citlc2FjCitmaQorV1JJVEVQQVRIPSRhY19jdl9wYXRoX1dSSVRFUEFUSAorCitpZiB0ZXN0IC1uICIkV1JJVEVQQVRIIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkV1JJVEVQQVRIIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRXUklURVBBVEgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4dGVybSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeHRlcm07IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfWFRFUk1QQVRIK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJFhURVJNUEFUSCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9YVEVSTVBBVEg9IiRYVEVSTVBBVEgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfWFRFUk1QQVRIPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKKyAgOzsKK2VzYWMKK2ZpCitYVEVSTVBBVEg9JGFjX2N2X3BhdGhfWFRFUk1QQVRICisKK2lmIHRlc3QgLW4gIiRYVEVSTVBBVEgiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRYVEVSTVBBVEgiID4mNQorZWNobyAiJHtFQ0hPX1R9JFhURVJNUEFUSCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgICBmb3VuZD0KKyAgICBpZiB0ZXN0IC1uICIkV1JJVEVQQVRIJFhURVJNUEFUSCI7IHRoZW4KKyAgICAgIGZpbmRmb2xsb3c9CisgICAgICBsc2ZvbGxvdz0KKyAgICAgIGZvdW5kPWBmaW5kICRXUklURVBBVEggJFhURVJNUEFUSCAtZm9sbG93IC1wcmludCAyPi9kZXYvbnVsbGAKKyAgICAgIGlmIHRlc3QgLW4gIiRmb3VuZCI7IHRoZW4KKwlmaW5kZm9sbG93PS1mb2xsb3cKKwlsc2ZvbGxvdz1MCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJFhURVJNUEFUSCI7IHRoZW4KKwlwdHlncnBuPWBscyAtbCRsc2ZvbGxvdyAkWFRFUk1QQVRIIHwgc2VkIC1uIC1lIDFwIHwgJEFXSyAne3ByaW50ICQ0fSdgCisJaWYgdGVzdCB0dHkgIT0gIiRwdHlncnBuIjsgdGhlbgorCSAgWFRFUk1QQVRIPQorCWZpCisgICAgICBmaQorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJFdSSVRFUEFUSCRYVEVSTVBBVEgiOyB0aGVuCisgICAgICBmb3VuZD1gZmluZCAkV1JJVEVQQVRIICRYVEVSTVBBVEggJGZpbmRmb2xsb3cgLXBlcm0gLTIwMDAgLXByaW50YAorICAgICAgaWYgdGVzdCAtbiAiJGZvdW5kIjsgdGhlbgorCXB0eWdycD1gbHMgLWxuJGxzZm9sbG93ICRmb3VuZCB8IHNlZCAtbiAtZSAxcCB8ICRBV0sgJ3twcmludCAkNH0nYAorCWVjaG8gIi0gcHR5IG1vZGU6ICRwdHltb2RlLCBncm91cDogJHB0eWdycCIgMT4mNgorCisJY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQVFlNT0RFICRwdHltb2RlCitfQUNFT0YKKworCWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUFRZR1JPVVAgJHB0eWdycAorX0FDRU9GCisKKyAgICAgIGVsc2UKKwllY2hvICItIHB0eXMgYXJlIHdvcmxkIGFjY2Vzc2FibGUiIDE+JjYKKworICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICItIGNhbid0IGRldGVybWluZSAtIGFzc3VtZSBwdHlzIGFyZSB3b3JsZCBhY2Nlc3NhYmxlIiAxPiY2CisKKyAgICBmaQorCisKK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvbmZ0ZXN0X2dycAorZmkKKworaWYgdGVzdCAtbiAiJHBvc2l4IiA7IHRoZW4KKworZWNobyAiYXNzdW1pbmcgcG9zaXggc2lnbmFsIGRlZmluaXRpb24iIDE+JjYKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgU0lHVk9JRCAxCitfQUNFT0YKKworCitlbHNlCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycy4uLiIgPiY1CitlY2hvICIkYXNfbWU6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycy4uLiIgPiY2O30KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIHNpZ25hbAorI3VuZGVmIHNpZ25hbAorI2VuZGlmCitleHRlcm4gdm9pZCAoKnNpZ25hbCAoKSkgKCk7CitpbnQKK21haW4gKCkKK3sKK2ludCBpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFNJR1ZPSUQgMQorX0FDRU9GCisKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpZ3NldC4uLiIgPiY1CitlY2hvICIkYXNfbWU6IGNoZWNraW5nIHNpZ3NldC4uLiIgPiY2O30KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK2ludAorbWFpbiAoKQoreworCisjaWZkZWYgU0lHVk9JRAorc2lnc2V0KDAsICh2b2lkICgqKSgpKTApOworI2Vsc2UKK3NpZ3NldCgwLCAoaW50ICgqKSgpKTApOworI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBVU0VTSUdTRVQgMQorX0FDRU9GCisKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaWduYWwgaW1wbGVtZW50YXRpb24uLi4iID4mNQorZWNobyAiJGFzX21lOiBjaGVja2luZyBzaWduYWwgaW1wbGVtZW50YXRpb24uLi4iID4mNjt9CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2lmbmRlZiBTSUdDTEQKKyNkZWZpbmUgU0lHQ0xEIFNJR0NITEQKKyNlbmRpZgorI2lmZGVmIFVTRVNJR1NFVAorI2RlZmluZSBzaWduYWwgc2lnc2V0CisjZW5kaWYKKworaW50IGdvdDsKKworI2lmZGVmIFNJR1ZPSUQKK3ZvaWQKKyNlbmRpZgoraGFuZCgpCit7CisgIGdvdCsrOworfQorCittYWluKCkKK3sKKyAgLyogb24gaHB1eCB3ZSB1c2Ugc2lndmVjIHRvIGdldCBic2Qgc2lnbmFscyAqLworI2lmZGVmIF9faHB1eAorICAodm9pZClzaWduYWwoU0lHQ0xELCBoYW5kKTsKKyAga2lsbChnZXRwaWQoKSwgU0lHQ0xEKTsKKyAga2lsbChnZXRwaWQoKSwgU0lHQ0xEKTsKKyAgaWYgKGdvdCA8IDIpCisgICAgZXhpdCgxKTsKKyNlbmRpZgorICBleGl0KDApOworfQorCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisoIGV4aXQgJGFjX3N0YXR1cyApCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBTWVNWU0lHUyAxCitfQUNFT0YKKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQorCisgICAgICAgICAgYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIgorY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKKyMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCisjIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMuCisKK19BQ0VPRgorCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KK3sKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgICAqYWNfc3BhY2U9XCAqKQorICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZQorICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgICBzZWQgLW4gXAorCSJzLycvJ1xcXFwnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICAgIHNlZCAtbiBcCisJInMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9XFwyL3AiCisgICAgICA7OworICAgIGVzYWM7Cit9IHwKKyAgc2VkICcKKyAgICAgdCBjbGVhcgorICAgICA6IGNsZWFyCisgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KKyAgICAgdCBlbmQKKyAgICAgL15hY19jdl9lbnYvIXMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LworICAgICA6IGVuZCcgPj5jb25mY2FjaGUKK2lmIGRpZmYgJGNhY2hlX2ZpbGUgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJiBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97CitzLzoqXCQoc3JjZGlyKToqLzovOworcy86Klwke3NyY2Rpcn06Ki86LzsKK3MvOipAc3JjZGlyQDoqLzovOworcy9eXChbXj1dKj1bCSBdKlwpOiovXDEvOworcy86KiQvLzsKK3MvXltePV0qPVsJIF0qJC8vOworfScKK2ZpCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19pPWBlY2hvICIkYWNfaSIgfAorCSBzZWQgJ3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLydgCisgICMgMi4gQWRkIHRoZW0uCisgIGFjX2xpYm9ianM9IiRhY19saWJvYmpzICRhY19pXCRVLiRhY19vYmpleHQiCisgIGFjX2x0bGlib2Jqcz0iJGFjX2x0bGlib2JqcyAkYWNfaSInJFUubG8nCitkb25lCitMSUJPQkpTPSRhY19saWJvYmpzCisKK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisKKworCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9CitjYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCitkZWJ1Zz1mYWxzZQorYWNfY3NfcmVjaGVjaz1mYWxzZQorYWNfY3Nfc2lsZW50PWZhbHNlCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKworIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCiskYXNfdW5zZXQgRU5WIE1BSUwgTUFJTFBBVEgKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorZm9yIGFzX3ZhciBpbiBcCisgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCisgIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCisgIExDX1RFTEVQSE9ORSBMQ19USU1FCitkbworICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgorICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgorICBlbHNlCisgICAgJGFzX3Vuc2V0ICRhc192YXIKKyAgZmkKK2RvbmUKKworIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworCisjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCithc19tZT1gJGFzX2Jhc2VuYW1lICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKSQnIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorCisKKyMgUEFUSCBuZWVkcyBDUiwgYW5kIExJTkVOTyBuZWVkcyBDUiBhbmQgUEFUSC4KKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAgfHwgeworICAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBwYXRoIGF0IGFsbAorICAjIHJlbGF0aXZlIG9yIG5vdC4KKyAgY2FzZSAkMCBpbgorICAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCitkb25lCisKKyAgICAgICA7OworICBlc2FjCisgICMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyAgIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCisgIGlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgICBhc19teXNlbGY9JDAKKyAgZmkKKyAgaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCisgIGNhc2UgJENPTkZJR19TSEVMTCBpbgorICAnJykKKyAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgY2FzZSAkYXNfZGlyIGluCisJIC8qKQorCSAgIGlmICgiJGFzX2Rpci8kYXNfYmFzZSIgLWMgJworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICcpIDI+L2Rldi9udWxsOyB0aGVuCisJICAgICAkYXNfdW5zZXQgQkFTSF9FTlYgfHwgdGVzdCAiJHtCQVNIX0VOVitzZXR9IiAhPSBzZXQgfHwgeyBCQVNIX0VOVj07IGV4cG9ydCBCQVNIX0VOVjsgfQorCSAgICAgJGFzX3Vuc2V0IEVOViB8fCB0ZXN0ICIke0VOVitzZXR9IiAhPSBzZXQgfHwgeyBFTlY9OyBleHBvcnQgRU5WOyB9CisJICAgICBDT05GSUdfU0hFTEw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAkezErIiRAIn0KKwkgICBmaTs7CisJIGVzYWMKKyAgICAgICBkb25lCitkb25lCis7OworICBlc2FjCisKKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBiZWZvcmUgZWFjaCBsaW5lOyB0aGUgc2Vjb25kICdzZWQnIGRvZXMgdGhlIHJlYWwKKyAgIyB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoIGxpbmUtbnVtYmVyIGxpbmUKKyAgIyB3aXRoIHRoZSBudW1iZXJlZCBsaW5lLCBhbmQgYXBwZW5kcyB0cmFpbGluZyAnLScgZHVyaW5nCisgICMgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsIGNhc2UgYXQgbGluZSBlbmQuCisgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAnPScgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBOCisgICAgICBzLCQsLSwKKyAgICAgIDogbG9vcAorICAgICAgcyxeXChbJyRhc19jcl9kaWdpdHMnXSpcKVwoLipcKVskXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dXCksXDFcMlwxXDMsCisgICAgICB0IGxvb3AKKyAgICAgIHMsLSQsLAorICAgICAgcyxeWyckYXNfY3JfZGlnaXRzJ10qXG4sLAorICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggJGFzX21lLmxpbmVubyB8fAorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaWJsZSB0byB0aGlzKS4KKyAgLiAuLyRhc19tZS5saW5lbm8KKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworCitjYXNlIGBlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzYCxgZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzYCBpbgorICAqYyosLW4qKSBFQ0hPX049IEVDSE9fQz0nCisnIEVDSE9fVD0nCScgOzsKKyAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gRUNIT19UPSA7OworICAqKSAgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIEVDSE9fVD0gOzsKK2VzYWMKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitlY2hvID5jb25mJCQuZmlsZQoraWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICMgV2UgY291bGQganVzdCBjaGVjayBmb3IgREpHUFA7IGJ1dCB0aGlzIHRlc3QgYSkgd29ya3MgYikgaXMgbW9yZSBnZW5lcmljCisgICMgYW5kIGMpIHdpbGwgcmVtYWluIHZhbGlkIG9uY2UgREpHUFAgc3VwcG9ydHMgc3ltbGlua3MgKERKR1BQIDIuMDQpLgorICBpZiB0ZXN0IC1mIGNvbmYkJC5leGU7IHRoZW4KKyAgICAjIERvbid0IHVzZSBsbiBhdCBhbGw7IHdlIGRvbid0IGhhdmUgYW55IGxpbmtzCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsc2UKKyAgICBhc19sbl9zPSdsbiAtcycKKyAgZmkKK2VsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2xuX3M9bG4KK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPToKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworYXNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuCithc19ubD0nCisnCitJRlM9IiAJJGFzX25sIgorCisjIENEUEFUSC4KKyRhc191bnNldCBDRFBBVEgKKworZXhlYyA2PiYxCisKKyMgT3BlbiB0aGUgbG9nIHJlYWwgc29vbiwgdG8ga2VlcCBcJFswXSBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuICBMb2dnaW5nIC0tdmVyc2lvbiBldGMuIGlzIE9LLgorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCit9ID4mNQorY2F0ID4mNSA8PF9DU0VPRgorCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUworICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCisgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKyAgJCAkMCAkQAorCitfQ1NFT0YKK2VjaG8gIm9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYCIgPiY1CitlY2hvID4mNQorX0FDRU9GCisKKyMgRmlsZXMgdGhhdCBjb25maWcuc3RhdHVzIHdhcyBtYWRlIGZvci4KK2lmIHRlc3QgLW4gIiRhY19jb25maWdfZmlsZXMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19maWxlcz1cIiRhY19jb25maWdfZmlsZXNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19oZWFkZXJzIjsgdGhlbgorICBlY2hvICJjb25maWdfaGVhZGVycz1cIiRhY19jb25maWdfaGVhZGVyc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2xpbmtzIjsgdGhlbgorICBlY2hvICJjb25maWdfbGlua3M9XCIkYWNfY29uZmlnX2xpbmtzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19jb25maWdfY29tbWFuZHMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19jb21tYW5kcz1cIiRhY19jb25maWdfY29tbWFuZHNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUKK2N1cnJlbnQgY29uZmlndXJhdGlvbi4KKworVXNhZ2U6ICQwIFtPUFRJT05TXSBbRklMRV0uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCisJCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKwkJICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b2NvbmZAZ251Lm9yZz4uIgorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCithY19jc192ZXJzaW9uPSJcXAorY29uZmlnLnN0YXR1cworY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LAorICB3aXRoIG9wdGlvbnMgXFwiYGVjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKKworQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorc3JjZGlyPSRzcmNkaXIKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0CisjIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPSopCisgICAgYWNfb3B0aW9uPWBleHByICJ4JDEiIDogJ3hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIngkMSIgOiAneFtePV0qPVwoLipcKSdgCisgICAgYWNfc2hpZnQ9OgorICAgIDs7CisgIC0qKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgKikgIyBUaGlzIGlzIG5vdCBhbiBvcHRpb24sIHNvIHRoZSB1c2VyIGhhcyBwcm9iYWJseSBnaXZlbiBleHBsaWNpdAorICAgICAjIGFyZ3VtZW50cy4KKyAgICAgYWNfb3B0aW9uPSQxCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICBlc2FjCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzKiB8IC1WICkKKyAgICBlY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgMCA7OworICAtLWhlIHwgLS1oKQorICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCisgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGFtYmlndW91cyBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAtLWRlYnVnIHwgLS1kKiB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTICRhY19vcHRhcmciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICRhY19vcHRhcmciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKworICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIiA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgoraWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCisgIGVjaG8gInJ1bm5pbmcgJFNIRUxMICQwICIgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2CisgIGV4ZWMgJFNIRUxMICQwICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCitmaQorCitfQUNFT0YKKworCisKKworCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKK2ZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cworZG8KKyAgY2FzZSAiJGFjX2NvbmZpZ190YXJnZXQiIGluCisgICMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorICAiTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OworICAiY29uZmlnLmgiICkgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHB1dCBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBob29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorJGRlYnVnIHx8Cit7CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/OyBybSAtcmYgJHRtcCAmJiBleGl0ICRleGl0X3N0YXR1cycgMAorICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQorfQorCisjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKworeworICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIuL2NvbmZzdGF0WFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mc3RhdCQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKQorfSB8fAoreworICAgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorfQorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKworIworIyBDT05GSUdfRklMRVMgc2VjdGlvbi4KKyMKKworIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2hlbiAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKK2lmIHRlc3QgLW4gIlwkQ09ORklHX0ZJTEVTIjsgdGhlbgorICAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorICBzZWQgJ3MvLEAvQEAvOyBzL0AsL0BALzsgcy8sO3QgdFwkL0A7dCB0LzsgL0A7dCB0XCQvcy9bXFxcXCYsXS9cXFxcJi9nOworICAgcy9AQC8sQC87IHMvQEAvQCwvOyBzL0A7dCB0XCQvLDt0IHQvJyA+XCR0bXAvc3Vicy5zZWQgPDxcXENFT0YKK3MsQFNIRUxMQCwkU0hFTEwsO3QgdAorcyxAUEFUSF9TRVBBUkFUT1JALCRQQVRIX1NFUEFSQVRPUiw7dCB0CitzLEBQQUNLQUdFX05BTUVALCRQQUNLQUdFX05BTUUsO3QgdAorcyxAUEFDS0FHRV9UQVJOQU1FQCwkUEFDS0FHRV9UQVJOQU1FLDt0IHQKK3MsQFBBQ0tBR0VfVkVSU0lPTkAsJFBBQ0tBR0VfVkVSU0lPTiw7dCB0CitzLEBQQUNLQUdFX1NUUklOR0AsJFBBQ0tBR0VfU1RSSU5HLDt0IHQKK3MsQFBBQ0tBR0VfQlVHUkVQT1JUQCwkUEFDS0FHRV9CVUdSRVBPUlQsO3QgdAorcyxAZXhlY19wcmVmaXhALCRleGVjX3ByZWZpeCw7dCB0CitzLEBwcmVmaXhALCRwcmVmaXgsO3QgdAorcyxAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAsJHByb2dyYW1fdHJhbnNmb3JtX25hbWUsO3QgdAorcyxAYmluZGlyQCwkYmluZGlyLDt0IHQKK3MsQHNiaW5kaXJALCRzYmluZGlyLDt0IHQKK3MsQGxpYmV4ZWNkaXJALCRsaWJleGVjZGlyLDt0IHQKK3MsQGRhdGFkaXJALCRkYXRhZGlyLDt0IHQKK3MsQHN5c2NvbmZkaXJALCRzeXNjb25mZGlyLDt0IHQKK3MsQHNoYXJlZHN0YXRlZGlyQCwkc2hhcmVkc3RhdGVkaXIsO3QgdAorcyxAbG9jYWxzdGF0ZWRpckAsJGxvY2Fsc3RhdGVkaXIsO3QgdAorcyxAbGliZGlyQCwkbGliZGlyLDt0IHQKK3MsQGluY2x1ZGVkaXJALCRpbmNsdWRlZGlyLDt0IHQKK3MsQG9sZGluY2x1ZGVkaXJALCRvbGRpbmNsdWRlZGlyLDt0IHQKK3MsQGluZm9kaXJALCRpbmZvZGlyLDt0IHQKK3MsQG1hbmRpckAsJG1hbmRpciw7dCB0CitzLEBidWlsZF9hbGlhc0AsJGJ1aWxkX2FsaWFzLDt0IHQKK3MsQGhvc3RfYWxpYXNALCRob3N0X2FsaWFzLDt0IHQKK3MsQHRhcmdldF9hbGlhc0AsJHRhcmdldF9hbGlhcyw7dCB0CitzLEBERUZTQCwkREVGUyw7dCB0CitzLEBFQ0hPX0NALCRFQ0hPX0MsO3QgdAorcyxARUNIT19OQCwkRUNIT19OLDt0IHQKK3MsQEVDSE9fVEAsJEVDSE9fVCw7dCB0CitzLEBMSUJTQCwkTElCUyw7dCB0CitzLEBWRVJTSU9OQCwkVkVSU0lPTiw7dCB0CitzLEBDQ0AsJENDLDt0IHQKK3MsQENGTEFHU0AsJENGTEFHUyw7dCB0CitzLEBMREZMQUdTQCwkTERGTEFHUyw7dCB0CitzLEBDUFBGTEFHU0AsJENQUEZMQUdTLDt0IHQKK3MsQGFjX2N0X0NDQCwkYWNfY3RfQ0MsO3QgdAorcyxARVhFRVhUQCwkRVhFRVhULDt0IHQKK3MsQE9CSkVYVEAsJE9CSkVYVCw7dCB0CitzLEBDUFBALCRDUFAsO3QgdAorcyxARUdSRVBALCRFR1JFUCw7dCB0CitzLEBBV0tALCRBV0ssO3QgdAorcyxAV1JJVEVQQVRIQCwkV1JJVEVQQVRILDt0IHQKK3MsQFhURVJNUEFUSEAsJFhURVJNUEFUSCw7dCB0CitzLEBMSUJPQkpTQCwkTElCT0JKUyw7dCB0CitzLEBMVExJQk9CSlNALCRMVExJQk9CSlMsO3QgdAorQ0VPRgorCitfQUNFT0YKKworICBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyAgIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyAgIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCisgIGFjX21heF9zZWRfbGluZXM9NDgKKyAgYWNfc2VkX2ZyYWc9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCisgIGFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorICBhY19lbmQ9JGFjX21heF9zZWRfbGluZXMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorICBhY19tb3JlX2xpbmVzPToKKyAgYWNfc2VkX2NtZHM9CisgIHdoaWxlICRhY19tb3JlX2xpbmVzOyBkbworICAgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiICR0bXAvc3Vicy5zZWQgPiR0bXAvc3Vicy5mcmFnCisgICAgZWxzZQorICAgICAgc2VkICIke2FjX2VuZH1xIiAkdG1wL3N1YnMuc2VkID4kdG1wL3N1YnMuZnJhZworICAgIGZpCisgICAgaWYgdGVzdCAhIC1zICR0bXAvc3Vicy5mcmFnOyB0aGVuCisgICAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgZWxzZQorICAgICAgIyBUaGUgcHVycG9zZSBvZiB0aGUgbGFiZWwgYW5kIG9mIHRoZSBicmFuY2hpbmcgY29uZGl0aW9uIGlzIHRvCisgICAgICAjIHNwZWVkIHVwIHRoZSBzZWQgcHJvY2Vzc2luZyAoaWYgdGhlcmUgYXJlIG5vIGBAJyBhdCBhbGwsIHRoZXJlCisgICAgICAjIGlzIG5vIG5lZWQgdG8gYnJvd3NlIGFueSBvZiB0aGUgc3Vic3RpdHV0aW9ucykuCisgICAgICAjIFRoZXNlIGFyZSB0aGUgdHdvIGV4dHJhIHNlZCBjb21tYW5kcyBtZW50aW9uZWQgYWJvdmUuCisgICAgICAoZWNobyAnOnQKKyAgL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYicgJiYgY2F0ICR0bXAvc3Vicy5mcmFnKSA+JHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQKKyAgICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKwlhY19zZWRfY21kcz0ic2VkIC1mICR0bXAvc3Vicy0kYWNfc2VkX2ZyYWcuc2VkIgorICAgICAgZWxzZQorCWFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgJHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQiCisgICAgICBmaQorICAgICAgYWNfc2VkX2ZyYWc9YGV4cHIgJGFjX3NlZF9mcmFnICsgMWAKKyAgICAgIGFjX2JlZz0kYWNfZW5kCisgICAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2xpbmVzYAorICAgIGZpCisgIGRvbmUKKyAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgIGFjX3NlZF9jbWRzPWNhdAorICBmaQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0ZJTEVTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICRhY19maWxlIGluCisgIC0gfCAqOi0gfCAqOi06KiApICMgaW5wdXQgZnJvbSBzdGRpbgorCWNhdCA+JHRtcC9zdGRpbgorCWFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCisJYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKjoqICkgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKwlhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqICkgICBhY19maWxlX2luPSRhY19maWxlLmluIDs7CisgIGVzYWMKKworICAjIENvbXB1dGUgQHNyY2RpckAsIEB0b3Bfc3JjZGlyQCwgYW5kIEBJTlNUQUxMQCBmb3Igc3ViZGlyZWN0b3JpZXMuCisgIGFjX2Rpcj1gKGRpcm5hbWUgIiRhY19maWxlIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgIHsgaWYgJGFzX21rZGlyX3A7IHRoZW4KKyAgICBta2RpciAtcCAiJGFjX2RpciIKKyAgZWxzZQorICAgIGFzX2Rpcj0iJGFjX2RpciIKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIHRlc3QgISAtZCAiJGFzX2RpciI7IGRvCisgICAgICBhc19kaXJzPSIkYXNfZGlyICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAoZGlybmFtZSAiJGFzX2RpciIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgICBkb25lCisgICAgdGVzdCAhIC1uICIkYXNfZGlycyIgfHwgbWtkaXIgJGFzX2RpcnMKKyAgZmkgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKworICBhY19idWlsZGRpcj0uCisKK2lmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAorICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwuLi8sZydgCitlbHNlCisgIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcj0KK2ZpCisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBpZiB0ZXN0IC16ICIkYWNfdG9wX2J1aWxkZGlyIjsgdGhlbgorICAgICAgIGFjX3RvcF9zcmNkaXI9LgorICAgIGVsc2UKKyAgICAgICBhY190b3Bfc3JjZGlyPWBlY2hvICRhY190b3BfYnVpbGRkaXIgfCBzZWQgJ3MsLyQsLCdgCisgICAgZmkgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIgOzsKK2VzYWMKKworIyBEbyBub3QgdXNlIGBjZCBmb28gJiYgcHdkYCB0byBjb21wdXRlIGFic29sdXRlIHBhdGhzLCBiZWNhdXNlCisjIHRoZSBkaXJlY3RvcmllcyBtYXkgbm90IGV4aXN0LgorY2FzZSBgcHdkYCBpbgorLikgYWNfYWJzX2J1aWxkZGlyPSIkYWNfZGlyIjs7CisqKQorICBjYXNlICIkYWNfZGlyIiBpbgorICAuKSBhY19hYnNfYnVpbGRkaXI9YHB3ZGA7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworICAqKSBhY19hYnNfYnVpbGRkaXI9YHB3ZGAvIiRhY19kaXIiOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3BfYnVpbGRkaXI9JHthY190b3BfYnVpbGRkaXJ9Ljs7CisqKQorICBjYXNlICR7YWNfdG9wX2J1aWxkZGlyfS4gaW4KKyAgLikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworICAqKSBhY19hYnNfdG9wX2J1aWxkZGlyPSRhY19hYnNfYnVpbGRkaXIvJHthY190b3BfYnVpbGRkaXJ9Ljs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfc3JjZGlyPSRhY19zcmNkaXI7OworKikKKyAgY2FzZSAkYWNfc3JjZGlyIGluCisgIC4pIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyAgKikgYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY19zcmNkaXI7OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworKikKKyAgY2FzZSAkYWNfdG9wX3NyY2RpciBpbgorICAuKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfdG9wX3NyY2Rpcjs7CisgICopIGFjX2Fic190b3Bfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXIvJGFjX3RvcF9zcmNkaXI7OworICBlc2FjOzsKK2VzYWMKKworCisKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisgICAgcm0gLWYgIiRhY19maWxlIgorICBmaQorICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgPSB4LTsgdGhlbgorICAgIGNvbmZpZ3VyZV9pbnB1dD0KKyAgZWxzZQorICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAiCisgIGZpCisgIGNvbmZpZ3VyZV9pbnB1dD0kY29uZmlndXJlX2lucHV0IkdlbmVyYXRlZCBmcm9tIGBlY2hvICRhY19maWxlX2luIHwKKwkJCQkgICAgIHNlZCAncywuKi8sLCdgIGJ5IGNvbmZpZ3VyZS4iCisKKyAgIyBGaXJzdCBsb29rIGZvciB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlIGJ1aWxkIHRyZWUsIG90aGVyd2lzZSBpbiB0aGUKKyAgIyBzcmMgdHJlZS4KKyAgYWNfZmlsZV9pbnB1dHM9YElGUz06CisgICAgZm9yIGYgaW4gJGFjX2ZpbGVfaW47IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAtKSBlY2hvICR0bXAvc3RkaW4gOzsKKyAgICAgIFtcXC8kXSopCisJICMgQWJzb2x1dGUgKGNhbid0IGJlIERPUy1zdHlsZSwgYXMgSUZTPTopCisJIHRlc3QgLWYgIiRmIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCSBlY2hvICIkZiI7OworICAgICAgKikgIyBSZWxhdGl2ZQorCSBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKwkgICAjIEJ1aWxkIHRyZWUKKwkgICBlY2hvICIkZiIKKwkgZWxpZiB0ZXN0IC1mICIkc3JjZGlyLyRmIjsgdGhlbgorCSAgICMgU291cmNlIHRyZWUKKwkgICBlY2hvICIkc3JjZGlyLyRmIgorCSBlbHNlCisJICAgIyAvZGV2L251bGwgdHJlZQorCSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJIGZpOzsKKyAgICAgIGVzYWMKKyAgICBkb25lYCB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyAgc2VkICIkYWNfdnBzdWIKKyRleHRyYXN1YgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKzp0CisvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCitzLEBjb25maWd1cmVfaW5wdXRALCRjb25maWd1cmVfaW5wdXQsO3QgdAorcyxAc3JjZGlyQCwkYWNfc3JjZGlyLDt0IHQKK3MsQGFic19zcmNkaXJALCRhY19hYnNfc3JjZGlyLDt0IHQKK3MsQHRvcF9zcmNkaXJALCRhY190b3Bfc3JjZGlyLDt0IHQKK3MsQGFic190b3Bfc3JjZGlyQCwkYWNfYWJzX3RvcF9zcmNkaXIsO3QgdAorcyxAYnVpbGRkaXJALCRhY19idWlsZGRpciw7dCB0CitzLEBhYnNfYnVpbGRkaXJALCRhY19hYnNfYnVpbGRkaXIsO3QgdAorcyxAdG9wX2J1aWxkZGlyQCwkYWNfdG9wX2J1aWxkZGlyLDt0IHQKK3MsQGFic190b3BfYnVpbGRkaXJALCRhY19hYnNfdG9wX2J1aWxkZGlyLDt0IHQKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4kdG1wL291dAorICBybSAtZiAkdG1wL3N0ZGluCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICBtdiAkdG1wL291dCAkYWNfZmlsZQorICBlbHNlCisgICAgY2F0ICR0bXAvb3V0CisgICAgcm0gLWYgJHRtcC9vdXQKKyAgZmkKKworZG9uZQorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKworIworIyBDT05GSUdfSEVBREVSIHNlY3Rpb24uCisjCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyxeXChbCSBdKlwpI1woWwkgXSpkZWZpbmVbCSBdWwkgXSpcKScKK2FjX2RCPSdbCSBdLiokLFwxI1wyJworYWNfZEM9JyAnCithY19kRD0nLDt0JworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzLF5cKFsJIF0qXCkjXChbCSBdKlwpdW5kZWZcKFsJIF1bCSBdKlwpJworYWNfdUI9JyQsXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9Jyw7dCcKKworZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0hFQURFUlM7IGRvIHRlc3QgIngkYWNfZmlsZSIgPSB4OiAmJiBjb250aW51ZQorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgLSB8ICo6LSB8ICo6LToqICkgIyBpbnB1dCBmcm9tIHN0ZGluCisJY2F0ID4kdG1wL3N0ZGluCisJYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKwlhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqOiogKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7CisgICogKSAgIGFjX2ZpbGVfaW49JGFjX2ZpbGUuaW4gOzsKKyAgZXNhYworCisgIHRlc3QgeCIkYWNfZmlsZSIgIT0geC0gJiYgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKworICAjIEZpcnN0IGxvb2sgZm9yIHRoZSBpbnB1dCBmaWxlcyBpbiB0aGUgYnVpbGQgdHJlZSwgb3RoZXJ3aXNlIGluIHRoZQorICAjIHNyYyB0cmVlLgorICBhY19maWxlX2lucHV0cz1gSUZTPToKKyAgICBmb3IgZiBpbiAkYWNfZmlsZV9pbjsgZG8KKyAgICAgIGNhc2UgJGYgaW4KKyAgICAgIC0pIGVjaG8gJHRtcC9zdGRpbiA7OworICAgICAgW1xcLyRdKikKKwkgIyBBYnNvbHV0ZSAoY2FuJ3QgYmUgRE9TLXN0eWxlLCBhcyBJRlM9OikKKwkgdGVzdCAtZiAiJGYiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJICMgRG8gcXVvdGUgJGYsIHRvIHByZXZlbnQgRE9TIHBhdGhzIGZyb20gYmVpbmcgSUZTJ2QuCisJIGVjaG8gIiRmIjs7CisgICAgICAqKSAjIFJlbGF0aXZlCisJIGlmIHRlc3QgLWYgIiRmIjsgdGhlbgorCSAgICMgQnVpbGQgdHJlZQorCSAgIGVjaG8gIiRmIgorCSBlbGlmIHRlc3QgLWYgIiRzcmNkaXIvJGYiOyB0aGVuCisJICAgIyBTb3VyY2UgdHJlZQorCSAgIGVjaG8gIiRzcmNkaXIvJGYiCisJIGVsc2UKKwkgICAjIC9kZXYvbnVsbCB0cmVlCisJICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkgZmk7OworICAgICAgZXNhYworICAgIGRvbmVgIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorICAjIFJlbW92ZSB0aGUgdHJhaWxpbmcgc3BhY2VzLgorICBzZWQgJ3MvWwkgXSokLy8nICRhY19maWxlX2lucHV0cyA+JHRtcC9pbgorCitfQUNFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIHR3byBzZWQgc2NyaXB0cywgYGNvbmZ0ZXN0LmRlZmluZXMnIGFuZAorIyBgY29uZnRlc3QudW5kZWZzJywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCisjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBUaGUgZmlyc3QgaGFuZGxlcyBgI2RlZmluZScKKyMgdGVtcGxhdGVzLCBhbmQgdGhlIHNlY29uZCBgI3VuZGVmJyB0ZW1wbGF0ZXMuCisjIEFuZCBmaXJzdDogUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluCisjIGNvbmZpZy5zdGF0dXMuICBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudAorIyBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QuZGVmaW5lcyBjb25mdGVzdC51bmRlZnMKKyMgVXNpbmcgYSBoZXJlIGRvY3VtZW50IGluc3RlYWQgb2YgYSBzdHJpbmcgcmVkdWNlcyB0aGUgcXVvdGluZyBuaWdodG1hcmUuCisjIFB1dHRpbmcgY29tbWVudHMgaW4gc2VkIHNjcmlwdHMgaXMgbm90IHBvcnRhYmxlLgorIworIyBgZW5kJyBpcyB1c2VkIHRvIGF2b2lkIHRoYXQgdGhlIHNlY29uZCBtYWluIHNlZCBjb21tYW5kIChtZWFudCBmb3IKKyMgMC1hcnkgQ1BQIG1hY3JvcykgYXBwbGllcyB0byBuLWFyeSBtYWNybyBkZWZpbml0aW9ucy4KKyMgU2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIGZvciBgY2xlYXInLgorY2F0ID5jb25mZGVmMnNlZC5zZWQgPDxcX0FDRU9GCitzL1tcXCYsXS9cXCYvZworcyxbXFwkYF0sXFwmLGcKK3QgY2xlYXIKKzogY2xlYXIKK3MsXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qXChbXgkgKF1bXgkgKF0qXClcKChbXildKilcKVsJIF0qXCguKlwpJCwke2FjX2RBfVwxJHthY19kQn1cMVwyJHthY19kQ31cMyR7YWNfZER9LGdwCit0IGVuZAorcyxeWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSpcKFteCSBdW14JIF0qXClbCSBdKlwoLipcKSQsJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0sZ3AKKzogZW5kCitfQUNFT0YKKyMgSWYgc29tZSBtYWNyb3Mgd2VyZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB0aGVyZSBtaWdodCBiZSBzZXZlcmFsIHRpbWVzCisjIHRoZSBzYW1lICNkZWZpbmVzLCB3aGljaCBpcyB1c2VsZXNzLiAgTmV2ZXJ0aGVsZXNzLCB3ZSBtYXkgbm90IHdhbnQgdG8KKyMgc29ydCB0aGVtLCBzaW5jZSB3ZSB3YW50IHRoZSAqbGFzdCogQUMtREVGSU5FIHRvIGJlIGhvbm9yZWQuCit1bmlxIGNvbmZkZWZzLmggfCBzZWQgLW4gLWYgY29uZmRlZjJzZWQuc2VkID5jb25mdGVzdC5kZWZpbmVzCitzZWQgJ3MvYWNfZC9hY191L2cnIGNvbmZ0ZXN0LmRlZmluZXMgPmNvbmZ0ZXN0LnVuZGVmcworcm0gLWYgY29uZmRlZjJzZWQuc2VkCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+Y29uZnRlc3QudW5kZWZzIDw8XF9BQ0VPRgorcyxeWwkgXSojWwkgXSp1bmRlZlsJIF1bCSBdKlthLXpBLVpfXVthLXpBLVpfMC05XSosLyogJiAqLywKK19BQ0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LmRlZmluZXMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24gdGhlIHNpemUKKyMgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28gKDEwMCBjbWRzKS4KK2VjaG8gJyAgIyBIYW5kbGUgYWxsIHRoZSAjZGVmaW5lIHRlbXBsYXRlcyBvbmx5IGlmIG5lY2Vzc2FyeS4nID4+JENPTkZJR19TVEFUVVMKK2VjaG8gJyAgaWYgZ3JlcCAiXlsJIF0qI1sJIF0qZGVmaW5lIiAkdG1wL2luID4vZGV2L251bGw7IHRoZW4nID4+JENPTkZJR19TVEFUVVMKK2VjaG8gJyAgIyBJZiB0aGVyZSBhcmUgbm8gZGVmaW5lcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgaWYvZmknID4+JENPTkZJR19TVEFUVVMKK2VjaG8gJyAgOicgPj4kQ09ORklHX1NUQVRVUworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgZ3JlcCAuIGNvbmZ0ZXN0LmRlZmluZXMgPi9kZXYvbnVsbAorZG8KKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvICR0bXAvZGVmaW5lcy5zZWQuCisgIGVjaG8gJyAgY2F0ID4kdG1wL2RlZmluZXMuc2VkIDw8Q0VPRicgPj4kQ09ORklHX1NUQVRVUworICAjIFNwZWVkIHVwOiBkb24ndCBjb25zaWRlciB0aGUgbm9uIGAjZGVmaW5lJyBsaW5lcy4KKyAgZWNobyAnL15bCSBdKiNbCSBdKmRlZmluZS8hYicgPj4kQ09ORklHX1NUQVRVUworICAjIFdvcmsgYXJvdW5kIHRoZSBmb3JnZXQtdG8tcmVzZXQtdGhlLWZsYWcgYnVnLgorICBlY2hvICd0IGNscicgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICc6IGNscicgPj4kQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LmRlZmluZXMgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiAkdG1wL2RlZmluZXMuc2VkICR0bXAvaW4gPiR0bXAvb3V0CisgIHJtIC1mICR0bXAvaW4KKyAgbXYgJHRtcC9vdXQgJHRtcC9pbgorJyA+PiRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC5kZWZpbmVzID5jb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC5kZWZpbmVzCitkb25lCitybSAtZiBjb25mdGVzdC5kZWZpbmVzCitlY2hvICcgIGZpICMgZ3JlcCcgPj4kQ09ORklHX1NUQVRVUworZWNobyA+PiRDT05GSUdfU1RBVFVTCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudW5kZWZzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uIHRoZSBzaXplCisjIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vICgxMDAgY21kcykuCitlY2hvICcgICMgSGFuZGxlIGFsbCB0aGUgI3VuZGVmIHRlbXBsYXRlcycgPj4kQ09ORklHX1NUQVRVUworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgZ3JlcCAuIGNvbmZ0ZXN0LnVuZGVmcyA+L2Rldi9udWxsCitkbworICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gJHRtcC91bmRlZnMuc2VkLgorICBlY2hvICcgIGNhdCA+JHRtcC91bmRlZnMuc2VkIDw8Q0VPRicgPj4kQ09ORklHX1NUQVRVUworICAjIFNwZWVkIHVwOiBkb24ndCBjb25zaWRlciB0aGUgbm9uIGAjdW5kZWYnCisgIGVjaG8gJy9eWwkgXSojWwkgXSp1bmRlZi8hYicgPj4kQ09ORklHX1NUQVRVUworICAjIFdvcmsgYXJvdW5kIHRoZSBmb3JnZXQtdG8tcmVzZXQtdGhlLWZsYWcgYnVnLgorICBlY2hvICd0IGNscicgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICc6IGNscicgPj4kQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnVuZGVmcyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mICR0bXAvdW5kZWZzLnNlZCAkdG1wL2luID4kdG1wL291dAorICBybSAtZiAkdG1wL2luCisgIG12ICR0bXAvb3V0ICR0bXAvaW4KKycgPj4kQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudW5kZWZzID5jb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnVuZGVmcworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnVuZGVmcworZG9uZQorcm0gLWYgY29uZnRlc3QudW5kZWZzCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgPSB4LTsgdGhlbgorICAgIGVjaG8gIi8qIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLyIgPiR0bXAvY29uZmlnLmgKKyAgZWxzZQorICAgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovIiA+JHRtcC9jb25maWcuaAorICBmaQorICBjYXQgJHRtcC9pbiA+PiR0bXAvY29uZmlnLmgKKyAgcm0gLWYgJHRtcC9pbgorICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgaWYgZGlmZiAkYWNfZmlsZSAkdG1wL2NvbmZpZy5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKK2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorICAgIGVsc2UKKyAgICAgIGFjX2Rpcj1gKGRpcm5hbWUgIiRhY19maWxlIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgICB7IGlmICRhc19ta2Rpcl9wOyB0aGVuCisgICAgbWtkaXIgLXAgIiRhY19kaXIiCisgIGVsc2UKKyAgICBhc19kaXI9IiRhY19kaXIiCisgICAgYXNfZGlycz0KKyAgICB3aGlsZSB0ZXN0ICEgLWQgIiRhc19kaXIiOyBkbworICAgICAgYXNfZGlycz0iJGFzX2RpciAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gKGRpcm5hbWUgIiRhc19kaXIiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgZG9uZQorICAgIHRlc3QgISAtbiAiJGFzX2RpcnMiIHx8IG1rZGlyICRhc19kaXJzCisgIGZpIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisKKyAgICAgIHJtIC1mICRhY19maWxlCisgICAgICBtdiAkdG1wL2NvbmZpZy5oICRhY19maWxlCisgICAgZmkKKyAgZWxzZQorICAgIGNhdCAkdG1wL2NvbmZpZy5oCisgICAgcm0gLWYgJHRtcC9jb25maWcuaAorICBmaQorZG9uZQorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorCit7IChleGl0IDApOyBleGl0IDA7IH0KK19BQ0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKKworIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgorIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCisjIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgorIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCisjIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAorIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAorIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCisjIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgoraWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCisgIGFjX2NzX3N1Y2Nlc3M9OgorICBhY19jb25maWdfc3RhdHVzX2FyZ3M9CisgIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCisgICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCisgIGV4ZWMgNT4vZGV2L251bGwKKyAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQorICBleGVjIDU+PmNvbmZpZy5sb2cKKyAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKKyAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisgICRhY19jc19zdWNjZXNzIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorZmkKKwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9jb25maWd1cmUuaW4gYi9yZWFkbGluZS9leGFtcGxlcy9ybGZlL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY4NTQxCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw0MzggQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorCitBQ19JTklUKHJsZmUuYykKK0FDX0NPTkZJR19IRUFERVIoY29uZmlnLmgpCitWRVJTSU9OPTAuNAorQUNfU1VCU1QoVkVSU0lPTikKKworZG5sCitkbmwgRGVmaW5lIHNvbWUgdXNlZnVsIG1hY3JvcworZG5sCitBQ19ERUZVTihBQ19QUk9HUkFNX1NPVVJDRSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NQUF0pQUNfUFJPVklERShbJDBdKWNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorWyQxXQorX0NVVF9IRVJFXworWyQyXQorRU9GCitldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LmMgMj4mNSB8IHNlZCAtZSAnMSwvX0NVVF9IRVJFXy9kJyAtZSAncy8gLy9nJyA+IGNvbmZ0ZXN0Lm91dCIKKy4gLi9jb25mdGVzdC5vdXQKK3JtIC1mIGNvbmZ0ZXN0KgorXSlkbmwKK2RubAorZGVmaW5lKEFDX05PVEUsCitbZWNobyAiJDEiIDE+JkFDX0ZEX01TRworXSlkbmwKKworb2xkX0NGTEFHUz0iJENGTEFHUyIKK0FDX1BST0dfQ0MKK0FDX1BST0dfQ1BQCitBQ19QUk9HX0dDQ19UUkFESVRJT05BTAorQUNfSVNDX1BPU0lYCisKK0FDX1RSWV9SVU4obWFpbigpe2V4aXQoMCk7fSwsWworaWYgdGVzdCAkQ0MgIT0gY2MgOyB0aGVuCitBQ19OT1RFKFlvdXIgJENDIGZhaWxlZCAtIHJlc3RhcnRpbmcgd2l0aCBDQz1jYykKK0FDX05PVEUoKQorQ0M9Y2MKK2V4cG9ydCBDQworZXhlYyAkMCAkY29uZmlndXJlX2FyZ3MKK2ZpCitdKQorCitBQ19UUllfUlVOKG1haW4oKXtleGl0KDApO30sLAorZXhlYyA1PiYyCitldmFsICRhY19saW5rCitBQ19OT1RFKENDPSRDQzsgQ0ZMQUdTPSRDRkxBR1M7IExJQlM9JExJQlM7KQorQUNfTk9URSgkYWNfY29tcGlsZSkKK0FDX01TR19FUlJPUihDYW4ndCBydW4gdGhlIGNvbXBpbGVyIC0gc29ycnkpKQorCitBQ19UUllfUlVOKFsKK21haW4oKQoreworICBpbnQgX19zb21ldGhpbmdfc3RyYW5nZV8oKTsKKyAgX19zb21ldGhpbmdfc3RyYW5nZV8oMCk7Cit9CitdLEFDX01TR19FUlJPUihZb3VyIGNvbXBpbGVyIGRvZXMgbm90IHNldCB0aGUgZXhpdCBzdGF0dXMgLSBzb3JyeSkpCisKK0FDX1BST0dfQVdLCisKK2lmIHRlc3QgLWYgZXRjL3Rvb2xjaGVjazsgdGhlbgorQUNfQ0hFQ0tJTkcoZm9yIGJ1Z2d5IHRvb2xzKQorc2ggZXRjL3Rvb2xjaGVjayAxPiZBQ19GRF9NU0cKK2ZpCisKK2RubAorZG5sICAgICoqKiogIHNwZWNpYWwgdW5peCB2YXJpYW50cyAgKioqKgorZG5sCisKK0FDX0NIRUNLSU5HKGZvciBTeXN0ZW0gVikKK0FDX1RSWV9DT01QSUxFKAorWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPl0sIFtpbnQgeCA9IFNJR0NITEQgfCBGTkRFTEFZO10sICwgQUNfREVGSU5FKFNZU1YpKQorCitBQ19DSEVDS0lORyhmb3IgU29sYXJpcyAyLngpCitBQ19FR1JFUF9DUFAoeWVzLAorWyNpZiBkZWZpbmVkKFNWUjQpICYmIGRlZmluZWQoc3VuKQorICB5ZXMKKyNlbmRpZgorXSwgTElCUz0iJExJQlMgLWxzb2NrZXQgLWxuc2wgLWxrc3RhdCIpCisKK2RubAorZG5sICAgICoqKiogIHNlbGVjdCgpICAqKioqCitkbmwKKworQUNfQ0hFQ0tJTkcoc2VsZWN0KQorQUNfVFJZX0xJTksoLFtzZWxlY3QoMCwgMCwgMCwgMCwgMCk7XSwsIAorTElCUz0iJExJQlMgLWxuZXQgLWxuc2wiCitBQ19DSEVDS0lORyhzZWxlY3Qgd2l0aCAkTElCUykKK0FDX1RSWV9MSU5LKCxbc2VsZWN0KDAsIDAsIDAsIDAsIDApO10sLCAKK0FDX01TR19FUlJPUighISEgbm8gc2VsZWN0IC0gbm8gc2NyZWVuKSkKKykKK2RubAorZG5sICAgICoqKiogIGNoZWNrIHRoZSBzZWxlY3QgaW1wbGVtZW50YXRpb24gKioqKgorZG5sCisKK0FDX0NIRUNLSU5HKHNlbGVjdCByZXR1cm4gdmFsdWUpCitBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK2NoYXIgKm5hbSA9ICIvdG1wL2NvbmZ0ZXN0JCQiOworCisjaWZkZWYgTkFNRURQSVBFCisKKyNpZm5kZWYgT19OT05CTE9DSworI2RlZmluZSBPX05PTkJMT0NLIE9fTkRFTEFZCisjZW5kaWYKKyNpZm5kZWYgU19JRklGTworI2RlZmluZSBTX0lGSUZPIDAwMTAwMDAKKyNlbmRpZgorCisKK21haW4oKQoreworI2lmZGVmIEZEX1NFVAorICBmZF9zZXQgZjsKKyNlbHNlCisgIGludCBmOworI2VuZGlmCisKKyNpZmRlZiBfX0ZyZWVCU0RfXworLyogRnJvbSBBbmRyZXcgQS4gQ2hlcm5vdiAoYWNoZUBhc3RyYWwubXNrLnN1KToKKyAqIG9wZW5pbmcgUkRXUiBmaWZvIGZhaWxzIGluIEJTRCA0LjQsIGJ1dCBzZWxlY3QgcmV0dXJuIHZhbHVlcyBhcmUKKyAqIHJpZ2h0LgorICovCisgIGV4aXQoMCk7CisjZW5kaWYKKyAgKHZvaWQpYWxhcm0oNSk7CisjaWZkZWYgUE9TSVgKKyAgaWYgKG1rZmlmbyhuYW0sIDA3NzcpKQorI2Vsc2UKKyAgaWYgKG1rbm9kKG5hbSwgU19JRklGT3wwNzc3LCAwKSkKKyNlbmRpZgorICAgIGV4aXQoMSk7CisgIGNsb3NlKDApOworICBpZiAob3BlbihuYW0sIE9fUkRXUiB8IE9fTk9OQkxPQ0spKQorICAgIGV4aXQoMSk7CisgIGlmICh3cml0ZSgwLCAiVEVTVCIsIDQpID09IC0xKQorICAgIGV4aXQoMSk7CisKKyNlbHNlCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisKK21haW4oKQoreworICBpbnQgczEsIHMyLCBsOworICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYTsKKyNpZmRlZiBGRF9TRVQKKyAgZmRfc2V0IGY7CisjZWxzZQorICBpbnQgZjsKKyNlbmRpZgorCisgICh2b2lkKWFsYXJtKDUpOworICBpZiAoKHMxID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisgICAgZXhpdCgxKTsKKyAgYS5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgc3RyY3B5KGEuc3VuX3BhdGgsIG5hbSk7CisgICh2b2lkKSB1bmxpbmsobmFtKTsKKyAgaWYgKGJpbmQoczEsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmEsIHN0cmxlbihuYW0pKzIpID09IC0xKQorICAgIGV4aXQoMSk7CisgIGlmIChsaXN0ZW4oczEsIDIpKQorICAgIGV4aXQoMSk7CisgIGlmIChmb3JrKCkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoKHMyID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisJa2lsbChnZXRwcGlkKCksIDMpOworICAgICAgKHZvaWQpY29ubmVjdChzMiwgKHN0cnVjdCBzb2NrYWRkciAqKSZhLCBzdHJsZW4obmFtKSArIDIpOworICAgICAgaWYgKHdyaXRlKHMyLCAiSEVMTE8iLCA1KSA9PSAtMSkKKwlraWxsKGdldHBwaWQoKSwgMyk7CisgICAgICBleGl0KDApOworICAgIH0KKyAgbCA9IHNpemVvZihhKTsKKyAgY2xvc2UoMCk7CisgIGlmIChhY2NlcHQoczEsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYSwgJmwpKQorICAgIGV4aXQoMSk7CisjZW5kaWYKKworCisjaWZkZWYgRkRfU0VUCisgIEZEX1NFVCgwLCAmZik7CisjZWxzZQorICBmID0gMTsKKyNlbmRpZgorICBpZiAoc2VsZWN0KDEsICZmLCAwLCAwLCAwKSA9PSAtMSkKKyAgICBleGl0KDEpOworICBpZiAoc2VsZWN0KDEsICZmLCAmZiwgMCwgMCkgIT0gMikKKyAgICBleGl0KDEpOworICBleGl0KDApOworfQorXSxBQ19OT1RFKC0gc2VsZWN0IGlzIG9rKSwKK0FDX05PVEUoLSBzZWxlY3QgY2FuJ3QgY291bnQpIEFDX0RFRklORShTRUxFQ1RfQlJPS0VOKSkKKworZG5sCitkbmwgICAgKioqKiAgdGVybWNhcCBvciB0ZXJtaW5mbyAgKioqKgorZG5sCitBQ19DSEVDS0lORyhmb3IgdGdldGVudCkKK0FDX1RSWV9MSU5LKCx0Z2V0ZW50KChjaGFyICopMCwgKGNoYXIgKikwKTssLAorb2xpYnM9IiRMSUJTIgorTElCUz0iLWxjdXJzZXMgJG9saWJzIgorQUNfQ0hFQ0tJTkcobGliY3Vyc2VzKQorQUNfVFJZX0xJTksoLFsKKyNpZmRlZiBfX2hwdXgKK19fc29ycnlfaHB1eF9saWJjdXJzZXNfaXNfdG90YWxseV9icm9rZW5faW5fMTBfMTAoKTsKKyNlbHNlCit0Z2V0ZW50KChjaGFyICopMCwgKGNoYXIgKikwKTsKKyNlbmRpZgorXSwsCitMSUJTPSItbHRlcm1jYXAgJG9saWJzIgorQUNfQ0hFQ0tJTkcobGlidGVybWNhcCkKK0FDX1RSWV9MSU5LKCx0Z2V0ZW50KChjaGFyICopMCwgKGNoYXIgKikwKTssLAorTElCUz0iLWx0ZXJtbGliICRvbGlicyIKK0FDX0NIRUNLSU5HKGxpYnRlcm1saWIpCitBQ19UUllfTElOSygsdGdldGVudCgoY2hhciAqKTAsIChjaGFyICopMCk7LCwKK0xJQlM9Ii1sbmN1cnNlcyAkb2xpYnMiCitBQ19DSEVDS0lORyhsaWJuY3Vyc2VzKQorQUNfVFJZX0xJTksoLHRnZXRlbnQoKGNoYXIgKikwLCAoY2hhciAqKTApOywsCitBQ19NU0dfRVJST1IoISEhIG5vIHRnZXRlbnQgLSBubyBzY3JlZW4pKSkpKSkKKworQUNfVFJZX1JVTihbCittYWluKCkKK3sKKyBleGl0KHN0cmNtcCh0Z290bygiJXAxJWQiLCAwLCAxKSwgIjEiKSA/IDAgOiAxKTsKK31dLCBBQ19OT1RFKC0geW91IHVzZSB0aGUgdGVybWNhcCBkYXRhYmFzZSksCitBQ19OT1RFKC0geW91IHVzZSB0aGUgdGVybWluZm8gZGF0YWJhc2UpIEFDX0RFRklORShURVJNSU5GTykpCitBQ19DSEVDS0lORyhvc3BlZWQpCitBQ19UUllfTElOSyhleHRlcm4gc2hvcnQgb3NwZWVkOyxvc3BlZWQ9NTssLEFDX0RFRklORShORUVEX09TUEVFRCkpCisKK2RubAorZG5sICAgICoqKiogIFBUWSBzcGVjaWZpYyB0aGluZ3MgICoqKioKK2RubAorQUNfQ0hFQ0tJTkcoZm9yIC9kZXYvcHRjKQoraWYgdGVzdCAtciAvZGV2L3B0YzsgdGhlbgorQUNfREVGSU5FKEhBVkVfREVWX1BUQykKK2ZpCisKK0FDX0NIRUNLSU5HKGZvciBTVlI0IHB0eXMpCitzeXN2cjRwdHlzPQoraWYgdGVzdCAtYyAvZGV2L3B0bXggOyB0aGVuCitBQ19UUllfTElOSyhbXSxbcHRzbmFtZSgwKTtncmFudHB0KDApO3VubG9ja3B0KDApO10sW0FDX0RFRklORShIQVZFX1NWUjRfUFRZUykKK3N5c3ZyNHB0eXM9MV0pCitmaQorCitBQ19DSEVDS19GVU5DUyhnZXRwdCkKKworZG5sIGNoZWNrIGZvciBvcGVucHR5KCkKK2lmIHRlc3QgLXogIiRzeXN2cjRwdHlzIjsgdGhlbgorQUNfQ0hFQ0tfRlVOQ1Mob3BlbnB0eSwsCitbQUNfQ0hFQ0tfTElCKHV0aWwsb3BlbnB0eSwgW0FDX0RFRklORShIQVZFX09QRU5QVFkpXSBbTElCUz0iJExJQlMgLWx1dGlsIl0pXSkKK2ZpCisKK0FDX0NIRUNLSU5HKGZvciBwdHlyYW5nZXMpCitpZiB0ZXN0IC1kIC9kZXYvcHR5bSA7IHRoZW4KK3BkaXI9Jy9kZXYvcHR5bScKK2Vsc2UKK3BkaXI9Jy9kZXYnCitmaQorZG5sIFNDTyB1c2VzIHB0eXAlZAorQUNfRUdSRVBfQ1BQKHllcywKK1sjaWZkZWYgTV9VTklYCisgICB5ZXM7CisjZW5kaWYKK10sIHB0eXM9YGVjaG8gL2Rldi9wdHlwPz9gLCBwdHlzPWBlY2hvICRwZGlyL3B0eT8/YCkKK2RubCBpZiB0ZXN0IC1jIC9kZXYvcHR5cDE5OyB0aGVuCitkbmwgcHR5cz1gZWNobyAvZGV2L3B0eXA/P2AKK2RubCBlbHNlCitkbmwgcHR5cz1gZWNobyAkcGRpci9wdHk/P2AKK2RubCBmaQoraWYgdGVzdCAiJHB0eXMiICE9ICIkcGRpci9wdHk/PyIgOyB0aGVuCitwMD1gZWNobyAkcHR5cyB8IHRyICcgJyAnXDAxMicgfCBzZWQgLWUgJ3MvXi4qXCguXCkuJC9cMS9nJyB8IHNvcnQgLXUgfCB0ciAtZCAnXDAxMidgCitwMT1gZWNobyAkcHR5cyB8IHRyICcgJyAnXDAxMicgfCBzZWQgLWUgJ3MvXi4qXCguXCkkL1wxL2cnICB8IHNvcnQgLXUgfCB0ciAtZCAnXDAxMidgCitBQ19ERUZJTkVfVU5RVU9URUQoUFRZUkFOR0UwLCIkcDAiKQorQUNfREVGSU5FX1VOUVVPVEVEKFBUWVJBTkdFMSwiJHAxIikKK2ZpCisKK2RubCAgICAqKioqICBwdHkgbW9kZS9ncm91cCBoYW5kbGluZyAqKioqCitkbmwKK2RubCBzdXBwb3J0IHByb3ZpZGVkIGJ5IEx1a2UgTWV3YnVybiA8bG1Acm1pdC5lZHUuYXU+LCA5MzEyMjIKK0FDX0FSR19XSVRIKHB0eS1tb2RlLCBbICAtLXdpdGgtcHR5LW1vZGU9bW9kZSAgICBkZWZhdWx0IG1vZGUgZm9yIHB0eXNdLCBbIHB0eW1vZGU9IiR7d2l0aHZhbH0iIF0pCitBQ19BUkdfV0lUSChwdHktZ3JvdXAsIFsgIC0td2l0aC1wdHktZ3JvdXA9Z3JvdXAgIGRlZmF1bHQgZ3JvdXAgZm9yIHB0eXNdLCBbIHB0eWdycD0iJHt3aXRodmFsfSIgXSkKK3Rlc3QgLW4gIiRwdHltb2RlIiB8fCBwdHltb2RlPTA2MjAKK2lmIHRlc3QgLW4gIiRwdHlncnAiIDsgdGhlbgorQUNfREVGSU5FX1VOUVVPVEVEKFBUWU1PREUsICRwdHltb2RlKQorQUNfREVGSU5FX1VOUVVPVEVEKFBUWUdST1VQLCRwdHlncnApCitlbHNlCisKK0FDX0NIRUNLSU5HKGRlZmF1bHQgdHR5IHBlcm1pc3Npb25zL2dyb3VwKQorcm0gLWYgY29uZnRlc3RfZ3JwCitBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CittYWluKCkKK3sKKyAgc3RydWN0IHN0YXQgc2I7CisgIGNoYXIgKngsKnR0eW5hbWUoKTsKKyAgaW50IG9tLCBtOworICBGSUxFICpmcDsKKworICBpZiAoISh4ID0gdHR5bmFtZSgwKSkpIGV4aXQoMSk7CisgIGlmIChzdGF0KHgsICZzYikpIGV4aXQoMSk7CisgIG9tID0gc2Iuc3RfbW9kZTsKKyAgaWYgKG9tICYgMDAyKSBleGl0KDApOworICBtID0gc3lzdGVtKCJtZXNnIHkiKTsKKyAgaWYgKG0gPT0gLTEgfHwgbSA9PSAxMjcpIGV4aXQoMSk7CisgIGlmIChzdGF0KHgsICZzYikpIGV4aXQoMSk7CisgIG0gPSBzYi5zdF9tb2RlOworICBpZiAoY2htb2QoeCwgb20pKSBleGl0KDEpOworICBpZiAobSAmIDAwMikgZXhpdCgwKTsKKyAgaWYgKHNiLnN0X2dpZCA9PSBnZXRnaWQoKSkgZXhpdCgxKTsKKyAgaWYgKCEoZnA9Zm9wZW4oImNvbmZ0ZXN0X2dycCIsICJ3IikpKQorICAgIGV4aXQoMSk7CisgIGZwcmludGYoZnAsICIlZFxuIiwgc2Iuc3RfZ2lkKTsKKyAgZmNsb3NlKGZwKTsKKyAgZXhpdCgwKTsKK30KK10sWworICAgIGlmIHRlc3QgLWYgY29uZnRlc3RfZ3JwOyB0aGVuCisJcHR5Z3JwPWBjYXQgY29uZnRlc3RfZ3JwYAorCUFDX05PVEUoWy0gcHR5IG1vZGU6ICRwdHltb2RlLCBncm91cDogJHB0eWdycF0pCisJQUNfREVGSU5FX1VOUVVPVEVEKFBUWU1PREUsICRwdHltb2RlKQorCUFDX0RFRklORV9VTlFVT1RFRChQVFlHUk9VUCwkcHR5Z3JwKQorICAgIGVsc2UKKwlBQ19OT1RFKC0gcHR5cyBhcmUgd29ybGQgYWNjZXNzYWJsZSkKKyAgICBmaQorXSxbCisgICAgV1JJVEVQQVRIPScnCisgICAgWFRFUk1QQVRIPScnCisgICAgQUNfUEFUSF9QUk9HKFdSSVRFUEFUSCwgd3JpdGUpCisgICAgQUNfUEFUSF9QUk9HKFhURVJNUEFUSCwgeHRlcm0pCisgICAgZm91bmQ9CisgICAgaWYgdGVzdCAtbiAiJFdSSVRFUEFUSCRYVEVSTVBBVEgiOyB0aGVuCisgICAgICBmaW5kZm9sbG93PQorICAgICAgbHNmb2xsb3c9CisgICAgICBmb3VuZD1gZmluZCAkV1JJVEVQQVRIICRYVEVSTVBBVEggLWZvbGxvdyAtcHJpbnQgMj4vZGV2L251bGxgCisgICAgICBpZiB0ZXN0IC1uICIkZm91bmQiOyB0aGVuCisJZmluZGZvbGxvdz0tZm9sbG93CisJbHNmb2xsb3c9TAorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRYVEVSTVBBVEgiOyB0aGVuCisJcHR5Z3Jwbj1gbHMgLWwkbHNmb2xsb3cgJFhURVJNUEFUSCB8IHNlZCAtbiAtZSAxcCB8ICRBV0sgJ3twcmludCAkNH0nYAorCWlmIHRlc3QgdHR5ICE9ICIkcHR5Z3JwbiI7IHRoZW4KKwkgIFhURVJNUEFUSD0KKwlmaQorICAgICAgZmkKKyAgICBmaQorICAgIGlmIHRlc3QgLW4gIiRXUklURVBBVEgkWFRFUk1QQVRIIjsgdGhlbgorICAgICAgZm91bmQ9YGZpbmQgJFdSSVRFUEFUSCAkWFRFUk1QQVRIICRmaW5kZm9sbG93IC1wZXJtIC0yMDAwIC1wcmludGAgCisgICAgICBpZiB0ZXN0IC1uICIkZm91bmQiOyB0aGVuCisJcHR5Z3JwPWBscyAtbG4kbHNmb2xsb3cgJGZvdW5kIHwgc2VkIC1uIC1lIDFwIHwgJEFXSyAne3ByaW50ICQ0fSdgCisJQUNfTk9URShbLSBwdHkgbW9kZTogJHB0eW1vZGUsIGdyb3VwOiAkcHR5Z3JwXSkKKwlBQ19ERUZJTkVfVU5RVU9URUQoUFRZTU9ERSwgJHB0eW1vZGUpCisJQUNfREVGSU5FX1VOUVVPVEVEKFBUWUdST1VQLCRwdHlncnApCisgICAgICBlbHNlCisJQUNfTk9URSgtIHB0eXMgYXJlIHdvcmxkIGFjY2Vzc2FibGUpCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIEFDX05PVEUoLSBjYW4ndCBkZXRlcm1pbmUgLSBhc3N1bWUgcHR5cyBhcmUgd29ybGQgYWNjZXNzYWJsZSkKKyAgICBmaQorICBdCispCitybSAtZiBjb25mdGVzdF9ncnAKK2ZpCisKK2RubAorZG5sICAgICoqKiogIHNpZ25hbCBoYW5kbGluZyAgKioqKgorZG5sCitpZiB0ZXN0IC1uICIkcG9zaXgiIDsgdGhlbgorCitkbmwgUE9TSVggaGFzIHJlbGlhYmxlIHNpZ25hbHMgd2l0aCB2b2lkIHJldHVybiB0eXBlLgorQUNfTk9URShhc3N1bWluZyBwb3NpeCBzaWduYWwgZGVmaW5pdGlvbikKK0FDX0RFRklORShTSUdWT0lEKQorCitlbHNlCisKK0FDX0NIRUNLSU5HKHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycykKK0FDX1RSWV9DT01QSUxFKAorWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorZXh0ZXJuIHZvaWQgKCpzaWduYWwgKCkpICgpO10sIFtpbnQgaTtdLCBBQ19ERUZJTkUoU0lHVk9JRCkpCitBQ19DSEVDS0lORyhzaWdzZXQpCitBQ19UUllfTElOSyhbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CitdLFsKKyNpZmRlZiBTSUdWT0lECitzaWdzZXQoMCwgKHZvaWQgKCopKCkpMCk7CisjZWxzZQorc2lnc2V0KDAsIChpbnQgKCopKCkpMCk7CisjZW5kaWYKK10sIEFDX0RFRklORShVU0VTSUdTRVQpKQorQUNfQ0hFQ0tJTkcoc2lnbmFsIGltcGxlbWVudGF0aW9uKQorQUNfVFJZX1JVTihbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZm5kZWYgU0lHQ0xECisjZGVmaW5lIFNJR0NMRCBTSUdDSExECisjZW5kaWYKKyNpZmRlZiBVU0VTSUdTRVQKKyNkZWZpbmUgc2lnbmFsIHNpZ3NldAorI2VuZGlmCisKK2ludCBnb3Q7CisKKyNpZmRlZiBTSUdWT0lECit2b2lkCisjZW5kaWYKK2hhbmQoKQoreworICBnb3QrKzsKK30KKworbWFpbigpCit7CisgIC8qIG9uIGhwdXggd2UgdXNlIHNpZ3ZlYyB0byBnZXQgYnNkIHNpZ25hbHMgKi8KKyNpZmRlZiBfX2hwdXgKKyAgKHZvaWQpc2lnbmFsKFNJR0NMRCwgaGFuZCk7CisgIGtpbGwoZ2V0cGlkKCksIFNJR0NMRCk7CisgIGtpbGwoZ2V0cGlkKCksIFNJR0NMRCk7CisgIGlmIChnb3QgPCAyKQorICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgZXhpdCgwKTsKK30KK10sLEFDX0RFRklORShTWVNWU0lHUykpCisKK2ZpCisKK0FDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2V4YW1wbGVzL3JsZmUvZXh0ZXJuLmggYi9yZWFkbGluZS9leGFtcGxlcy9ybGZlL2V4dGVybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWNlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbGluZS9leGFtcGxlcy9ybGZlL2V4dGVybi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5My0yMDAyCisgKiAgICAgIEp1ZXJnZW4gV2VpZ2VydCAoam53ZWlnZXJAaW1tZDQuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGUpCisgKiAgICAgIE1pY2hhZWwgU2Nocm9lZGVyIChtbHNjaHJvZUBpbW1kNC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZSkKKyAqIENvcHlyaWdodCAoYykgMTk4NyBPbGl2ZXIgTGF1bWFubgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKHNlZSB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICRJZCQgRkFVCisgKi8KKworI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA8IDIKKyN1bmRlZiBfX2F0dHJpYnV0ZV9fCisjZGVmaW5lIF9fYXR0cmlidXRlX18oeCkKKyNlbmRpZgorCisvKiBwdHkuYyAqLworZXh0ZXJuIGludCAgIE9wZW5QVFkgX19QKChjaGFyICoqKSk7CitleHRlcm4gdm9pZCAgSW5pdFBUWSBfX1AoKGludCkpOworCmRpZmYgLS1naXQgYS9yZWFkbGluZS9leGFtcGxlcy9ybGZlL29zLmggYi9yZWFkbGluZS9leGFtcGxlcy9ybGZlL29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk5NGZlNgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRsaW5lL2V4YW1wbGVzL3JsZmUvb3MuaApAQCAtMCwwICsxLDUzMCBAQAorLyogQ29weXJpZ2h0IChjKSAxOTkzLTIwMDIKKyAqICAgICAgSnVlcmdlbiBXZWlnZXJ0IChqbndlaWdlckBpbW1kNC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZSkKKyAqICAgICAgTWljaGFlbCBTY2hyb2VkZXIgKG1sc2Nocm9lQGltbWQ0LmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlKQorICogQ29weXJpZ2h0IChjKSAxOTg3IE9saXZlciBMYXVtYW5uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoc2VlIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogJElkJCBGQVUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKy8qIEluIHN0cmljdCBBTlNJIG1vZGUsIEhQLVVYIG1hY2hpbmVzIGRlZmluZSBfX2hwdXggYnV0IG5vdCBocHV4ICovCisjaWYgZGVmaW5lZChfX2hwdXgpICYmICFkZWZpbmVkKGhwdXgpCisjIGRlZmluZSBocHV4CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19ic2RpX18pIHx8IGRlZmluZWQoX18zODZCU0RfXykgfHwgZGVmaW5lZChfQ1hfVVgpIHx8IGRlZmluZWQoaHB1eCkgfHwgZGVmaW5lZChfSUJNUjIpIHx8IGRlZmluZWQobGludXgpCisjIGluY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmIC8qIF9fYnNkaV9fIHx8IF9fMzg2QlNEX18gfHwgX0NYX1VYIHx8IGhwdXggfHwgX0lCTVIyIHx8IGxpbnV4ICovCisKKyNpZmRlZiBJU0MKKyMgaWZkZWYgRU5BTUVUT09MT05HCisjICB1bmRlZiBFTkFNRVRPT0xPTkcKKyMgZW5kaWYKKyMgaWZkZWYgRU5PVEVNUFRZCisjICB1bmRlZiBFTk9URU1QVFkKKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3lzL2JzZHR5cGVzLmg+CisjIGluY2x1ZGUgPG5ldC9lcnJuby5oPgorI2VuZGlmCisKKyNpZmRlZiBzdW4KKyMgZGVmaW5lIGdldHBncnAgX19nZXRwZ3JwCisjIGRlZmluZSBleGl0IF9fZXhpdAorI2VuZGlmCisjaWZkZWYgUE9TSVgKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGlmIGRlZmluZWQoX19TVERDX18pCisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYgLyogX19TVERDX18gKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2lmZGVmIHN1bgorIyB1bmRlZiBnZXRwZ3JwCisjIHVuZGVmIGV4aXQKKyNlbmRpZiAvKiBzdW4gKi8KKworI2lmbmRlZiBsaW51eCAvKiBhbGwgZG9uZSBpbiA8ZXJybm8uaD4gKi8KK2V4dGVybiBpbnQgZXJybm87CisjZW5kaWYgLyogbGludXggKi8KKyNpZm5kZWYgSEFWRV9TVFJFUlJPUgorLyogTm8gbWFjcm9zLCBwbGVhc2UgKi8KKyN1bmRlZiBzdHJlcnJvcgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChTWVNWKSAmJiAhZGVmaW5lZChsaW51eCkKKyMgaWZkZWYgTkVXU09TCisjICBkZWZpbmUgc3RybGVuIF9fX3N0cmxlbl9fXworIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgorIyAgdW5kZWYgc3RybGVuCisjIGVsc2UgLyogTkVXU09TICovCisjICBpbmNsdWRlIDxzdHJpbmdzLmg+CisjIGVuZGlmIC8qIE5FV1NPUyAqLworI2Vsc2UgLyogU1lTViAqLworIyBpZiBkZWZpbmVkKFNWUjQpIHx8IGRlZmluZWQoTkVXU09TKQorIyAgZGVmaW5lIHN0cmxlbiBfX19zdHJsZW5fX18KKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyAgdW5kZWYgc3RybGVuCisjICBpZiAhZGVmaW5lZChORVdTT1MpICYmICFkZWZpbmVkKF9faHB1eCkKKyAgICBleHRlcm4gc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICopOworIyAgZW5kaWYKKyMgZWxzZSAvKiBTVlI0ICovCisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgZW5kaWYgLyogU1ZSNCAqLworI2VuZGlmIC8qIFNZU1YgKi8KKworI2lmZGVmIFVTRVZBUkFSR1MKKyMgaWYgZGVmaW5lZChfX1NURENfXykKKyMgIGluY2x1ZGUgPHN0ZGFyZy5oPgorIyAgZGVmaW5lIFZBX0xJU1QodmFyKSB2YV9saXN0IHZhcjsKKyMgIGRlZmluZSBWQV9ET1RTIC4uLgorIyAgZGVmaW5lIFZBX0RFQ0wKKyMgIGRlZmluZSBWQV9TVEFSVChhcCwgZm10KSB2YV9zdGFydChhcCwgZm10KQorIyAgZGVmaW5lIFZBX0FSR1MoYXApIGFwCisjICBkZWZpbmUgVkFfRU5EKGFwKSB2YV9lbmQoYXApCisjIGVsc2UKKyMgIGluY2x1ZGUgPHZhcmFyZ3MuaD4KKyMgIGRlZmluZSBWQV9MSVNUKHZhcikgdmFfbGlzdCB2YXI7CisjICBkZWZpbmUgVkFfRE9UUyB2YV9hbGlzdAorIyAgZGVmaW5lIFZBX0RFQ0wgdmFfZGNsCisjICBkZWZpbmUgVkFfU1RBUlQoYXAsIGZtdCkgdmFfc3RhcnQoYXApCisjICBkZWZpbmUgVkFfQVJHUyhhcCkgYXAKKyMgIGRlZmluZSBWQV9FTkQoYXApIHZhX2VuZChhcCkKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBWQV9MSVNUKHZhcikKKyMgZGVmaW5lIFZBX0RPVFMgcDEsIHAyLCBwMywgcDQsIHA1LCBwNgorIyBkZWZpbmUgVkFfREVDTCB1bnNpZ25lZCBsb25nIFZBX0RPVFM7CisjIGRlZmluZSBWQV9TVEFSVChhcCwgZm10KQorIyBkZWZpbmUgVkFfQVJHUyhhcCkgVkFfRE9UUworIyBkZWZpbmUgVkFfRU5EKGFwKQorIyB1bmRlZiB2c25wcmludGYKKyMgZGVmaW5lIHZzbnByaW50ZiB4c25wcmludGYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChCNDMpICYmICFkZWZpbmVkKElTQykgJiYgIWRlZmluZWQocHlyKSAmJiAhZGVmaW5lZChfQ1hfVVgpCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpZmRlZiBNX1VOSVggICAvKiBTQ08gKi8KKyMgaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgorIyBpbmNsdWRlIDxzeXMvcHRlbS5oPgorIyBkZWZpbmUgZnRydW5jYXRlKGZkLCBzKSBjaHNpemUoZmQsIHMpCisjZW5kaWYKKworI2lmZGVmIFNZU1YKKyMgZGVmaW5lIGluZGV4IHN0cmNocgorIyBkZWZpbmUgcmluZGV4IHN0cnJjaHIKKyMgZGVmaW5lIGJ6ZXJvKHBvaSxsZW4pIG1lbXNldChwb2ksMCxsZW4pCisjIGRlZmluZSBiY21wIG1lbWNtcAorIyBkZWZpbmUga2lsbHBnKHBncnAsc2lnKSBraWxsKCAtKHBncnApLCBzaWcpCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dFVENXRAorIyBkZWZpbmUgZ2V0Y3dkKGIsbCkgZ2V0d2QoYikKKyNlbmRpZgorCisjaWZuZGVmIFVTRUJDT1BZCisjIGlmZGVmIFVTRU1FTU1PVkUKKyMgIGRlZmluZSBiY29weShzLGQsbGVuKSBtZW1tb3ZlKGQscyxsZW4pCisjIGVsc2UKKyMgIGlmZGVmIFVTRU1FTUNQWQorIyAgIGRlZmluZSBiY29weShzLGQsbGVuKSBtZW1jcHkoZCxzLGxlbikKKyMgIGVsc2UKKyMgICBkZWZpbmUgTkVFRF9PV05fQkNPUFkKKyMgICBkZWZpbmUgYmNvcHkgeGJjb3B5CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBocHV4CisjIGRlZmluZSBzZXRyZXVpZChydWlkLCBldWlkKSBzZXRyZXN1aWQocnVpZCwgZXVpZCwgLTEpCisjIGRlZmluZSBzZXRyZWdpZChyZ2lkLCBlZ2lkKSBzZXRyZXNnaWQocmdpZCwgZWdpZCwgLTEpCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9TRVRFVUlEKSB8fCBkZWZpbmVkKEhBVkVfU0VUUkVVSUQpCisjIGRlZmluZSBVU0VfU0VURVVJRAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX19FWElUKSAmJiAhZGVmaW5lZChfZXhpdCkKKyNkZWZpbmUgX2V4aXQoeCkgZXhpdCh4KQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9VVElNRVMKKyMgZGVmaW5lIHV0aW1lcyB1dGltZQorI2VuZGlmCisKKyNpZmRlZiBCVUlMVElOX1RFTE5FVAorIyBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjIGluY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVTRV9MT0NBTEUpICYmICghZGVmaW5lZChIQVZFX1NFVExPQ0FMRSkgfHwgIWRlZmluZWQoSEFWRV9TVFJGVElNRSkpCisjIHVuZGVmIFVTRV9MT0NBTEUKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgIHRlcm1pbmFsIGhhbmRsaW5nCisgKi8KKworI2lmZGVmIFBPU0lYCisjIGluY2x1ZGUgPHRlcm1pb3MuaD4KKyMgaWZkZWYgaHB1eAorIyAgaW5jbHVkZSA8YnNkdHR5Lmg+CisjIGVuZGlmIC8qIGhwdXggKi8KKyMgaWZkZWYgTkNDUworIyAgZGVmaW5lIE1BWENDIE5DQ1MKKyMgZWxzZQorIyAgZGVmaW5lIE1BWENDIDI1NgorIyBlbmRpZgorI2Vsc2UgLyogUE9TSVggKi8KKyMgaWZkZWYgVEVSTUlPCisjICBpbmNsdWRlIDx0ZXJtaW8uaD4KKyMgIGlmZGVmIE5DQworIyAgIGRlZmluZSBNQVhDQyBOQ0MKKyMgIGVsc2UKKyMgICBkZWZpbmUgTUFYQ0MgMjU2CisjICBlbmRpZgorIyAgaWZkZWYgQ1lURVJNSU8KKyMgICBpbmNsdWRlIDxjeXRlcm1pby5oPgorIyAgZW5kaWYKKyMgZWxzZSAvKiBURVJNSU8gKi8KKyMgIGluY2x1ZGUgPHNndHR5Lmg+CisjIGVuZGlmIC8qIFRFUk1JTyAqLworI2VuZGlmIC8qIFBPU0lYICovCisKKyNpZm5kZWYgVkRJU0FCTEUKKyMgaWZkZWYgX1BPU0lYX1ZESVNBQkxFCisjICBkZWZpbmUgVkRJU0FCTEUgX1BPU0lYX1ZESVNBQkxFCisjIGVsc2UKKyMgIGRlZmluZSBWRElTQUJMRSAwMzc3CisjIGVuZGlmIC8qIF9QT1NJWF9WRElTQUJMRSAqLworI2VuZGlmIC8qICFWRElTQUJMRSAqLworCisKKy8qIG9uIHNnaSwgcmVnYXJkbGVzcyBvZiB0aGUgc3RyZWFtIGhlYWQncyByZWFkIG1vZGUgKFJOT1JNL1JNU0dOL1JNU0dEKQorICogVElPQ1BLVCBtb2RlIGNhdXNlcyBkYXRhIGxvc3MgaWYgb3VyIGJ1ZmZlciBpcyB0b28gc21hbGwgKElPU0laRSkKKyAqIHRvIGhvbGQgdGhlIHdob2xlIHBhY2tldCBhdCBmaXJzdCByZWFkKCkuCisgKiAoTWFyYyBCb3VjaGVyKQorICoKKyAqIG1hdHRoZXcgZ3JlZW46CisgKiBUSU9DUEtUIGlzIGJyb2tlbiBvbiBkZ3V4IDUuNC4xIGdlbmVyaWMgQVZpaU9OIG1jODgxMDAKKyAqCisgKiBKb2UgVHJhaXN0ZXI6IE9uIEFJWDQsIHByb2dyYW1zIGxpa2UgaXJjIHdvbid0IHdvcmsgaWYgc2NyZWVuCisgKiB1c2VzIFRJT0NQS1QgKHNlbGVjdCBmYWlscyB0byByZXR1cm4gb24gcHR5IHJlYWQpLgorICovCisjaWYgZGVmaW5lZChzZ2kpIHx8IGRlZmluZWQoREdVWCkgfHwgZGVmaW5lZChfSUJNUjIpCisjIHVuZGVmIFRJT0NQS1QKKyNlbmRpZgorCisvKiBsaW51eCBuY3Vyc2VzIGlzIGJyb2tlbiwgd2UgaGF2ZSB0byB1c2Ugb3VyIG93biB0cHV0cyAqLworI2lmIGRlZmluZWQobGludXgpICYmIGRlZmluZWQoVEVSTUlORk8pCisjIGRlZmluZSB0cHV0cyB4dHB1dHMKKyNlbmRpZgorCisvKiBBbGV4YW5kcmUgT2xpdmE6IFNWUjQgc3R5bGUgcHR5cyBkb24ndCB3b3JrIHdpdGggb3NmICovCisjaWZkZWYgX19vc2ZfXworIyB1bmRlZiBIQVZFX1NWUjRfUFRZUworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICB1dG1wIGhhbmRsaW5nCisgKi8KKworI2lmZGVmIEdFVFVURU5UCisgIHR5cGVkZWYgY2hhciAqc2xvdF90OworI2Vsc2UKKyAgdHlwZWRlZiBpbnQgc2xvdF90OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVUTVBPSykgfHwgZGVmaW5lZChCVUdHWUdFVExPR0lOKQorIyBpZiBkZWZpbmVkKFNWUjQpICYmICFkZWZpbmVkKERHVVgpICYmICFkZWZpbmVkKF9faHB1eCkgJiYgIWRlZmluZWQobGludXgpCisjICBpbmNsdWRlIDx1dG1weC5oPgorIyAgZGVmaW5lIFVUTVBGSUxFCVVUTVBYX0ZJTEUKKyMgIGRlZmluZSB1dG1wCQl1dG1weAorIyAgZGVmaW5lIGdldHV0ZW50CWdldHV0eGVudAorIyAgZGVmaW5lIGdldHV0aWQJZ2V0dXR4aWQKKyMgIGRlZmluZSBnZXR1dGxpbmUJZ2V0dXR4bGluZQorIyAgZGVmaW5lIHB1dHV0bGluZQlwdXR1dHhsaW5lCisjICBkZWZpbmUgc2V0dXRlbnQJc2V0dXR4ZW50CisjICBkZWZpbmUgZW5kdXRlbnQJZW5kdXR4ZW50CisjICBkZWZpbmUgdXRfdGltZQl1dF94dGltZQorIyBlbHNlIC8qIFNWUjQgKi8KKyMgIGluY2x1ZGUgPHV0bXAuaD4KKyMgZW5kaWYgLyogU1ZSNCAqLworIyBpZmRlZiBhcG9sbG8KKyAgIC8qIAorICAgICogV2UgZG9uJ3QgaGF2ZSBHRVRVVEVOVCwgc28gd2UgZGlnIGludG8gdXRtcCBvdXJzZWx2ZXMuCisgICAgKiBCdXQgd2Ugc2F2ZSB0aGUgcGVybWFuZW50IGZpbGVkZXNjcmlwdG9yIGFuZAorICAgICogb3BlbiB1dG1wIGp1c3Qgd2hlbiB3ZSBuZWVkIHRvLiAKKyAgICAqIFRoaXMgY29kZSBzdXBwb3J0cyBhbiB1bnNvcnRlZCB1dG1wLiBqdy4KKyAgICAqLworIyAgZGVmaW5lIFVUTk9LRUVQCisjIGVuZGlmIC8qIGFwb2xsbyAqLworCisjIGlmbmRlZiBVVE1QRklMRQorIyAgaWZkZWYgVVRNUF9GSUxFCisjICAgZGVmaW5lIFVUTVBGSUxFCVVUTVBfRklMRQorIyAgZWxzZQorIyAgIGlmZGVmIF9QQVRIX1VUTVAKKyMgICAgZGVmaW5lIFVUTVBGSUxFCV9QQVRIX1VUTVAKKyMgICBlbHNlCisjICAgIGRlZmluZSBVVE1QRklMRQkiL2V0Yy91dG1wIgorIyAgIGVuZGlmIC8qIF9QQVRIX1VUTVAgKi8KKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZiAvKiBVVE1QT0sgfHwgQlVHR1lHRVRMT0dJTiAqLworCisjaWYgIWRlZmluZWQoVVRNUE9LKSAmJiBkZWZpbmVkKFVTUkxJTUlUKQorIyB1bmRlZiBVU1JMSU1JVAorI2VuZGlmCisKKyNpZmRlZiBMT0dPVVRPSworIyBpZm5kZWYgTE9HSU5ERUZBVUxUCisjICBkZWZpbmUgTE9HSU5ERUZBVUxUIDAKKyMgZW5kaWYKKyNlbHNlCisjIGlmZGVmIExPR0lOREVGQVVMVAorIyAgdW5kZWYgTE9HSU5ERUZBVUxUCisjIGVuZGlmCisjIGRlZmluZSBMT0dJTkRFRkFVTFQgMQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICBmaWxlIHN0dWZmCisgKi8KKworI2lmbmRlZiBGX09LCisjZGVmaW5lIEZfT0sgMAorI2VuZGlmCisjaWZuZGVmIFhfT0sKKyNkZWZpbmUgWF9PSyAxCisjZW5kaWYKKyNpZm5kZWYgV19PSworI2RlZmluZSBXX09LIDIKKyNlbmRpZgorI2lmbmRlZiBSX09LCisjZGVmaW5lIFJfT0sgNAorI2VuZGlmCisKKyNpZm5kZWYgU19JRklGTworI2RlZmluZSBTX0lGSUZPICAwMDEwMDAwCisjZW5kaWYKKyNpZm5kZWYgU19JUkVBRAorI2RlZmluZSBTX0lSRUFEICAwMDAwNDAwCisjZW5kaWYKKyNpZm5kZWYgU19JV1JJVEUKKyNkZWZpbmUgU19JV1JJVEUgMDAwMDIwMAorI2VuZGlmCisjaWZuZGVmIFNfSUVYRUMKKyNkZWZpbmUgU19JRVhFQyAgMDAwMDEwMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNfSUZJRk8pICYmIGRlZmluZWQoU19JRk1UKSAmJiAhZGVmaW5lZChTX0lTRklGTykKKyNkZWZpbmUgU19JU0ZJRk8obW9kZSkgKCgobW9kZSkgJiBTX0lGTVQpID09IFNfSUZJRk8pCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNfSUZTT0NLKSAmJiBkZWZpbmVkKFNfSUZNVCkgJiYgIWRlZmluZWQoU19JU1NPQ0spCisjZGVmaW5lIFNfSVNTT0NLKG1vZGUpICgoKG1vZGUpICYgU19JRk1UKSA9PSBTX0lGU09DSykKKyNlbmRpZgorI2lmIGRlZmluZWQoU19JRkNIUikgJiYgZGVmaW5lZChTX0lGTVQpICYmICFkZWZpbmVkKFNfSVNDSFIpCisjZGVmaW5lIFNfSVNDSFIobW9kZSkgKCgobW9kZSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNfSUZESVIpICYmIGRlZmluZWQoU19JRk1UKSAmJiAhZGVmaW5lZChTX0lTRElSKQorI2RlZmluZSBTX0lTRElSKG1vZGUpICgoKG1vZGUpICYgU19JRk1UKSA9PSBTX0lGRElSKQorI2VuZGlmCisjaWYgZGVmaW5lZChTX0lGTE5LKSAmJiBkZWZpbmVkKFNfSUZNVCkgJiYgIWRlZmluZWQoU19JU0xOSykKKyNkZWZpbmUgU19JU0xOSyhtb2RlKSAoKChtb2RlKSAmIFNfSUZNVCkgPT0gU19JRkxOSykKKyNlbmRpZgorCisvKgorICogU3VuT1MgNC4xLjM6IGBtYW4gMlYgb3BlbicgaGFzIG9ubHkgb25lIGxpbmUgdGhhdCBtZW50aW9ucyBPX05PQkxPQ0s6CisgKgorICogICAgIE9fTk9OQkxPQ0sgICAgIFNhbWUgYXMgT19OREVMQVkgYWJvdmUuCisgKgorICogb24gdGhlIHZlcnkgc2FtZSBTdW5PUyA0LjEuMywgSSB0cmFjZWQgdGhlIG9wZW4gc3lzdGVtIGNhbGwgYW5kIGZvdW5kCisgKiB0aGF0IGFuIG9wZW4oIi9kZXYvdHR5eTA4IiwgT19SRFdSfE9fTk9OQkxPQ0t8T19OT0NUVFkpIHdhcyBibG9ja2VkLAorICogd2hlcmVhcyBvcGVuKCIvZGV2L3R0eXkwOCIsIE9fUkRXUnxPX05ERUxBWSAgfE9fTk9DVFRZKSB3ZW50IHRocm91Z2guCisgKgorICogRm9yIHRoaXMgc2ltcGxlIHJlYXNvbiBJIG5vdyBmYXZvdXIgT19OREVMQVkuIGp3LiA0LjUuOTUKKyAqLworI2lmIGRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChTVlI0KQorIyB1bmRlZiBPX05PTkJMT0NLCisjZW5kaWYKKworI2lmICFkZWZpbmVkKE9fTk9OQkxPQ0spICYmIGRlZmluZWQoT19OREVMQVkpCisjIGRlZmluZSBPX05PTkJMT0NLIE9fTkRFTEFZCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZOQkxPQ0spICYmIGRlZmluZWQoRk5PTkJMT0NLKQorIyBkZWZpbmUgRk5CTE9DSyBGTk9OQkxPQ0sKKyNlbmRpZgorI2lmICFkZWZpbmVkKEZOQkxPQ0spICYmIGRlZmluZWQoRk5ERUxBWSkKKyMgZGVmaW5lIEZOQkxPQ0sgRk5ERUxBWQorI2VuZGlmCisjaWYgIWRlZmluZWQoRk5CTE9DSykgJiYgZGVmaW5lZChPX05PTkJMT0NLKQorIyBkZWZpbmUgRk5CTE9DSyBPX05PTkJMT0NLCisjZW5kaWYKKworI2lmbmRlZiBQT1NJWAorI3VuZGVmIG1rZmlmbworI2RlZmluZSBta2ZpZm8obixtKSBta25vZChuLFNfSUZJRk98KG0pLDApCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfTFNUQVQpICYmICFkZWZpbmVkKGxzdGF0KQorIyBkZWZpbmUgbHN0YXQgc3RhdAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgc2lnbmFsIGhhbmRsaW5nCisgKi8KKworI2lmZGVmIFNJR1ZPSUQKKyMgZGVmaW5lIFNJR1JFVFVSTgorIyBkZWZpbmUgc2lncmV0X3Qgdm9pZAorI2Vsc2UKKyMgZGVmaW5lIFNJR1JFVFVSTiByZXR1cm4gMDsKKyMgZGVmaW5lIHNpZ3JldF90IGludAorI2VuZGlmCisKKy8qIEdlZWVlZSwgcmV2ZXJzZSBpdD8gKi8KKyNpZiBkZWZpbmVkKFNWUjQpIHx8IChkZWZpbmVkKFNZU1YpICYmIGRlZmluZWQoSVNDKSkgfHwgZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKHVsdHJpeCkgfHwgZGVmaW5lZChfXzM4NkJTRF9fKSB8fCBkZWZpbmVkKF9fYnNkaV9fKSB8fCBkZWZpbmVkKFBPU0lYKSB8fCBkZWZpbmVkKE5lWFQpCisjIGRlZmluZSBTSUdIQVNBUkcKKyNlbmRpZgorCisjaWZkZWYgU0lHSEFTQVJHCisjIGRlZmluZSBTSUdQUk9UT0FSRyAgIChpbnQpCisjIGRlZmluZSBTSUdERUZBUkcgICAgIChzaWdzaWcpIGludCBzaWdzaWc7CisjIGRlZmluZSBTSUdBUkcgICAgICAgIDAKKyNlbHNlCisjIGRlZmluZSBTSUdQUk9UT0FSRyAgICh2b2lkKQorIyBkZWZpbmUgU0lHREVGQVJHICAgICAoKQorIyBkZWZpbmUgU0lHQVJHCisjZW5kaWYKKworI2lmbmRlZiBTSUdDSExECisjZGVmaW5lIFNJR0NITEQgU0lHQ0xECisjZW5kaWYKKworI2lmIGRlZmluZWQoUE9TSVgpIHx8IGRlZmluZWQoaHB1eCkKKyMgZGVmaW5lIHNpZ25hbCB4c2lnbmFsCisjZWxzZQorIyBpZmRlZiBVU0VTSUdTRVQKKyMgIGRlZmluZSBzaWduYWwgc2lnc2V0CisjIGVuZGlmIC8qIFVTRVNJR1NFVCAqLworI2VuZGlmCisKKy8qIHVzZWQgaW4gc2NyZWVuLmMgYW5kIGF0dGFjaGVyLmMgKi8KKyNpZm5kZWYgTlNJRwkJLyoga2JlYWwgbmVlZHMgdGhlc2Ugdy9vIFNZU1YgKi8KKyMgZGVmaW5lIE5TSUcgMzIKKyNlbmRpZiAvKiAhTlNJRyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgV2FpdCBzdHVmZgorICovCisKKyNpZiAoIWRlZmluZWQoc3lzVjY4KSAmJiAhZGVmaW5lZChNX1hFTklYKSkgfHwgZGVmaW5lZChOZVhUKSB8fCBkZWZpbmVkKE1fVU5JWCkKKyMgaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNlbmRpZgorCisjaWZuZGVmIFdURVJNU0lHCisjIGlmbmRlZiBCU0RXQUlUIC8qIGlmIHdhaXQgaXMgTk9UIGEgdW5pb246ICovCisjICBkZWZpbmUgV1RFUk1TSUcoc3RhdHVzKSAoc3RhdHVzICYgMDE3NykKKyMgZWxzZQorIyAgZGVmaW5lIFdURVJNU0lHKHN0YXR1cykgc3RhdHVzLndfVC53X1Rlcm1zaWcgCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXU1RPUFNJRworIyBpZm5kZWYgQlNEV0FJVCAvKiBpZiB3YWl0IGlzIE5PVCBhIHVuaW9uOiAqLworIyAgZGVmaW5lIFdTVE9QU0lHKHN0YXR1cykgKChzdGF0dXMgPj4gOCkgJiAwMzc3KQorIyBlbHNlCisjICBkZWZpbmUgV1NUT1BTSUcoc3RhdHVzKSBzdGF0dXMud19TLndfU3RvcHNpZyAKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBORVQtMiB1c2VzIFdDT1JFRFVNUCAqLworI2lmIGRlZmluZWQoV0NPUkVEVU1QKSAmJiAhZGVmaW5lZChXSUZDT1JFU0lHKQorIyBkZWZpbmUgV0lGQ09SRVNJRyhzdGF0dXMpIFdDT1JFRFVNUChzdGF0dXMpCisjZW5kaWYKKworI2lmbmRlZiBXSUZDT1JFU0lHCisjIGlmbmRlZiBCU0RXQUlUIC8qIGlmIHdhaXQgaXMgTk9UIGEgdW5pb246ICovCisjICBkZWZpbmUgV0lGQ09SRVNJRyhzdGF0dXMpIChzdGF0dXMgJiAwMjAwKQorIyBlbHNlCisjICBkZWZpbmUgV0lGQ09SRVNJRyhzdGF0dXMpIHN0YXR1cy53X1Qud19Db3JlZHVtcAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0VYSVRTVEFUVVMKKyMgaWZuZGVmIEJTRFdBSVQgLyogaWYgd2FpdCBpcyBOT1QgYSB1bmlvbjogKi8KKyMgIGRlZmluZSBXRVhJVFNUQVRVUyhzdGF0dXMpICgoc3RhdHVzID4+IDgpICYgMDM3NykKKyMgZWxzZQorIyAgZGVmaW5lIFdFWElUU1RBVFVTKHN0YXR1cykgc3RhdHVzLndfVC53X1JldGNvZGUKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgc2VsZWN0IHN0dWZmCisgKi8KKworI2lmIGRlZmluZWQoTV9YRU5JWCkgfHwgZGVmaW5lZChNX1VOSVgpIHx8IGRlZmluZWQoX1NFUVVFTlRfKQorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4JCS8qIGZvciB0aW1ldmFsICsgRkQuLi4gKi8KKyNlbmRpZgorCisvKgorICogU3VuT1MgMy41IC0gVG9tIFNjaG1pZHQgLSBNaWNyb24gU2VtaWNvbmR1Y3RvciwgSW5jIC0gMjctSnVsLTkzCisgKiB0c2NobWlkdEB2YXgubWljcm9uLmNvbQorICovCisjaWZuZGVmIEZEX1NFVAorIyBpZm5kZWYgU1VOT1MzCit0eXBlZGVmIHN0cnVjdCBmZF9zZXQgeyBpbnQgZmRzX2JpdHNbMV07IH0gZmRfc2V0OworIyBlbmRpZgorIyBkZWZpbmUgRkRfWkVSTyhmZCkgKChmZCktPmZkc19iaXRzWzBdID0gMCkKKyMgZGVmaW5lIEZEX1NFVChiLCBmZCkgKChmZCktPmZkc19iaXRzWzBdIHw9IDEgPDwgKGIpKQorIyBkZWZpbmUgRkRfSVNTRVQoYiwgZmQpICgoZmQpLT5mZHNfYml0c1swXSAmIDEgPDwgKGIpKQorIyBkZWZpbmUgRkRfU0VUU0laRSAzMgorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICB1c2VyIGRlZmluZWFibGUgc3R1ZmYKKyAqLworCisjaWZuZGVmIFRFUk1DQVBfQlVGU0laRQorIyBkZWZpbmUgVEVSTUNBUF9CVUZTSVpFIDIwNDgKKyNlbmRpZgorCisjaWZuZGVmIE1BWFBBVEhMRU4KKyMgZGVmaW5lIE1BWFBBVEhMRU4gMTAyNAorI2VuZGlmCisKKy8qIAorICogeW91IG1heSB0cnkgdG8gdmFyeSB0aGlzIHZhbHVlLiBVc2UgbG93IHZhbHVlcyBpZiB5b3VyIChWTVMpIHN5c3RlbQorICogdGVuZHMgdG8gY2hva2Ugd2hlbiBwYXN0aW5nLiBVc2UgaGlnaCB2YWx1ZXMgaWYgeW91IHdhbnQgdG8gdGVzdAorICogaG93IG1hbnkgY2hhcmFjdGVycyB5b3VyIHB0eSdzIGNhbiBidWZmZXIuCisgKi8KKyNkZWZpbmUgSU9TSVpFCQk0MDk2CisKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2V4YW1wbGVzL3JsZmUvcHR5LmMgYi9yZWFkbGluZS9leGFtcGxlcy9ybGZlL3B0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OWQ0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbGluZS9leGFtcGxlcy9ybGZlL3B0eS5jCkBAIC0wLDAgKzEsMzg3IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTMtMjAwMgorICogICAgICBKdWVyZ2VuIFdlaWdlcnQgKGpud2VpZ2VyQGltbWQ0LmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlKQorICogICAgICBNaWNoYWVsIFNjaHJvZWRlciAobWxzY2hyb2VAaW1tZDQuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGUpCisgKiBDb3B5cmlnaHQgKGMpIDE5ODcgT2xpdmVyIExhdW1hbm4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChzZWUgdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInNjcmVlbi5oIgorCisjaWZuZGVmIHN1bgorIyBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorCisvKiBmb3Igc29sYXJpcyAyLjEsIFVuaXh3YXJlIChTVlI0LjIpIGFuZCBwb3NzaWJseSBvdGhlcnMgKi8KKyNpZmRlZiBIQVZFX1NWUjRfUFRZUworIyBpbmNsdWRlIDxzeXMvc3Ryb3B0cy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKHN1bikgJiYgZGVmaW5lZChMT0NLUFRZKSAmJiAhZGVmaW5lZChUSU9DRVhDTCkKKyMgaW5jbHVkZSA8c3lzL3R0b2xkLmg+CisjZW5kaWYKKworI2lmZGVmIElTQworIyBpbmNsdWRlIDxzeXMvdHR5Lmg+CisjIGluY2x1ZGUgPHN5cy9zaW9jdGwuaD4KKyMgaW5jbHVkZSA8c3lzL3B0eS5oPgorI2VuZGlmCisKKyNpZmRlZiBzZ2kKKyMgaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2VuZGlmIC8qIHNnaSAqLworCisjaW5jbHVkZSAiZXh0ZXJuLmgiCisKKy8qCisgKiBpZiBubyBQVFlSQU5HRVswMV0gaXMgaW4gdGhlIGNvbmZpZyBmaWxlLCB3ZSBwaWNrIGEgZGVmYXVsdAorICovCisjaWZuZGVmIFBUWVJBTkdFMAorIyBkZWZpbmUgUFRZUkFOR0UwICJxcHIiCisjZW5kaWYKKyNpZm5kZWYgUFRZUkFOR0UxCisjIGRlZmluZSBQVFlSQU5HRTEgIjAxMjM0NTY3ODlhYmNkZWYiCisjZW5kaWYKKworLyogU1ZSNCBwc2V1ZG8gdHR5cyBkb24ndCBzZWVtIHRvIHdvcmsgd2l0aCBTQ08tNSAqLworI2lmZGVmIE1fVU5JWAorIyB1bmRlZiBIQVZFX1NWUjRfUFRZUworI2VuZGlmCisKK2V4dGVybiBpbnQgZWZmX3VpZDsKKworLyogdXNlZCBmb3Igb3BlbmluZyBhIG5ldyBwdHktcGFpcjogKi8KK3N0YXRpYyBjaGFyIFB0eU5hbWVbMzJdLCBUdHlOYW1lWzMyXTsKKworI2lmICEoZGVmaW5lZChzZXF1ZW50KSB8fCBkZWZpbmVkKF9TRVFVRU5UXykgfHwgZGVmaW5lZChIQVZFX1NWUjRfUFRZUykpCisjIGlmZGVmIGhwdXgKK3N0YXRpYyBjaGFyIFB0eVByb3RvW10gPSAiL2Rldi9wdHltL3B0eVhZIjsKK3N0YXRpYyBjaGFyIFR0eVByb3RvW10gPSAiL2Rldi9wdHkvdHR5WFkiOworIyBlbHNlCisjICBpZmRlZiBNX1VOSVgKK3N0YXRpYyBjaGFyIFB0eVByb3RvW10gPSAiL2Rldi9wdHlwWFkiOworc3RhdGljIGNoYXIgVHR5UHJvdG9bXSA9ICIvZGV2L3R0eXBYWSI7CisjICBlbHNlCitzdGF0aWMgY2hhciBQdHlQcm90b1tdID0gIi9kZXYvcHR5WFkiOworc3RhdGljIGNoYXIgVHR5UHJvdG9bXSA9ICIvZGV2L3R0eVhZIjsKKyMgIGVuZGlmCisjIGVuZGlmIC8qIGhwdXggKi8KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbml0bWFzdGVyIF9fUCgoaW50KSk7CisKKyNpZiBkZWZpbmVkKHN1bikKKy8qIHN1bidzIHV0bXBfdXBkYXRlIHByb2dyYW0gb3BlbnMgdGhlIHNhbHZlIHNpZGUsIHRodXMgY29ycnVwdGluZworICovCitpbnQgcHR5X3ByZW9wZW4gPSAxOworI2Vsc2UKK2ludCBwdHlfcHJlb3BlbiA9IDA7CisjZW5kaWYKKworLyoKKyAqICBPcGVuIGFsbCBwdHlzIHdpdGggT19OT0NUVFksIGp1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZQorICogIChSSVNDb3MgbWlwcyBicmVha3Mgb3RoZXJ3aXNlKQorICovCisjaWZuZGVmIE9fTk9DVFRZCisjIGRlZmluZSBPX05PQ1RUWSAwCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2luaXRtYXN0ZXIoZikKK2ludCBmOworeworI2lmZGVmIFBPU0lYCisgIHRjZmx1c2goZiwgVENJT0ZMVVNIKTsKKyNlbHNlCisjIGlmZGVmIFRJT0NGTFVTSAorICAodm9pZCkgaW9jdGwoZiwgVElPQ0ZMVVNILCAoY2hhciAqKSAwKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIExPQ0tQVFkKKyAgKHZvaWQpIGlvY3RsKGYsIFRJT0NFWENMLCAoY2hhciAqKSAwKTsKKyNlbmRpZgorfQorCit2b2lkCitJbml0UFRZKGYpCitpbnQgZjsKK3sKKyAgaWYgKGYgPCAwKQorICAgIHJldHVybjsKKyNpZiBkZWZpbmVkKElfUFVTSCkgJiYgZGVmaW5lZChIQVZFX1NWUjRfUFRZUykgJiYgIWRlZmluZWQoc2dpKSAmJiAhZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoX19vc2ZfXykgJiYgIWRlZmluZWQoTV9VTklYKQorICBpZiAoaW9jdGwoZiwgSV9QVVNILCAicHRlbSIpKQorICAgIFBhbmljKGVycm5vLCAiSW5pdFBUWTogY2Fubm90IElfUFVTSCBwdGVtIik7CisgIGlmIChpb2N0bChmLCBJX1BVU0gsICJsZHRlcm0iKSkKKyAgICBQYW5pYyhlcnJubywgIkluaXRQVFk6IGNhbm5vdCBJX1BVU0ggbGR0ZXJtIik7CisjIGlmZGVmIHN1bgorICBpZiAoaW9jdGwoZiwgSV9QVVNILCAidHRjb21wYXQiKSkKKyAgICBQYW5pYyhlcnJubywgIkluaXRQVFk6IGNhbm5vdCBJX1BVU0ggdHRjb21wYXQiKTsKKyMgZW5kaWYKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChPU1gpICYmICFkZWZpbmVkKFBUWV9ET05FKQorI2RlZmluZSBQVFlfRE9ORQoraW50CitPcGVuUFRZKHR0eW4pCitjaGFyICoqdHR5bjsKK3sKKyAgcmVnaXN0ZXIgaW50IGY7CisgIGlmICgoZiA9IG9wZW5fY29udHJvbGxpbmdfcHR5KFR0eU5hbWUpKSA8IDApCisgICAgcmV0dXJuIC0xOworICBpbml0bWFzdGVyKGYpOworICAqdHR5biA9IFR0eU5hbWU7CisgIHJldHVybiBmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoZGVmaW5lZChzZXF1ZW50KSB8fCBkZWZpbmVkKF9TRVFVRU5UXykpICYmICFkZWZpbmVkKFBUWV9ET05FKQorI2RlZmluZSBQVFlfRE9ORQoraW50CitPcGVuUFRZKHR0eW4pCitjaGFyICoqdHR5bjsKK3sKKyAgY2hhciAqbSwgKnM7CisgIHJlZ2lzdGVyIGludCBmOworCisgIGlmICgoZiA9IGdldHBzZXVkb3R0eSgmcywgJm0pKSA8IDApCisgICAgcmV0dXJuIC0xOworI2lmZGVmIF9TRVFVRU5UXworICBmdmhhbmd1cChzKTsKKyNlbmRpZgorICBzdHJuY3B5KFB0eU5hbWUsIG0sIHNpemVvZihQdHlOYW1lKSk7CisgIHN0cm5jcHkoVHR5TmFtZSwgcywgc2l6ZW9mKFR0eU5hbWUpKTsKKyAgaW5pdG1hc3RlcihmKTsKKyAgKnR0eW4gPSBUdHlOYW1lOworICByZXR1cm4gZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChfX3NnaSkgJiYgIWRlZmluZWQoUFRZX0RPTkUpCisjZGVmaW5lIFBUWV9ET05FCitpbnQKK09wZW5QVFkodHR5bikKK2NoYXIgKip0dHluOworeworICBpbnQgZjsKKyAgY2hhciAqbmFtZSwgKl9nZXRwdHkoKTsgCisgIHNpZ3JldF90ICgqc2lnY2xkKV9fUChTSUdQUk9UT0FSRyk7CisKKyAgLyoKKyAgICogU0lHQ0hMRCBzZXQgdG8gU0lHX0RGTCBmb3IgX2dldHB0eSgpIGJlY2F1c2UgaXQgbWF5IGZvcmsoKSBhbmQKKyAgICogZXhlYygpIC91c3IvYWRtL21rcHRzCisgICAqLworICBzaWdjbGQgPSBzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CisgIG5hbWUgPSBfZ2V0cHR5KCZmLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwNjAwLCAwKTsKKyAgc2lnbmFsKFNJR0NITEQsIHNpZ2NsZCk7CisKKyAgaWYgKG5hbWUgPT0gMCkKKyAgICByZXR1cm4gLTE7CisgIGluaXRtYXN0ZXIoZik7CisgICp0dHluID0gbmFtZTsKKyAgcmV0dXJuIGY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoTUlQUykgJiYgZGVmaW5lZChIQVZFX0RFVl9QVEMpICYmICFkZWZpbmVkKFBUWV9ET05FKQorI2RlZmluZSBQVFlfRE9ORQoraW50CitPcGVuUFRZKHR0eW4pCitjaGFyICoqdHR5bjsKK3sKKyAgcmVnaXN0ZXIgaW50IGY7CisgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgIAorICBzdHJjcHkoUHR5TmFtZSwgIi9kZXYvcHRjIik7CisgIGlmICgoZiA9IG9wZW4oUHR5TmFtZSwgT19SRFdSIHwgT19OT0NUVFkgfCBPX05PTkJMT0NLKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgaWYgKGZzdGF0KGYsICZidWYpIDwgMCkKKyAgICB7CisgICAgICBjbG9zZShmKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIHNwcmludGYoVHR5TmFtZSwgIi9kZXYvdHR5cSVkIiwgbWlub3IoYnVmLnN0X3JkZXYpKTsKKyAgaW5pdG1hc3RlcihmKTsKKyAgKnR0eW4gPSBUdHlOYW1lOworICByZXR1cm4gZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChIQVZFX1NWUjRfUFRZUykgJiYgIWRlZmluZWQoUFRZX0RPTkUpCisjZGVmaW5lIFBUWV9ET05FCitpbnQKK09wZW5QVFkodHR5bikKK2NoYXIgKip0dHluOworeworICByZWdpc3RlciBpbnQgZjsKKyAgY2hhciAqbSwgKnB0c25hbWUoKTsKKyAgaW50IHVubG9ja3B0IF9fUCgoaW50KSksIGdyYW50cHQgX19QKChpbnQpKTsKKyNpZiBkZWZpbmVkKEhBVkVfR0VUUFQpICYmIGRlZmluZWQobGludXgpCisgIGludCBnZXRwdCBfX1AoKHZvaWQpKTsKKyNlbmRpZgorICBzaWdyZXRfdCAoKnNpZ2NsZClfX1AoU0lHUFJPVE9BUkcpOworCisgIHN0cmNweShQdHlOYW1lLCAiL2Rldi9wdG14Iik7CisjaWYgZGVmaW5lZChIQVZFX0dFVFBUKSAmJiBkZWZpbmVkKGxpbnV4KQorICBpZiAoKGYgPSBnZXRwdCgpKSA9PSAtMSkKKyNlbHNlCisgIGlmICgoZiA9IG9wZW4oUHR5TmFtZSwgT19SRFdSIHwgT19OT0NUVFkpKSA9PSAtMSkKKyNlbmRpZgorICAgIHJldHVybiAtMTsKKworICAvKgorICAgKiBTSUdDSExEIHNldCB0byBTSUdfREZMIGZvciBncmFudHB0KCkgYmVjYXVzZSBpdCBmb3JrKClzIGFuZAorICAgKiBleGVjKClzIHB0X2NobW9kCisgICAqLworICBzaWdjbGQgPSBzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CisgIGlmICgobSA9IHB0c25hbWUoZikpID09IE5VTEwgfHwgZ3JhbnRwdChmKSB8fCB1bmxvY2twdChmKSkKKyAgICB7CisgICAgICBzaWduYWwoU0lHQ0hMRCwgc2lnY2xkKTsKKyAgICAgIGNsb3NlKGYpOworICAgICAgcmV0dXJuIC0xOworICAgIH0gCisgIHNpZ25hbChTSUdDSExELCBzaWdjbGQpOworICBzdHJuY3B5KFR0eU5hbWUsIG0sIHNpemVvZihUdHlOYW1lKSk7CisgIGluaXRtYXN0ZXIoZik7CisgICp0dHluID0gVHR5TmFtZTsKKyAgcmV0dXJuIGY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoX0FJWCkgJiYgZGVmaW5lZChIQVZFX0RFVl9QVEMpICYmICFkZWZpbmVkKFBUWV9ET05FKQorI2RlZmluZSBQVFlfRE9ORQorCitpbnQKK09wZW5QVFkodHR5bikKK2NoYXIgKip0dHluOworeworICByZWdpc3RlciBpbnQgZjsKKworICAvKiBhIGR1bWIgbG9va2luZyBsb29wIHJlcGxhY2VkIGJ5IG15Y3JvZnRzIGNvZGU6ICovCisgIHN0cmNweSAoUHR5TmFtZSwgIi9kZXYvcHRjIik7CisgIGlmICgoZiA9IG9wZW4gKFB0eU5hbWUsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgc3RybmNweShUdHlOYW1lLCB0dHluYW1lKGYpLCBzaXplb2YoVHR5TmFtZSkpOworICBpZiAoZWZmX3VpZCAmJiBhY2Nlc3MoVHR5TmFtZSwgUl9PSyB8IFdfT0spKQorICAgIHsKKyAgICAgIGNsb3NlKGYpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgaW5pdG1hc3RlcihmKTsKKyMgaWZkZWYgX0lCTVIyCisgIHB0eV9wcmVvcGVuID0gMTsKKyMgZW5kaWYKKyAgKnR0eW4gPSBUdHlOYW1lOworICByZXR1cm4gZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChIQVZFX09QRU5QVFkpICYmICFkZWZpbmVkKFBUWV9ET05FKQorI2RlZmluZSBQVFlfRE9ORQoraW50CitPcGVuUFRZKHR0eW4pCitjaGFyICoqdHR5bjsKK3sKKyAgaW50IGYsIHM7CisgIGlmIChvcGVucHR5KCZmLCAmcywgVHR5TmFtZSwgTlVMTCwgTlVMTCkgIT0gMCkKKyAgICByZXR1cm4gLTE7CisgIGNsb3NlKHMpOworICBpbml0bWFzdGVyKGYpOworICBwdHlfcHJlb3BlbiA9IDE7CisgICp0dHluID0gVHR5TmFtZTsKKyAgcmV0dXJuIGY7ICAgIAorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUFRZX0RPTkUKK2ludAorT3BlblBUWSh0dHluKQorY2hhciAqKnR0eW47Cit7CisgIHJlZ2lzdGVyIGNoYXIgKnAsICpxLCAqbCwgKmQ7CisgIHJlZ2lzdGVyIGludCBmOworCisgIGRlYnVnKCJPcGVuUFRZOiBVc2luZyBCU0Qgc3R5bGUgcHR5cy5cbiIpOworICBzdHJjcHkoUHR5TmFtZSwgUHR5UHJvdG8pOworICBzdHJjcHkoVHR5TmFtZSwgVHR5UHJvdG8pOworICBmb3IgKHAgPSBQdHlOYW1lOyAqcCAhPSAnWCc7IHArKykKKyAgICA7CisgIGZvciAocSA9IFR0eU5hbWU7ICpxICE9ICdYJzsgcSsrKQorICAgIDsKKyAgZm9yIChsID0gUFRZUkFOR0UwOyAoKnAgPSAqbCkgIT0gJ1wwJzsgbCsrKQorICAgIHsKKyAgICAgIGZvciAoZCA9IFBUWVJBTkdFMTsgKHBbMV0gPSAqZCkgIT0gJ1wwJzsgZCsrKQorCXsKKwkgIGRlYnVnMSgiT3BlblBUWSB0cmllcyAnJXMnXG4iLCBQdHlOYW1lKTsKKwkgIGlmICgoZiA9IG9wZW4oUHR5TmFtZSwgT19SRFdSIHwgT19OT0NUVFkpKSA9PSAtMSkKKwkgICAgY29udGludWU7CisJICBxWzBdID0gKmw7CisJICBxWzFdID0gKmQ7CisJICBpZiAoZWZmX3VpZCAmJiBhY2Nlc3MoVHR5TmFtZSwgUl9PSyB8IFdfT0spKQorCSAgICB7CisJICAgICAgY2xvc2UoZik7CisJICAgICAgY29udGludWU7CisJICAgIH0KKyNpZiBkZWZpbmVkKHN1bikgJiYgZGVmaW5lZChUSU9DR1BHUlApICYmICFkZWZpbmVkKFNVTk9TMykKKwkgIC8qIEhhY2sgdG8gZW5zdXJlIHRoYXQgdGhlIHNsYXZlIHNpZGUgb2YgdGhlIHB0eSBpcworCSAgICogdW51c2VkLiBNYXkgbm90IHdvcmsgaW4gYW55dGhpbmcgb3RoZXIgdGhhbiBTdW5PUzQuMQorCSAgICovCisJICAgIHsKKwkgICAgICBpbnQgcGdycDsKKworCSAgICAgIC8qIHRjZ2V0cGdycCBkb2VzIG5vdCB3b3JrICh1c2VzIFRJT0NHRVRQR1JQKSEgKi8KKwkgICAgICBpZiAoaW9jdGwoZiwgVElPQ0dQR1JQLCAoY2hhciAqKSZwZ3JwKSAhPSAtMSB8fCBlcnJubyAhPSBFSU8pCisJCXsKKwkJICBjbG9zZShmKTsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICB9CisjZW5kaWYKKwkgIGluaXRtYXN0ZXIoZik7CisJICAqdHR5biA9IFR0eU5hbWU7CisJICByZXR1cm4gZjsKKwl9CisgICAgfQorICByZXR1cm4gLTE7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9ybGZlLmMgYi9yZWFkbGluZS9leGFtcGxlcy9ybGZlL3JsZmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDc0N2RjCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9ybGZlLmMKQEAgLTAsMCArMSw3ODAgQEAKKy8qIEEgZnJvbnQtZW5kIHVzaW5nIHJlYWRsaW5lIHRvICJjb29rIiBpbnB1dCBsaW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDE5OTkgIFBlciBCb3RobmVyCisgKiAKKyAqIFRoaXMgZnJvbnQtZW5kIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFNvbWUgY29kZSBmcm9tIEpvaG5zb24gJiBUcm9hbjogIkxpbnV4IEFwcGxpY2F0aW9uIERldmVsb3BtZW50IgorICogKEFkZGlzb24tV2VzbGV5LCAxOTk4KSB3YXMgdXNlZCBkaXJlY3RseSBvciBmb3IgaW5zcGlyYXRpb24uCisgKgorICogMjAwMy0xMS0wNyBXb2xmZ2FuZyBUYWV1YmVyIDx3b2xmZ2FuZ190YWV1YmVyQGFnaWxlbnQuY29tPgorICogU3BlY2lmeSBhIGhpc3RvcnkgZmlsZSBhbmQgdGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgZmlsZSB3aXRoIGNvbW1hbmQKKyAqIGxpbmUgb3B0aW9uczsgdXNlIEVESVRPUi9WSVNVQUwgdG8gc2V0IHZpL2VtYWNzIHByZWZlcmVuY2UuCisgKi8KKworLyogUFJPQkxFTVMvVE9ETzoKKyAqCisgKiBPbmx5IHRlc3RlZCB1bmRlciBHTlUvTGludXggYW5kIE1hYyBPUyAxMC54OyAgbmVlZHMgdG8gYmUgcG9ydGVkLgorICoKKyAqIFN3aXRjaGluZyBiZXR3ZWVuIGxpbmUtZWRpdGluZy1tb2RlIHZzIHJhdy1jaGFyLW1vZGUgZGVwZW5kaW5nIG9uCisgKiB3aGF0IHRjZ2V0YXR0ciByZXR1cm5zIGlzIGluaGVyZW50bHkgbm90IHJvYnVzdCwgcGx1cyBpdCBkb2Vzbid0CisgKiB3b3JrIHdoZW4gc3NoL3RlbG5ldHRpbmcgaW4uICBBIGJldHRlciBzb2x1dGlvbiBpcyBwb3NzaWJsZSBpZiB0aGUKKyAqIHR0eSBzeXN0ZW0gY2FuIHNlbmQgaW4tbGluZSBlc2NhcGUgc2VxdWVuY2VzIGluZGljYXRpbmcgdGhlIGN1cnJlbnQKKyAqIG1vZGUsIGVjaG8nZCBpbnB1dCwgZXRjLiAgVGhhdCB3b3VsZCBhbHNvIGFsbG93IGEgdXNlciBwcmVmZXJlbmNlCisgKiB0byBzZXQgZGlmZmVyZW50IGNvbG9ycyBmb3IgcHJvbXB0LCBpbnB1dCwgc3Rkb3V0LCBhbmQgc3RkZXJyLgorICoKKyAqIFdoZW4gcnVubmluZyBtYyAtYyB1bmRlciB0aGUgTGludXggY29uc29sZSwgbWMgZG9lcyBub3QgcmVjb2duaXplCisgKiBtb3VzZSBjbGlja3MsIHdoaWNoIG1jIGRvZXMgd2hlbiBub3QgcnVubmluZyB1bmRlciBybGZlLgorICoKKyAqIFBhc3Rpbmcgc2VsZWN0ZWQgdGV4dCBjb250YWluaW5nIHRhYnMgaXMgbGlrZSBoaXR0aW5nIHRoZSB0YWIgY2hhcmFjdGVyLAorICogd2hpY2ggaW52b2tlcyByZWFkbGluZSBjb21wbGV0aW9uLiAgV2UgZG9uJ3Qgd2FudCB0aGlzLiAgSSBkb24ndCBrbm93CisgKiBpZiB0aGlzIGlzIGZpeGFibGUgd2l0aG91dCBpbnRlZ3JhdGluZyBybGZlIGludG8gYSB0ZXJtaW5hbCBlbXVsYXRvci4KKyAqCisgKiBFY2hvIHN1cHByZXNzaW9uIGlzIGEga2x1ZGdlLCBidXQgY2FuIG9ubHkgYmUgYXZvaWRlZCB3aXRoIGJldHRlciBrZXJuZWwKKyAqIHN1cHBvcnQ6IFdlIG5lZWQgYSB0dHkgbW9kZSB0byBkaXNhYmxlICJyZWFsIiBlY2hvaW5nLCB3aGlsZSBzdGlsbAorICogbGV0dGluZyB0aGUgaW5mZXJpb3IgdGhpbmsgaXRzIHR0eSBkcml2ZXIgdG8gZG9pbmcgZWNob2luZy4KKyAqIFN0ZXZlbnMncyBib29rIGNsYWltcyBTQ1IkIGFuZCBCU0Q0LjMrIGhhdmUgVElPQ1JFTU9URS4KKyAqCisgKiBUaGUgbGF0ZXN0IHJlYWRsaW5lIG1heSBoYXZlIHNvbWUgaG9va3Mgd2UgY2FuIHVzZSB0byBhdm9pZCBoYXZpbmcKKyAqIHRvIGJhY2sgdXAgdGhlIHByb21wdC4gKFNlZSBIQVZFX0FMUkVBRFlfUFJPTVBURUQuKQorICoKKyAqIERlc2lyYWJsZSByZWFkbGluZSBmZWF0dXJlOiAgV2hlbiBpbiBjb29rZWQgbm8tZWNobyBtb2RlIChlLmcuIHBhc3N3b3JkKSwKKyAqIGVjaG8gY2hhcmFjdGVycyBhcmUgdGhleSBhcmUgdHlwZXMgd2l0aCAnKicsIGJ1dCByZW1vdmUgdGhlbSB3aGVuIGRvbmUuCisgKgorICogQXN5bmNocm9ub3VzIG91dHB1dCB3aGlsZSB3ZSdyZSBlZGl0aW5nIGFuIGlucHV0IGxpbmUgc2hvdWxkIGJlCisgKiBpbnNlcnRlZCBpbiB0aGUgb3V0cHV0IHZpZXcgKmJlZm9yZSogdGhlIGlucHV0IGxpbmUsIHNvIHRoYXQgdGhlCisgKiBsaW5lcyBiZWluZyBlZGl0ZWQgKHdpdGggdGhlIHByb21wdCkgZmxvYXQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuCisgKgorICogQSAicGFnZSBtb2RlIiBvcHRpb24gdG8gZW11bGF0ZSBtb3JlL2xlc3MgYmVoYXZpb3I6ICBBdCBlYWNoIHBhZ2Ugb2YKKyAqIG91dHB1dCwgcGF1c2UgZm9yIGEgdXNlciBjb21tYW5kLiAgVGhpcyByZXF1aXJlZCBwYXJzaW5nIHRoZSBvdXRwdXQKKyAqIHRvIGtlZXAgdHJhY2sgb2YgbGluZSBsZW5ndGhzLiAgSXQgYWxzbyByZXF1aXJlcyByZW1lbWJlcmluZyB0aGUKKyAqIG91dHB1dCwgaWYgd2Ugd2FudCBhbiBvcHRpb24gdG8gc2Nyb2xsIGJhY2ssIHdoaWNoIHN1Z2dlc3RzIHRoYXQKKyAqIHRoaXMgc2hvdWxkIGJlIGludGVncmF0ZWQgd2l0aCBhIHRlcm1pbmFsIGVtdWxhdG9yIGxpa2UgeHRlcm0uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgUkVBRExJTkVfTElCUkFSWQorIyAgaW5jbHVkZSAicmVhZGxpbmUuaCIKKyMgIGluY2x1ZGUgImhpc3RvcnkuaCIKKyNlbHNlCisjICBpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgorIyAgaW5jbHVkZSA8cmVhZGxpbmUvaGlzdG9yeS5oPgorI2VuZGlmCisKKyNpZm5kZWYgQ09NTUFORAorI2RlZmluZSBDT01NQU5EICIvYmluL2Jhc2giCisjZW5kaWYKKyNpZm5kZWYgQ09NTUFORF9BUkdTCisjZGVmaW5lIENPTU1BTkRfQVJHUyBDT01NQU5ECisjZW5kaWYKKworI2lmbmRlZiBBTFRfQ09NTUFORAorI2RlZmluZSBBTFRfQ09NTUFORCAiL2Jpbi9zaCIKKyNlbmRpZgorI2lmbmRlZiBBTFRfQ09NTUFORF9BUkdTCisjZGVmaW5lIEFMVF9DT01NQU5EX0FSR1MgQUxUX0NPTU1BTkQKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTUVNTU9WRQorIyAgaWYgX19HTlVDX18gPiAxCisjICAgIGRlZmluZSBtZW1tb3ZlKGQsIHMsIG4pCV9fYnVpbHRpbl9tZW1jcHkoZCwgcywgbikKKyMgIGVsc2UKKyMgICAgZGVmaW5lIG1lbW1vdmUoZCwgcywgbikJbWVtY3B5KGQsIHMsIG4pCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBtZW1tb3ZlKGQsIHMsIG4pCW1lbWNweShkLCBzLCBuKQorI2VuZGlmCisKKyNkZWZpbmUgQVBQTElDQVRJT05fTkFNRSAicmxmZSIKKworc3RhdGljIGludCBpbl9mcm9tX2luZmVyaW9yX2ZkOworc3RhdGljIGludCBvdXRfdG9faW5mZXJpb3JfZmQ7CitzdGF0aWMgdm9pZCBzZXRfZWRpdF9tb2RlICgpOworc3RhdGljIHZvaWQgdXNhZ2VfZXhpdCAoKTsKK3N0YXRpYyBjaGFyICpoaXN0X2ZpbGUgPSAwOworc3RhdGljIGludCAgaGlzdF9zaXplID0gMDsKKworLyogVW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IHNhZmVseSBkaXNwbGF5IGVjaG8gZnJvbSB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4KKyAgIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgZWNobyBiaXQgaW4gdGhlIHB0eSBpcyAib3duZWQiIGJ5IHRoZSBpbmZlcmlvciwKKyAgIGFuZCBpZiB3ZSB0cnkgdG8gdHVybiBpdCBvZmYsIHdlIGNvdWxkIGNvbmZ1c2UgdGhlIGluZmVyaW9yLgorICAgVGh1cywgd2hlbiBlY2hvaW5nLCB3ZSBnZXQgZWNobyB0d2ljZTogIEZpcnN0IHJlYWRsaW5lIGVjaG9lcyB3aGlsZQorICAgd2UncmUgYWN0dWFsbHkgZWRpdGluZy4gVGhlbiB3ZSBzZW5kIHRoZSBsaW5lIHRvIHRoZSBpbmZlcmlvciwgYW5kIHRoZQorICAgdGVybWluYWwgZHJpdmVyIHNlbmQgYmFjayBhbiBleHRyYSBlY2hvLgorICAgVGhlIHdvcmstYXJvdW5kIGlzIHRvIHJlbWVtYmVyIHRoZSBpbnB1dCBsaW5lcywgYW5kIHdoZW4gd2Ugc2VlIHRoYXQKKyAgIGxpbmUgY29tZSBiYWNrLCB3ZSBzdXByZXNzIHRoZSBvdXRwdXQuCisgICBBIGJldHRlciBzb2x1dGlvbiAoc3VwcG9zZWRseSBhdmFpbGFibGUgb24gU1ZSNCkgd291bGQgYmUgYSBzbWFydGVyCisgICB0ZXJtaW5hbCBkcml2ZXIsIHdpdGggbW9yZSBmbGFncyAuLi4gKi8KKyNkZWZpbmUgRUNIT19TVVBQUkVTU19NQVggMTAyNAorY2hhciBlY2hvX3N1cHByZXNzX2J1ZmZlcltFQ0hPX1NVUFBSRVNTX01BWF07CitpbnQgZWNob19zdXBwcmVzc19zdGFydCA9IDA7CitpbnQgZWNob19zdXBwcmVzc19saW1pdCA9IDA7CisKKy8qI2RlZmluZSBERUJVRyovCisKKyNpZmRlZiBERUJVRworRklMRSAqbG9nZmlsZSA9IE5VTEw7CisjZGVmaW5lIERQUklOVDAoRk1UKSAoZnByaW50Zihsb2dmaWxlLCBGTVQpLCBmZmx1c2gobG9nZmlsZSkpCisjZGVmaW5lIERQUklOVDEoRk1ULCBWMSkgKGZwcmludGYobG9nZmlsZSwgRk1ULCBWMSksIGZmbHVzaChsb2dmaWxlKSkKKyNkZWZpbmUgRFBSSU5UMihGTVQsIFYxLCBWMikgKGZwcmludGYobG9nZmlsZSwgRk1ULCBWMSwgVjIpLCBmZmx1c2gobG9nZmlsZSkpCisjZWxzZQorI2RlZmluZSBEUFJJTlQwKEZNVCkgKCh2b2lkKSAwKSAvKiBEbyBub3RoaW5nICovCisjZGVmaW5lIERQUklOVDEoRk1ULCBWMSkgKCh2b2lkKSAwKSAvKiBEbyBub3RoaW5nICovCisjZGVmaW5lIERQUklOVDIoRk1ULCBWMSwgVjIpICgodm9pZCkgMCkgLyogRG8gbm90aGluZyAqLworI2VuZGlmCisKK3N0cnVjdCB0ZXJtaW9zIG9yaWdfdGVybTsKKworLyogUGlkIG9mIGNoaWxkIHByb2Nlc3MuICovCitzdGF0aWMgcGlkX3QgY2hpbGQgPSAtMTsKKworc3RhdGljIHZvaWQKK3NpZ19jaGlsZCAoaW50IHNpZ25vKQoreworICBpbnQgc3RhdHVzOworICB3YWl0ICgmc3RhdHVzKTsKKyAgaWYgKGhpc3RfZmlsZSAhPSAwKQorICAgIHsKKyAgICAgIHdyaXRlX2hpc3RvcnkgKGhpc3RfZmlsZSk7CisgICAgICBpZiAoaGlzdF9zaXplKQorCWhpc3RvcnlfdHJ1bmNhdGVfZmlsZSAoaGlzdF9maWxlLCBoaXN0X3NpemUpOworICAgIH0KKyAgRFBSSU5UMCAoIihDaGlsZCBwcm9jZXNzIGRpZWQuKVxuIik7CisgIHRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FOT1csICZvcmlnX3Rlcm0pOworICBleGl0ICgwKTsKK30KKwordm9sYXRpbGUgaW50IHByb3BhZ2F0ZV9zaWd3aW5jaCA9IDA7CisKKy8qIHNpZ3dpbmNoX2hhbmRsZXIKKyAqIHByb3BhZ2F0ZSB3aW5kb3cgc2l6ZSBjaGFuZ2VzIGZyb20gaW5wdXQgZmlsZSBkZXNjcmlwdG9yIHRvCisgKiBtYXN0ZXIgc2lkZSBvZiBwdHkuCisgKi8KK3ZvaWQgc2lnd2luY2hfaGFuZGxlcihpbnQgc2lnbmFsKSB7IAorICAgcHJvcGFnYXRlX3NpZ3dpbmNoID0gMTsKK30KKworCisvKiBnZXRfc2xhdmVfcHR5KCkgcmV0dXJucyBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvci4KKyAqIElmIGl0IHJldHVybnMgPCAwLCBhbiBlcnJvciBoYXMgb2NjdXJyZWQuCisgKiBPdGhlcndpc2UsIGl0IGhhcyByZXR1cm5lZCB0aGUgc2xhdmUgZmlsZSBkZXNjcmlwdG9yLgorICovCisKK2ludCBnZXRfc2xhdmVfcHR5KGNoYXIgKm5hbWUpIHsgCisgICBzdHJ1Y3QgZ3JvdXAgKmdwdHI7CisgICBnaWRfdCBnaWQ7CisgICBpbnQgc2xhdmUgPSAtMTsKKworICAgLyogY2hvd24vY2htb2QgdGhlIGNvcnJlc3BvbmRpbmcgcHR5LCBpZiBwb3NzaWJsZS4KKyAgICAqIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIHByb2Nlc3MgaGFzIHJvb3QgcGVybWlzc2lvbnMuCisgICAgKiBBbHRlcm5hdGl2ZWx5LCB3cml0ZSBhbmQgZXhlYyBhIHNtYWxsIHNldHVpZCBwcm9ncmFtIHRoYXQKKyAgICAqIGRvZXMganVzdCB0aGlzLgorICAgICovCisgICBpZiAoKGdwdHIgPSBnZXRncm5hbSgidHR5IikpICE9IDApIHsKKyAgICAgIGdpZCA9IGdwdHItPmdyX2dpZDsKKyAgIH0gZWxzZSB7CisgICAgICAvKiBpZiB0aGUgdHR5IGdyb3VwIGRvZXMgbm90IGV4aXN0LCBkb24ndCBjaGFuZ2UgdGhlCisgICAgICAgKiBncm91cCBvbiB0aGUgc2xhdmUgcHR5LCBvbmx5IHRoZSBvd25lcgorICAgICAgICovCisgICAgICBnaWQgPSAtMTsKKyAgIH0KKworICAgLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBjaGVjayBmb3IgZXJyb3JzIGhlcmUuICBJZiB0aGlzIGlzIGNvZGUKKyAgICAqIHdoZXJlIHRoZXNlIGFjdGlvbnMgYXJlIGNyaXRpY2FsLCBjaGVjayBmb3IgZXJyb3JzIQorICAgICovCisgICBjaG93bihuYW1lLCBnZXR1aWQoKSwgZ2lkKTsKKyAgIC8qIFRoaXMgY29kZSBvbmx5IG1ha2VzIHRoZSBzbGF2ZSByZWFkL3dyaXRlYWJsZSBmb3IgdGhlIHVzZXIuCisgICAgKiBJZiB0aGlzIGlzIGZvciBhbiBpbnRlcmFjdGl2ZSBzaGVsbCB0aGF0IHdpbGwgd2FudCB0bworICAgICogcmVjZWl2ZSAid3JpdGUiIGFuZCAid2FsbCIgbWVzc2FnZXMsIE9SIFNfSVdHUlAgaW50byB0aGUKKyAgICAqIHNlY29uZCBhcmd1bWVudCBiZWxvdy4KKyAgICAqLworICAgY2htb2QobmFtZSwgU19JUlVTUnxTX0lXVVNSKTsKKworICAgLyogb3BlbiB0aGUgY29ycmVzcG9uZGluZyBzbGF2ZSBwdHkgKi8KKyAgIHNsYXZlID0gb3BlbihuYW1lLCBPX1JEV1IpOworICAgcmV0dXJuIChzbGF2ZSk7Cit9CisKKy8qIENlcnRhaW4gc3BlY2lhbCBjaGFyYWN0ZXJzLCBzdWNoIGFzIGN0cmwvQywgd2Ugd2FudCB0byBwYXNzIGRpcmVjdGx5CisgICB0byB0aGUgaW5mZXJpb3IsIHJhdGhlciB0aGFuIGxldHRpbmcgcmVhZGxpbmUgaGFuZGxlIHRoZW0uICovCisKK3N0YXRpYyBjaGFyIHNwZWNpYWxfY2hhcnNbMjBdOworc3RhdGljIGludCBzcGVjaWFsX2NoYXJzX2NvdW50OworCitzdGF0aWMgdm9pZAorYWRkX3NwZWNpYWxfY2hhcihpbnQgY2gpCit7CisgIGlmIChjaCAhPSAwKQorICAgIHNwZWNpYWxfY2hhcnNbc3BlY2lhbF9jaGFyc19jb3VudCsrXSA9IGNoOworfQorCitzdGF0aWMgaW50IGVvZl9jaGFyOworCitzdGF0aWMgaW50Citpc19zcGVjaWFsX2NoYXIoaW50IGNoKQoreworICBpbnQgaTsKKyNpZiAwCisgIGlmIChjaCA9PSBlb2ZfY2hhciAmJiBybF9wb2ludCA9PSBybF9lbmQpCisgICAgcmV0dXJuIDE7CisjZW5kaWYKKyAgZm9yIChpID0gc3BlY2lhbF9jaGFyc19jb3VudDsgIC0taSA+PSAwOyApCisgICAgaWYgKHNwZWNpYWxfY2hhcnNbaV0gPT0gY2gpCisgICAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyIGJ1ZlsxMDI0XTsKKy8qIGJ1ZlswIC4uIGJ1Zl9jb3VudC0xXSBpcyB0aGUgd2hhdCBoYXMgYmVlbiBlbWl0dGVkIG9uIHRoZSBjdXJyZW50IGxpbmUuCisgICBJdCBpcyB1c2VkIGFzIHRoZSByZWFkbGluZSBwcm9tcHQuICovCitzdGF0aWMgaW50IGJ1Zl9jb3VudCA9IDA7CisKK2ludCBkb19lbXBoYXNpemVfaW5wdXQgPSAxOworaW50IGN1cnJlbnRfZW1waGFzaXplX2lucHV0OworCitjaGFyICpzdGFydF9pbnB1dF9tb2RlID0gIlwwMzNbMW0iOworY2hhciAqZW5kX2lucHV0X21vZGUgPSAiXDAzM1swbSI7CisKK2ludCBudW1fa2V5cyA9IDA7CisKK3N0YXRpYyB2b2lkIG1heWJlX2VtcGhhc2l6ZV9pbnB1dCAoaW50IG9uKQoreworICBpZiAob24gPT0gY3VycmVudF9lbXBoYXNpemVfaW5wdXQKKyAgICAgIHx8IChvbiAmJiAhIGRvX2VtcGhhc2l6ZV9pbnB1dCkpCisgICAgcmV0dXJuOworICBmcHJpbnRmIChybF9vdXRzdHJlYW0sIG9uID8gc3RhcnRfaW5wdXRfbW9kZSA6IGVuZF9pbnB1dF9tb2RlKTsKKyAgZmZsdXNoIChybF9vdXRzdHJlYW0pOworICBjdXJyZW50X2VtcGhhc2l6ZV9pbnB1dCA9IG9uOworfQorCitzdGF0aWMgdm9pZAorbnVsbF9wcmVwX3Rlcm1pbmFsIChpbnQgbWV0YSkKK3sKK30KKworc3RhdGljIHZvaWQKK251bGxfZGVwcmVwX3Rlcm1pbmFsICgpCit7CisgIG1heWJlX2VtcGhhc2l6ZV9pbnB1dCAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3ByZV9pbnB1dF9jaGFuZ2VfbW9kZSAodm9pZCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2NoYXIgcGVuZGluZ19zcGVjaWFsX2NoYXI7CisKK3N0YXRpYyB2b2lkCitsaW5lX2hhbmRsZXIgKGNoYXIgKmxpbmUpCit7CisgIGlmIChsaW5lID09IE5VTEwpCisgICAgeworICAgICAgY2hhciBidWZbMV07CisgICAgICBEUFJJTlQwKCJzYXcgZW9mIVxuIik7CisgICAgICBidWZbMF0gPSAnXDAwNCc7IC8qIGN0cmwvZCAqLworICAgICAgd3JpdGUgKG91dF90b19pbmZlcmlvcl9mZCwgYnVmLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdGF0aWMgY2hhciBlbnRlcltdID0gIlxyIjsKKyAgICAgIC8qICBTZW5kIGxpbmUgdG8gaW5mZXJpb3I6ICovCisgICAgICBpbnQgbGVuZ3RoID0gc3RybGVuIChsaW5lKTsKKyAgICAgIGlmIChsZW5ndGggPiBFQ0hPX1NVUFBSRVNTX01BWC0yKQorCXsKKwkgIGVjaG9fc3VwcHJlc3Nfc3RhcnQgPSAwOworCSAgZWNob19zdXBwcmVzc19saW1pdCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChlY2hvX3N1cHByZXNzX2xpbWl0ICsgbGVuZ3RoID4gRUNIT19TVVBQUkVTU19NQVggLSAyKQorCSAgICB7CisJICAgICAgaWYgKGVjaG9fc3VwcHJlc3NfbGltaXQgLSBlY2hvX3N1cHByZXNzX3N0YXJ0ICsgbGVuZ3RoCisJCSAgPD0gRUNIT19TVVBQUkVTU19NQVggLSAyKQorCQl7CisJCSAgbWVtbW92ZSAoZWNob19zdXBwcmVzc19idWZmZXIsCisJCQkgICBlY2hvX3N1cHByZXNzX2J1ZmZlciArIGVjaG9fc3VwcHJlc3Nfc3RhcnQsCisJCQkgICBlY2hvX3N1cHByZXNzX2xpbWl0IC0gZWNob19zdXBwcmVzc19zdGFydCk7CisJCSAgZWNob19zdXBwcmVzc19saW1pdCAtPSBlY2hvX3N1cHByZXNzX3N0YXJ0OworCQkgIGVjaG9fc3VwcHJlc3Nfc3RhcnQgPSAwOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgZWNob19zdXBwcmVzc19saW1pdCA9IDA7CisJCX0KKwkgICAgICBlY2hvX3N1cHByZXNzX3N0YXJ0ID0gMDsKKwkgICAgfQorCSAgbWVtY3B5IChlY2hvX3N1cHByZXNzX2J1ZmZlciArIGVjaG9fc3VwcHJlc3NfbGltaXQsCisJCSAgbGluZSwgbGVuZ3RoKTsKKwkgIGVjaG9fc3VwcHJlc3NfbGltaXQgKz0gbGVuZ3RoOworCSAgZWNob19zdXBwcmVzc19idWZmZXJbZWNob19zdXBwcmVzc19saW1pdCsrXSA9ICdccic7CisJICBlY2hvX3N1cHByZXNzX2J1ZmZlcltlY2hvX3N1cHByZXNzX2xpbWl0KytdID0gJ1xuJzsKKwl9CisgICAgICB3cml0ZSAob3V0X3RvX2luZmVyaW9yX2ZkLCBsaW5lLCBsZW5ndGgpOworICAgICAgaWYgKHBlbmRpbmdfc3BlY2lhbF9jaGFyID09IDApCisgICAgICAgIHsKKyAgICAgICAgICB3cml0ZSAob3V0X3RvX2luZmVyaW9yX2ZkLCBlbnRlciwgc2l6ZW9mKGVudGVyKS0xKTsKKyAgICAgICAgICBpZiAoKmxpbmUpCisgICAgICAgICAgICBhZGRfaGlzdG9yeSAobGluZSk7CisgICAgICAgIH0KKyAgICAgIGZyZWUgKGxpbmUpOworICAgIH0KKyAgcmxfY2FsbGJhY2tfaGFuZGxlcl9yZW1vdmUgKCk7CisgIGJ1Zl9jb3VudCA9IDA7CisgIG51bV9rZXlzID0gMDsKKyAgaWYgKHBlbmRpbmdfc3BlY2lhbF9jaGFyICE9IDApCisgICAgeworICAgICAgd3JpdGUgKG91dF90b19pbmZlcmlvcl9mZCwgJnBlbmRpbmdfc3BlY2lhbF9jaGFyLCAxKTsKKyAgICAgIHBlbmRpbmdfc3BlY2lhbF9jaGFyID0gMDsKKyAgICB9Cit9CisKKy8qIFZhbHVlIG9mIHJsX2dldGNfZnVuY3Rpb24uCisgICBVc2UgdGhpcyBiZWNhdXNlIHJlYWRsaW5lIHNob3VsZCByZWFkIGZyb20gc3RkaW4sIG5vdCBybF9pbnN0cmVhbSwKKyAgIHBvaW50cyB0byB0aGUgcHR5IChzbyByZWFkbGluZSBoYXMgbW9uaXRvciBpdHMgdGVybWluYWwgbW9kZXMpLiAqLworCitpbnQKK215X3JsX2dldGMgKEZJTEUgKmR1bW15KQoreworICBpbnQgY2ggPSBybF9nZXRjIChzdGRpbik7CisgIGlmIChpc19zcGVjaWFsX2NoYXIgKGNoKSkKKyAgICB7CisgICAgICBwZW5kaW5nX3NwZWNpYWxfY2hhciA9IGNoOworICAgICAgcmV0dXJuICdccic7CisgICAgfQorICByZXR1cm4gY2g7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIGNoYXIgKnBhdGg7CisgIGludCBpOworICBpbnQgbWFzdGVyOworICBjaGFyICpuYW1lOworICBpbnQgaW5fZnJvbV90dHlfZmQ7CisgIHN0cnVjdCBzaWdhY3Rpb24gYWN0OworICBzdHJ1Y3Qgd2luc2l6ZSB3czsKKyAgc3RydWN0IHRlcm1pb3MgdDsKKyAgaW50IG1heGZkOworICBmZF9zZXQgaW5fc2V0OworICBzdGF0aWMgY2hhciBlbXB0eV9zdHJpbmdbMV0gPSAiIjsKKyAgY2hhciAqcHJvbXB0ID0gZW1wdHlfc3RyaW5nOworICBpbnQgaW9jdGxfZXJyID0gMDsKKyAgaW50IGFyZ19iYXNlID0gMTsKKworI2lmZGVmIERFQlVHCisgIGxvZ2ZpbGUgPSBmb3BlbigiL3RtcC9ybGZlLmxvZyIsICJ3Iik7CisjZW5kaWYKKworICB3aGlsZSAoYXJnX2Jhc2U8YXJnYykKKyAgICB7CisgICAgICBpZiAoYXJndlthcmdfYmFzZV1bMF0gIT0gJy0nKQorCWJyZWFrOworICAgICAgaWYgKGFyZ19iYXNlKzEgPj0gYXJnYyApCisJdXNhZ2VfZXhpdCgpOworICAgICAgc3dpdGNoKGFyZ3ZbYXJnX2Jhc2VdWzFdKQorCXsKKwljYXNlICdoJzoKKwkgIGFyZ19iYXNlKys7CisJICBoaXN0X2ZpbGUgPSBhcmd2W2FyZ19iYXNlXTsKKwkgIGJyZWFrOworCWNhc2UgJ3MnOgorCSAgYXJnX2Jhc2UrKzsKKwkgIGhpc3Rfc2l6ZSA9IGF0b2koYXJndlthcmdfYmFzZV0pOworCSAgaWYgKGhpc3Rfc2l6ZTwwKQorCSAgICB1c2FnZV9leGl0KCk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgdXNhZ2VfZXhpdCgpOworCX0KKyAgICAgIGFyZ19iYXNlKys7CisgICAgfQorICBpZiAoaGlzdF9maWxlKQorICAgIHJlYWRfaGlzdG9yeSAoaGlzdF9maWxlKTsKKworICBzZXRfZWRpdF9tb2RlICgpOworCisgIHJsX3JlYWRsaW5lX25hbWUgPSBBUFBMSUNBVElPTl9OQU1FOworICAKKyAgaWYgKChtYXN0ZXIgPSBPcGVuUFRZICgmbmFtZSkpIDwgMCkKKyAgICB7CisgICAgICBwZXJyb3IoInB0eXBhaXI6IGNvdWxkIG5vdCBvcGVuIG1hc3RlciBwdHkiKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorCisgIERQUklOVDEoInB0eSBuYW1lOiAnJXMnXG4iLCBuYW1lKTsKKworICAvKiBzZXQgdXAgU0lHV0lOQ0ggaGFuZGxlciAqLworICBhY3Quc2FfaGFuZGxlciA9IHNpZ3dpbmNoX2hhbmRsZXI7CisgIHNpZ2VtcHR5c2V0KCYoYWN0LnNhX21hc2spKTsKKyAgYWN0LnNhX2ZsYWdzID0gMDsKKyAgaWYgKHNpZ2FjdGlvbihTSUdXSU5DSCwgJmFjdCwgTlVMTCkgPCAwKQorICAgIHsKKyAgICAgIHBlcnJvcigicHR5cGFpcjogY291bGQgbm90IGhhbmRsZSBTSUdXSU5DSCAiKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorCisgIGlmIChpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NHV0lOU1osICZ3cykgPCAwKQorICAgIHsKKyAgICAgIHBlcnJvcigicHR5cGFpcjogY291bGQgbm90IGdldCB3aW5kb3cgc2l6ZSIpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgaWYgKChjaGlsZCA9IGZvcmsoKSkgPCAwKQorICAgIHsKKyAgICAgIHBlcnJvcigiY2Fubm90IGZvcmsiKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorCisgIGlmIChjaGlsZCA9PSAwKQorICAgIHsgCisgICAgICBpbnQgc2xhdmU7ICAvKiBmaWxlIGRlc2NyaXB0b3IgZm9yIHNsYXZlIHB0eSAqLworCisgICAgICAvKiBXZSBhcmUgaW4gdGhlIGNoaWxkIHByb2Nlc3MgKi8KKyAgICAgIGNsb3NlKG1hc3Rlcik7CisKKyNpZmRlZiBUSU9DU0NUVFkKKyAgICAgIGlmICgoc2xhdmUgPSBnZXRfc2xhdmVfcHR5KG5hbWUpKSA8IDApCisJeworCSAgcGVycm9yKCJwdHlwYWlyOiBjb3VsZCBub3Qgb3BlbiBzbGF2ZSBwdHkiKTsKKwkgIGV4aXQoMSk7CisJfQorI2VuZGlmCisKKyAgICAgIC8qIFdlIG5lZWQgdG8gbWFrZSB0aGlzIHByb2Nlc3MgYSBzZXNzaW9uIGdyb3VwIGxlYWRlciwgYmVjYXVzZQorICAgICAgICogaXQgaXMgb24gYSBuZXcgUFRZLCBhbmQgdGhpbmdzIGxpa2Ugam9iIGNvbnRyb2wgc2ltcGx5IHdpbGwKKyAgICAgICAqIG5vdCB3b3JrIGNvcnJlY3RseSB1bmxlc3MgdGhlcmUgaXMgYSBzZXNzaW9uIGdyb3VwIGxlYWRlcgorICAgICAgICogYW5kIHByb2Nlc3MgZ3JvdXAgbGVhZGVyICh3aGljaCBhIHNlc3Npb24gZ3JvdXAgbGVhZGVyCisgICAgICAgKiBhdXRvbWF0aWNhbGx5IGlzKS4gVGhpcyBhbHNvIGRpc2Fzc29jaWF0ZXMgdXMgZnJvbSBvdXIgb2xkCisgICAgICAgKiBjb250cm9sbGluZyB0dHkuIAorICAgICAgICovCisgICAgICBpZiAoc2V0c2lkKCkgPCAwKQorCXsKKwkgIHBlcnJvcigiY291bGQgbm90IHNldCBzZXNzaW9uIGxlYWRlciIpOworCX0KKworICAgICAgLyogVGllIHVzIHRvIG91ciBuZXcgY29udHJvbGxpbmcgdHR5LiAqLworI2lmZGVmIFRJT0NTQ1RUWQorICAgICAgaWYgKGlvY3RsKHNsYXZlLCBUSU9DU0NUVFksIE5VTEwpKQorCXsKKwkgIHBlcnJvcigiY291bGQgbm90IHNldCBuZXcgY29udHJvbGxpbmcgdHR5Iik7CisJfQorI2Vsc2UKKyAgICAgIGlmICgoc2xhdmUgPSBnZXRfc2xhdmVfcHR5KG5hbWUpKSA8IDApCisJeworCSAgcGVycm9yKCJwdHlwYWlyOiBjb3VsZCBub3Qgb3BlbiBzbGF2ZSBwdHkiKTsKKwkgIGV4aXQoMSk7CisJfQorI2VuZGlmCisKKyAgICAgIC8qIG1ha2Ugc2xhdmUgcHR5IGJlIHN0YW5kYXJkIGluLCBvdXQsIGFuZCBlcnJvciAqLworICAgICAgZHVwMihzbGF2ZSwgU1RESU5fRklMRU5PKTsKKyAgICAgIGR1cDIoc2xhdmUsIFNURE9VVF9GSUxFTk8pOworICAgICAgZHVwMihzbGF2ZSwgU1RERVJSX0ZJTEVOTyk7CisKKyAgICAgIC8qIGF0IHRoaXMgcG9pbnQgdGhlIHNsYXZlIHB0eSBzaG91bGQgYmUgc3RhbmRhcmQgaW5wdXQgKi8KKyAgICAgIGlmIChzbGF2ZSA+IDIpCisJeworCSAgY2xvc2Uoc2xhdmUpOworCX0KKworICAgICAgLyogVHJ5IHRvIHJlc3RvcmUgd2luZG93IHNpemU7IGZhaWx1cmUgaXNuJ3QgY3JpdGljYWwgKi8KKyAgICAgIGlmIChpb2N0bChTVERPVVRfRklMRU5PLCBUSU9DU1dJTlNaLCAmd3MpIDwgMCkKKwl7CisJICBwZXJyb3IoImNvdWxkIG5vdCByZXN0b3JlIHdpbmRvdyBzaXplIik7CisJfQorCisgICAgICAvKiBub3cgc3RhcnQgdGhlIHNoZWxsICovCisgICAgICB7CisJc3RhdGljIGNoYXIqIGNvbW1hbmRfYXJnc1tdID0geyBDT01NQU5EX0FSR1MsIE5VTEwgfTsKKwlzdGF0aWMgY2hhciogYWx0X2NvbW1hbmRfYXJnc1tdID0geyBBTFRfQ09NTUFORF9BUkdTLCBOVUxMIH07CisJaWYgKGFyZ2MgPD0gMSkKKwkgIHsKKwkgICAgZXhlY3ZwIChDT01NQU5ELCBjb21tYW5kX2FyZ3MpOworCSAgICBleGVjdnAgKEFMVF9DT01NQU5ELCBhbHRfY29tbWFuZF9hcmdzKTsKKwkgIH0KKwllbHNlCisJICBleGVjdnAgKGFyZ3ZbYXJnX2Jhc2VdLCAmYXJndlthcmdfYmFzZV0pOworICAgICAgfQorCisgICAgICAvKiBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCAqLworICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgLyogcGFyZW50ICovCisgIHNpZ25hbCAoU0lHQ0hMRCwgc2lnX2NoaWxkKTsKKworICAvKiBOb3RlIHRoYXQgd2Ugb25seSBzZXQgdGVybWlvcyBzZXR0aW5ncyBmb3Igc3RhbmRhcmQgaW5wdXQ7CisgICAqIHRoZSBtYXN0ZXIgc2lkZSBvZiBhIHB0eSBpcyBOT1QgYSB0dHkuCisgICAqLworICB0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmb3JpZ190ZXJtKTsKKworICB0ID0gb3JpZ190ZXJtOworICBlb2ZfY2hhciA9IHQuY19jY1tWRU9GXTsKKyAgLyogIGFkZF9zcGVjaWFsX2NoYXIodC5jX2NjW1ZFT0ZdKTsqLworICBhZGRfc3BlY2lhbF9jaGFyKHQuY19jY1tWSU5UUl0pOworICBhZGRfc3BlY2lhbF9jaGFyKHQuY19jY1tWUVVJVF0pOworICBhZGRfc3BlY2lhbF9jaGFyKHQuY19jY1tWU1VTUF0pOworI2lmIGRlZmluZWQgKFZESVNDQVJEKQorICBhZGRfc3BlY2lhbF9jaGFyKHQuY19jY1tWRElTQ0FSRF0pOworI2VuZGlmCisKKyAgdC5jX2xmbGFnICY9IH4oSUNBTk9OIHwgSVNJRyB8IEVDSE8gfCBFQ0hPQ1RMIHwgRUNIT0UgfCBcCisJCSBFQ0hPSyB8IEVDSE9LRSB8IEVDSE9OTCB8IEVDSE9QUlQgKTsKKyAgdC5jX2lmbGFnICY9IH5JQ1JOTDsKKyAgdC5jX2lmbGFnIHw9IElHTkJSSzsKKyAgdC5jX2NjW1ZNSU5dID0gMTsKKyAgdC5jX2NjW1ZUSU1FXSA9IDA7CisgIHRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FOT1csICZ0KTsKKyAgaW5fZnJvbV9pbmZlcmlvcl9mZCA9IG1hc3RlcjsKKyAgb3V0X3RvX2luZmVyaW9yX2ZkID0gbWFzdGVyOworICBybF9pbnN0cmVhbSA9IGZkb3BlbiAobWFzdGVyLCAiciIpOworICBybF9nZXRjX2Z1bmN0aW9uID0gbXlfcmxfZ2V0YzsKKworICBybF9wcmVwX3Rlcm1fZnVuY3Rpb24gPSBudWxsX3ByZXBfdGVybWluYWw7IAorICBybF9kZXByZXBfdGVybV9mdW5jdGlvbiA9IG51bGxfZGVwcmVwX3Rlcm1pbmFsOworICBybF9wcmVfaW5wdXRfaG9vayA9IHByZV9pbnB1dF9jaGFuZ2VfbW9kZTsKKyAgcmxfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsIChwcm9tcHQsIGxpbmVfaGFuZGxlcik7CisKKyAgaW5fZnJvbV90dHlfZmQgPSBTVERJTl9GSUxFTk87CisgIEZEX1pFUk8gKCZpbl9zZXQpOworICBtYXhmZCA9IGluX2Zyb21faW5mZXJpb3JfZmQgPiBpbl9mcm9tX3R0eV9mZCA/IGluX2Zyb21faW5mZXJpb3JfZmQKKyAgICA6IGluX2Zyb21fdHR5X2ZkOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGludCBudW07CisgICAgICBGRF9TRVQgKGluX2Zyb21faW5mZXJpb3JfZmQsICZpbl9zZXQpOworICAgICAgRkRfU0VUIChpbl9mcm9tX3R0eV9mZCwgJmluX3NldCk7CisKKyAgICAgIG51bSA9IHNlbGVjdChtYXhmZCsxLCAmaW5fc2V0LCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgaWYgKHByb3BhZ2F0ZV9zaWd3aW5jaCkKKwl7CisJICBzdHJ1Y3Qgd2luc2l6ZSB3czsKKwkgIGlmIChpb2N0bCAoU1RESU5fRklMRU5PLCBUSU9DR1dJTlNaLCAmd3MpID49IDApCisJICAgIHsKKwkgICAgICBpb2N0bCAobWFzdGVyLCBUSU9DU1dJTlNaLCAmd3MpOworCSAgICB9CisJICBwcm9wYWdhdGVfc2lnd2luY2ggPSAwOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAobnVtIDw9IDApCisJeworCSAgcGVycm9yICgic2VsZWN0Iik7CisJICBleGl0ICgtMSk7CisJfQorICAgICAgaWYgKEZEX0lTU0VUIChpbl9mcm9tX3R0eV9mZCwgJmluX3NldCkpCisJeworCSAgZXh0ZXJuIGludCByZWFkbGluZV9lY2hvaW5nX3A7CisJICBzdHJ1Y3QgdGVybWlvcyB0ZXJtX21hc3RlcjsKKwkgIGludCBkb19jYW5vbiA9IDE7CisJICBpbnQgZG9faWNybmwgPSAxOworCSAgaW50IGlvY3RsX3JldDsKKworCSAgRFBSSU5UMSgiW3R0eSBhdmFpbCBudW1fa2V5czolZF1cbiIsIG51bV9rZXlzKTsKKworCSAgLyogSWYgd2UgY2FuJ3QgZ2V0IHR0eSBtb2RlcyBmb3IgdGhlIG1hc3RlciBzaWRlIG9mIHRoZSBwdHksIHdlCisJICAgICBjYW4ndCBoYW5kbGUgbm9uLWNhbm9uaWNhbC1tb2RlIHByb2dyYW1zLiAgQWx3YXlzIGFzc3VtZSB0aGUKKwkgICAgIG1hc3RlciBpcyBpbiBjYW5vbmljYWwgZWNobyBtb2RlIGlmIHdlIGNhbid0IHRlbGwuICovCisJICBpb2N0bF9yZXQgPSB0Y2dldGF0dHIobWFzdGVyLCAmdGVybV9tYXN0ZXIpOworCisJICBpZiAoaW9jdGxfcmV0ID49IDApCisJICAgIHsKKwkgICAgICBkb19jYW5vbiA9ICh0ZXJtX21hc3Rlci5jX2xmbGFnICYgSUNBTk9OKSAhPSAwOworCSAgICAgIGRvX2ljcm5sID0gKHRlcm1fbWFzdGVyLmNfbGZsYWcgJiBJQ1JOTCkgIT0gMDsKKwkgICAgICByZWFkbGluZV9lY2hvaW5nX3AgPSAodGVybV9tYXN0ZXIuY19sZmxhZyAmIEVDSE8pICE9IDA7CisJICAgICAgRFBSSU5UMSAoImVjaG8sY2Fub24sY3JubDolMDNkXG4iLAorCQkgICAgICAgMTAwICogcmVhZGxpbmVfZWNob2luZ19wCisJCSAgICAgICArIDEwICogZG9fY2Fub24KKwkJICAgICAgICsgMSAqIGRvX2ljcm5sKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKGlvY3RsX2VyciA9PSAwKQorCQlEUFJJTlQxKCJ0Y2dldGF0dHIgb24gbWFzdGVyIGZkIGZhaWxlZDogZXJybm8gPSAlZFxuIiwgZXJybm8pOworCSAgICAgIGlvY3RsX2VyciA9IDE7CisJICAgIH0KKworCSAgaWYgKGRvX2Nhbm9uID09IDAgJiYgbnVtX2tleXMgPT0gMCkKKwkgICAgeworCSAgICAgIGNoYXIgY2hbMTBdOworCSAgICAgIGludCBjb3VudCA9IHJlYWQgKFNURElOX0ZJTEVOTywgY2gsIHNpemVvZihjaCkpOworCSAgICAgIERQUklOVDEoIltyZWFkICVkIGNoYXJzIGZyb20gc3RkaW46ICIsIGNvdW50KTsKKwkgICAgICBEUFJJTlQyKCIgXCIlLipzXCJdXG4iLCBjb3VudCwgY2gpOworCSAgICAgIGlmIChkb19pY3JubCkKKwkJeworCQkgIGludCBpID0gY291bnQ7CisJCSAgd2hpbGUgKC0taSA+PSAwKQorCQkgICAgeworCQkgICAgICBpZiAoY2hbaV0gPT0gJ1xyJykKKwkJCWNoW2ldID0gJ1xuJzsKKwkJICAgIH0KKwkJfQorCSAgICAgIG1heWJlX2VtcGhhc2l6ZV9pbnB1dCAoMSk7CisJICAgICAgd3JpdGUgKG91dF90b19pbmZlcmlvcl9mZCwgY2gsIGNvdW50KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKG51bV9rZXlzID09IDApCisJCXsKKwkJICBpbnQgaTsKKwkJICAvKiBSZS1pbnN0YWxsIGNhbGxiYWNrIGhhbmRsZXIgZm9yIG5ldyBwcm9tcHQuICovCisJCSAgaWYgKHByb21wdCAhPSBlbXB0eV9zdHJpbmcpCisJCSAgICBmcmVlIChwcm9tcHQpOworCQkgIGlmIChwcm9tcHQgPT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgRFBSSU5UMCgiTmV3IGVtcHR5IHByb21wdFxuIik7CisJCSAgICAgIHByb21wdCA9IGVtcHR5X3N0cmluZzsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGlmIChkb19lbXBoYXNpemVfaW5wdXQgJiYgYnVmX2NvdW50ID4gMCkKKwkJCXsKKwkJCSAgcHJvbXB0ID0gbWFsbG9jIChidWZfY291bnQgKyBzdHJsZW4gKGVuZF9pbnB1dF9tb2RlKQorCQkJCQkgICArIHN0cmxlbiAoc3RhcnRfaW5wdXRfbW9kZSkgKyA1KTsKKwkJCSAgc3ByaW50ZiAocHJvbXB0LCAiXDAwMSVzXDAwMiUuKnNcMDAxJXNcMDAyIiwKKwkJCQkgICBlbmRfaW5wdXRfbW9kZSwKKwkJCQkgICBidWZfY291bnQsIGJ1ZiwKKwkJCQkgICBzdGFydF9pbnB1dF9tb2RlKTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBwcm9tcHQgPSBtYWxsb2MgKGJ1Zl9jb3VudCArIDEpOworCQkJICBtZW1jcHkgKHByb21wdCwgYnVmLCBidWZfY291bnQpOworCQkJICBwcm9tcHRbYnVmX2NvdW50XSA9ICdcMCc7CisJCQl9CisJCSAgICAgIERQUklOVDEoIk5ldyBwcm9tcHQgJyVzJ1xuIiwgcHJvbXB0KTsKKyNpZiAwIC8qIGlmZGVmIEhBVkVfUkxfQUxSRUFEWV9QUk9NUFRFRCAqLworCQkgICAgICAvKiBEb2Vzbid0IHF1aXRlIHdvcmsgd2hlbiBkb19lbXBoYXNpemVfaW5wdXQgaXMgMS4gKi8KKwkJICAgICAgcmxfYWxyZWFkeV9wcm9tcHRlZCA9IGJ1Zl9jb3VudCA+IDA7CisjZWxzZQorCQkgICAgICBpZiAoYnVmX2NvdW50ID4gMCkKKwkJCXdyaXRlICgxLCAiXHIiLCAxKTsKKyNlbmRpZgorCQkgICAgfQorCisJCSAgcmxfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsIChwcm9tcHQsIGxpbmVfaGFuZGxlcik7CisJCX0KKwkgICAgICBudW1fa2V5cysrOworCSAgICAgIG1heWJlX2VtcGhhc2l6ZV9pbnB1dCAoMSk7CisJICAgICAgcmxfY2FsbGJhY2tfcmVhZF9jaGFyICgpOworCSAgICB9CisJfQorICAgICAgZWxzZSAvKiBvdXRwdXQgZnJvbSBpbmZlcmlvci4gKi8KKwl7CisJICBpbnQgaTsKKwkgIGludCBjb3VudDsKKwkgIGludCBvbGRfY291bnQ7CisJICBpZiAoYnVmX2NvdW50ID4gKHNpemVvZihidWYpID4+IDIpKQorCSAgICBidWZfY291bnQgPSAwOworCSAgY291bnQgPSByZWFkIChpbl9mcm9tX2luZmVyaW9yX2ZkLCBidWYrYnVmX2NvdW50LAorCQkJc2l6ZW9mKGJ1ZikgLSBidWZfY291bnQpOworICAgICAgICAgIERQUklOVDIoInJlYWQgJWQgZnJvbSBpbmZlcmlvciwgYnVmX2NvdW50PSVkIiwgY291bnQsIGJ1Zl9jb3VudCk7CisJICBEUFJJTlQyKCI6IFwiJS4qc1wiIiwgY291bnQsIGJ1ZitidWZfY291bnQpOworCSAgbWF5YmVfZW1waGFzaXplX2lucHV0ICgwKTsKKwkgIGlmIChjb3VudCA8PSAwKQorCSAgICB7CisJICAgICAgRFBSSU5UMCAoIihDb25uZWN0aW9uIGNsb3NlZCBieSBmb3JlaWduIGhvc3QuKVxuIik7CisJICAgICAgdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQU5PVywgJm9yaWdfdGVybSk7CisJICAgICAgZXhpdCAoMCk7CisJICAgIH0KKwkgIG9sZF9jb3VudCA9IGJ1Zl9jb3VudDsKKworICAgICAgICAgIC8qIExvb2sgZm9yIGFueSBwZW5kaW5nIGVjaG8gdGhhdCB3ZSBuZWVkIHRvIHN1cHByZXNzLiAqLworCSAgd2hpbGUgKGVjaG9fc3VwcHJlc3Nfc3RhcnQgPCBlY2hvX3N1cHByZXNzX2xpbWl0CisJCSAmJiBjb3VudCA+IDAKKwkJICYmIGJ1ZltidWZfY291bnRdID09IGVjaG9fc3VwcHJlc3NfYnVmZmVyW2VjaG9fc3VwcHJlc3Nfc3RhcnRdKQorCSAgICB7CisJICAgICAgY291bnQtLTsKKwkgICAgICBidWZfY291bnQrKzsKKwkgICAgICBlY2hvX3N1cHByZXNzX3N0YXJ0Kys7CisJICAgIH0KKwkgIERQUklOVDEoInN1cHByZXNzZWQgJWQgY2hhcmFjdGVycyBvZiBlY2hvLlxuIiwgYnVmX2NvdW50LW9sZF9jb3VudCk7CisKKyAgICAgICAgICAvKiBXcml0ZSB0byB0aGUgdGVybWluYWwgYW55dGhpbmcgdGhhdCB3YXMgbm90IHN1cHByZXNzZWQuICovCisgICAgICAgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgICAgIHdyaXRlICgxLCBidWYgKyBidWZfY291bnQsIGNvdW50KTsKKworICAgICAgICAgIC8qIEZpbmFsbHksIGxvb2sgZm9yIGEgcHJvbXB0IGNhbmRpZGF0ZS4KKyAgICAgICAgICAgKiBXaGVuIHdlIGdldCBhcm91bmQgdG8gZ29pbmcgaW5wdXQgKGZyb20gdGhlIGtleWJvYXJkKSwKKyAgICAgICAgICAgKiB3ZSB3aWxsIGNvbnNpZGVyIHRoZSBwcm9tcHQgdG8gYmUgYW55dGhpbmcgc2luY2UgdGhlIGxhc3QKKyAgICAgICAgICAgKiBsaW5lIHRlcm1pbmF0b3IuICBTbyB3ZSBuZWVkIHRvIHNhdmUgdGhhdCB0ZXh0IGluIHRoZQorICAgICAgICAgICAqIGluaXRpYWwgcGFydCBvZiBidWYuICBIb3dldmVyLCBhbnl0aGluZyBiZWZvcmUgdGhlCisgICAgICAgICAgICogbW9zdCByZWNlbnQgZW5kLW9mLWxpbmUgaXMgbm90IGludGVyZXN0aW5nLiAqLworCSAgYnVmX2NvdW50ICs9IGNvdW50OworI2lmIDEKKwkgIGZvciAoaSA9IGJ1Zl9jb3VudDsgIC0taSA+PSBvbGRfY291bnQ7ICkKKyNlbHNlCisJICBmb3IgKGkgPSBidWZfY291bnQgLSAxOyAgaS0tID49IGJ1Zl9jb3VudCAtIGNvdW50OyApCisjZW5kaWYKKwkgICAgeworCSAgICAgIGlmIChidWZbaV0gPT0gJ1xuJyB8fCBidWZbaV0gPT0gJ1xyJykKKwkJeworCQkgIGkrKzsKKwkJICBtZW1tb3ZlIChidWYsIGJ1ZitpLCBidWZfY291bnQgLSBpKTsKKwkJICBidWZfY291bnQgLT0gaTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICBEUFJJTlQyKCItPiBpOiAlZCwgYnVmX2NvdW50OiAlZFxuIiwgaSwgYnVmX2NvdW50KTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfZWRpdF9tb2RlICgpCit7CisgIGludCB2aSA9IDA7CisgIGNoYXIgKnNoZWxsb3B0czsKKworICBzaGVsbG9wdHMgPSBnZXRlbnYgKCJTSEVMTE9QVFMiKTsKKyAgd2hpbGUgKHNoZWxsb3B0cyAhPSAwKQorICAgIHsKKyAgICAgIGlmIChzdHJuY21wICgidmkiLCBzaGVsbG9wdHMsIDIpID09IDApCisJeworCSAgdmkgPSAxOworCSAgYnJlYWs7CisJfQorICAgICAgc2hlbGxvcHRzID0gaW5kZXggKHNoZWxsb3B0cyArIDEsICc6Jyk7CisgICAgfQorCisgIGlmICghdmkpCisgICAgeworICAgICAgaWYgKGdldGVudiAoIkVESVRPUiIpICE9IDApCisJdmkgfD0gc3RyY21wIChnZXRlbnYgKCJFRElUT1IiKSwgInZpIikgPT0gMDsKKyAgICB9CisKKyAgaWYgKHZpKQorICAgIHJsX3ZhcmlhYmxlX2JpbmQgKCJlZGl0aW5nLW1vZGUiLCAidmkiKTsKKyAgZWxzZQorICAgIHJsX3ZhcmlhYmxlX2JpbmQgKCJlZGl0aW5nLW1vZGUiLCAiZW1hY3MiKTsKK30KKworCitzdGF0aWMgdm9pZCB1c2FnZV9leGl0ICgpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiBybGZlIFstaCBoaXN0ZmlsZV0gWy1zIHNpemVdIGNtZCBbYXJnMV0gW2FyZzJdIC4uLlxuXG4iKTsKKyAgZXhpdCAoMSk7Cit9CmRpZmYgLS1naXQgYS9yZWFkbGluZS9leGFtcGxlcy9ybGZlL3NjcmVlbi5oIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9zY3JlZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjA0MGMzCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmxmZS9zY3JlZW4uaApAQCAtMCwwICsxLDIgQEAKKy8qIER1bW15IGhlYWRlciB0byBhdm9pZCBtb2RpZnlpbmcgcHR5LmMgKi8KKyNpbmNsdWRlICJvcy5oIgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZXhhbXBsZXMvcmxwdHl0ZXN0LmMgYi9yZWFkbGluZS9leGFtcGxlcy9ybHB0eXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTI1N2RiCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmxwdHl0ZXN0LmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKgorICogQW5vdGhlciB0ZXN0IGhhcm5lc3MgZm9yIHRoZSByZWFkbGluZSBjYWxsYmFjayBpbnRlcmZhY2UuCisgKgorICogQXV0aG9yOiBCb2IgUm9zc2kgPGJvYkBicmFza28ubmV0PgorICovCisKKyNpZiBkZWZpbmVkIChIQVZFX0NPTkZJR19IKQorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaWYgMAkvKiBMSU5VWCAqLworI2luY2x1ZGUgPHB0eS5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1dGlsLmg+CisjZW5kaWYKKworI2lmZGVmIFJFQURMSU5FX0xJQlJBUlkKKyMgIGluY2x1ZGUgInJlYWRsaW5lLmgiCisjZWxzZQorIyAgaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KKyNlbmRpZgorCisvKioKKyAqIE1hc3Rlci9TbGF2ZSBQVFkgdXNlZCB0byBrZWVwIHJlYWRsaW5lIG9mZiBvZiBzdGRpbi9zdGRvdXQuCisgKi8KK3N0YXRpYyBpbnQgbWFzdGVyZmQgPSAtMTsKK3N0YXRpYyBpbnQgc2xhdmVmZDsKKwordm9pZAorc2lnaW50IChzKQorICAgICBpbnQgczsKK3sKKyAgdHR5X3Jlc2V0IChTVERJTl9GSUxFTk8pOworICBjbG9zZSAobWFzdGVyZmQpOworICBjbG9zZSAoc2xhdmVmZCk7CisgIHByaW50ZiAoIlxuIik7CisgIGV4aXQgKDApOworfQorCitzdGF0aWMgaW50IAordXNlcl9pbnB1dCgpCit7CisgIGludCBzaXplOworICBjb25zdCBpbnQgTUFYID0gMTAyNDsKKyAgY2hhciAqYnVmID0gKGNoYXIgKiltYWxsb2MoTUFYKzEpOworCisgIHNpemUgPSByZWFkIChTVERJTl9GSUxFTk8sIGJ1ZiwgTUFYKTsKKyAgaWYgKHNpemUgPT0gLTEpCisgICAgcmV0dXJuIC0xOworCisgIHNpemUgPSB3cml0ZSAobWFzdGVyZmQsIGJ1Ziwgc2l6ZSk7CisgIGlmIChzaXplID09IC0xKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCAKK3JlYWRsaW5lX2lucHV0KCkKK3sKKyAgY29uc3QgaW50IE1BWCA9IDEwMjQ7CisgIGNoYXIgKmJ1ZiA9IChjaGFyICopbWFsbG9jKE1BWCsxKTsKKyAgaW50IHNpemU7CisKKyAgc2l6ZSA9IHJlYWQgKG1hc3RlcmZkLCBidWYsIE1BWCk7CisgIGlmIChzaXplID09IC0xKQorICAgIHsKKyAgICAgIGZyZWUoIGJ1ZiApOworICAgICAgYnVmID0gTlVMTDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgYnVmW3NpemVdID0gMDsKKworICAvKiBEaXNwbGF5IG91dHB1dCBmcm9tIHJlYWRsaW5lICovCisgIGlmICggc2l6ZSA+IDAgKQorICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBidWYpOworCisgIGZyZWUoIGJ1ZiApOworICBidWYgPSBOVUxMOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgCitybGN0eF9zZW5kX3VzZXJfY29tbWFuZChjaGFyICpsaW5lKQoreworICAvKiBUaGlzIGhhcHBlbnMgd2hlbiBybF9jYWxsYmFja19yZWFkX2NoYXIgZ2V0cyBFT0YgKi8KKyAgaWYgKCBsaW5lID09IE5VTEwgKQorICAgIHJldHVybjsKKyAgICAKKyAgaWYgKHN0cmNtcCAobGluZSwgImV4aXQiKSA9PSAwKSB7CisgIAl0dHlfcmVzZXQgKFNURElOX0ZJTEVOTyk7CisgIAljbG9zZSAobWFzdGVyZmQpOworICAJY2xvc2UgKHNsYXZlZmQpOworICAJcHJpbnRmICgiXG4iKTsKKwlleGl0ICgwKTsKKyAgfQorICAKKyAgLyogRG9uJ3QgYWRkIHRoZSBlbnRlciBjb21tYW5kICovCisgIGlmICggbGluZSAmJiAqbGluZSAhPSAnXDAnICkKKyAgICBhZGRfaGlzdG9yeShsaW5lKTsKK30KKworc3RhdGljIHZvaWQgCitjdXN0b21fZGVwcmVwX3Rlcm1fZnVuY3Rpb24gKCkKK3sKK30KKworc3RhdGljIGludCAKK2luaXRfcmVhZGxpbmUgKGludCBpbnB1dGZkLCBpbnQgb3V0cHV0ZmQpIAoreworICBGSUxFICppbnB1dEZJTEUsICpvdXRwdXRGSUxFOworCisgIGlucHV0RklMRSA9IGZkb3BlbiAoaW5wdXRmZCwgInIiKTsKKyAgaWYgKCFpbnB1dEZJTEUpCisgICAgcmV0dXJuIC0xOworCisgIG91dHB1dEZJTEUgPSBmZG9wZW4gKG91dHB1dGZkLCAidyIpOworICBpZiAoIW91dHB1dEZJTEUpCisgICAgcmV0dXJuIC0xOworCisgIHJsX2luc3RyZWFtID0gaW5wdXRGSUxFOworICBybF9vdXRzdHJlYW0gPSBvdXRwdXRGSUxFOworCisgIC8qIFRlbGwgcmVhZGxpbmUgd2hhdCB0aGUgcHJvbXB0IGlzIGlmIGl0IG5lZWRzIHRvIHB1dCBpdCBiYWNrICovCisgIHJsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCgiKHJsdGVzdCk6ICAiLCBybGN0eF9zZW5kX3VzZXJfY29tbWFuZCk7CisKKyAgLyogU2V0IHRoZSB0ZXJtaW5hbCB0eXBlIHRvIGR1bWIgc28gdGhlIG91dHB1dCBvZiByZWFkbGluZSBjYW4gYmUKKyAgICogdW5kZXJzdG9vZCBieSB0Z2RiICovCisgIGlmICggcmxfcmVzZXRfdGVybWluYWwoImR1bWIiKSA9PSAtMSApCisgICAgcmV0dXJuIC0xOworCisgIC8qIEZvciBzb21lIHJlYXNvbiwgcmVhZGxpbmUgY2FuIG5vdCBkZXByZXAgdGhlIHRlcm1pbmFsLgorICAgKiBIb3dldmVyLCBpdCBkb2Vzbid0IG1hdHRlciBiZWNhdXNlIG5vIG90aGVyIGFwcGxpY2F0aW9uIGlzIHdvcmtpbmcgb24KKyAgICogdGhlIHRlcm1pbmFsIGJlc2lkZXMgcmVhZGxpbmUgKi8KKyAgcmxfZGVwcmVwX3Rlcm1fZnVuY3Rpb24gPSBjdXN0b21fZGVwcmVwX3Rlcm1fZnVuY3Rpb247CisKKyAgdXNpbmdfaGlzdG9yeSgpOworICByZWFkX2hpc3RvcnkoIi5oaXN0b3J5Iik7IAorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IAorbWFpbl9sb29wKHZvaWQpCit7CisgIGZkX3NldCByc2V0OworICBpbnQgbWF4OworICAgIAorICBtYXggPSAobWFzdGVyZmQgPiBTVERJTl9GSUxFTk8pID8gbWFzdGVyZmQgOiBTVERJTl9GSUxFTk87CisgIG1heCA9IChtYXggPiBzbGF2ZWZkKSA/IG1heCA6IHNsYXZlZmQ7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICAvKiBSZXNldCB0aGUgZmRfc2V0LCBhbmQgd2F0Y2ggZm9yIGlucHV0IGZyb20gR0RCIG9yIHN0ZGluICovCisgICAgICBGRF9aRVJPKCZyc2V0KTsKKyAgICAgICAgCisgICAgICBGRF9TRVQoU1RESU5fRklMRU5PLCAmcnNldCk7CisgICAgICBGRF9TRVQoc2xhdmVmZCwgJnJzZXQpOworICAgICAgRkRfU0VUKG1hc3RlcmZkLCAmcnNldCk7CisKKyAgICAgIC8qIFdhaXQgZm9yIGlucHV0ICovCisgICAgICBpZiAoc2VsZWN0KG1heCArIDEsICZyc2V0LCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgLyogSW5wdXQgcmVjZWl2ZWQgdGhyb3VnaCB0aGUgcHR5OiAgSGFuZGxlIGl0IAorICAgICAgICogV3JvdGUgdG8gbWFzdGVyZmQsIHNsYXZlIGZkIGhhcyB0aGF0IGlucHV0LCBhbGVydCByZWFkbGluZSB0byByZWFkIGl0LiAKKyAgICAgICAqLworICAgICAgaWYgKEZEX0lTU0VUKHNsYXZlZmQsICZyc2V0KSkKKyAgICAgICAgcmxfY2FsbGJhY2tfcmVhZF9jaGFyKCk7CisKKyAgICAgIC8qIElucHV0IHJlY2VpdmVkIHRocm91Z2ggdGhlIHB0eS4KKyAgICAgICAqIFJlYWRsaW5lIHJlYWQgZnJvbSBzbGF2ZWZkLCBhbmQgaXQgd3JvdGUgdG8gdGhlIG1hc3RlcmZkLiAKKyAgICAgICAqLworICAgICAgaWYgKEZEX0lTU0VUKG1hc3RlcmZkLCAmcnNldCkpCisgICAgICAgIGlmICggcmVhZGxpbmVfaW5wdXQoKSA9PSAtMSApCisgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAvKiBJbnB1dCByZWNlaXZlZDogIEhhbmRsZSBpdCwgd3JpdGUgdG8gbWFzdGVyZmQgKGlucHV0IHRvIHJlYWRsaW5lKSAqLworICAgICAgaWYgKEZEX0lTU0VUKFNURElOX0ZJTEVOTywgJnJzZXQpKQorICAgICAgICBpZiAoIHVzZXJfaW5wdXQoKSA9PSAtMSApCisgICAgICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZSB0ZXJtaW5hbCBhdHRyaWJ1dGVzIGJlZm9yZSBjYWxsaW5nIHR0eV9jYnJlYWsgKi8KK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyBzYXZlX3Rlcm1pb3M7CitzdGF0aWMgc3RydWN0IHdpbnNpemUgc2l6ZTsKK3N0YXRpYyBlbnVtIHsgUkVTRVQsIFRDQlJFQUsgfSB0dHlzdGF0ZSA9IFJFU0VUOworCisvKiB0dHlfY2JyZWFrOiBTZXRzIHRlcm1pbmFsIHRvIGNicmVhayBtb2RlLiBBbHNvIGtub3duIGFzIG5vbmNhbm9uaWNhbCBtb2RlLgorICogICAgMS4gU2lnbmFsIGhhbmRsaW5nIGlzIHN0aWxsIHR1cm5lZCBvbiwgc28gdGhlIHVzZXIgY2FuIHN0aWxsIHR5cGUgdGhvc2UuCisgKiAgICAyLiBlY2hvIGlzIG9mZgorICogICAgMy4gUmVhZCBpbiBvbmUgY2hhciBhdCBhIHRpbWUuCisgKgorICogZmQgICAgLSBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSB0ZXJtaW5hbAorICogCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2VzcywgLTEgb24gZXJyb3IKKyAqLworaW50IHR0eV9jYnJlYWsoaW50IGZkKXsKKyAgIHN0cnVjdCB0ZXJtaW9zIGJ1ZjsKKyAgICBpbnQgdHR5c2F2ZWZkID0gLTE7CisgICAKKyAgIGlmKHRjZ2V0YXR0cihmZCwgJnNhdmVfdGVybWlvcykgPCAwKQorICAgICAgcmV0dXJuIC0xOworICAgICAgCisgICBidWYgPSBzYXZlX3Rlcm1pb3M7CisgICBidWYuY19sZmxhZyAmPSB+KEVDSE8gfCBJQ0FOT04pOworICAgYnVmLmNfaWZsYWcgJj0gfihJQ1JOTCB8IElOTENSKTsKKyAgIGJ1Zi5jX2NjW1ZNSU5dID0gMTsKKyAgIGJ1Zi5jX2NjW1ZUSU1FXSA9IDA7CisKKyNpZiBkZWZpbmVkIChWTE5FWFQpICYmIGRlZmluZWQgKF9QT1NJWF9WRElTQUJMRSkKKyAgIGJ1Zi5jX2NjW1ZMTkVYVF0gPSBfUE9TSVhfVkRJU0FCTEU7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKFZEU1VTUCkgJiYgZGVmaW5lZCAoX1BPU0lYX1ZESVNBQkxFKQorICAgYnVmLmNfY2NbVkRTVVNQXSA9IF9QT1NJWF9WRElTQUJMRTsKKyNlbmRpZgorCisgIC8qIGVuYWJsZSBmbG93IGNvbnRyb2w7IG9ubHkgc3R0eSBzdGFydCBjaGFyIGNhbiByZXN0YXJ0IG91dHB1dCAqLworI2lmIDAKKyAgYnVmLmNfaWZsYWcgfD0gKElYT058SVhPRkYpOworI2lmZGVmIElYQU5ZCisgIGJ1Zi5jX2lmbGFnICY9IH5JWEFOWTsKKyNlbmRpZgorI2VuZGlmCisKKyAgLyogZGlzYWJsZSBmbG93IGNvbnRyb2w7IGxldCBeUyBhbmQgXlEgdGhyb3VnaCB0byBwdHkgKi8KKyAgYnVmLmNfaWZsYWcgJj0gfihJWE9OfElYT0ZGKTsKKyNpZmRlZiBJWEFOWQorICBidWYuY19pZmxhZyAmPSB+SVhBTlk7CisjZW5kaWYKKworICBpZih0Y3NldGF0dHIoZmQsIFRDU0FGTFVTSCwgJmJ1ZikgPCAwKQorICAgICAgcmV0dXJuIC0xOworCisgICB0dHlzdGF0ZSA9IFRDQlJFQUs7CisgICB0dHlzYXZlZmQgPSBmZDsKKworICAgLyogc2V0IHNpemUgKi8KKyAgIGlmKGlvY3RsKGZkLCBUSU9DR1dJTlNaLCAoY2hhciAqKSZzaXplKSA8IDApCisgICAgICByZXR1cm4gLTE7CisKKyNpZmRlZiBERUJVRworICAgZXJyX21zZygiJWQgcm93cyBhbmQgJWQgY29sc1xuIiwgc2l6ZS53c19yb3csIHNpemUud3NfY29sKTsgICAKKyNlbmRpZgorICAgCisgICByZXR1cm4gKDApOyAgIAorfQorCitpbnQgCit0dHlfb2ZmX3hvbl94b2ZmIChpbnQgZmQpCit7CisgIHN0cnVjdCB0ZXJtaW9zIGJ1ZjsKKyAgaW50IHR0eXNhdmVmZCA9IC0xOworCisgIGlmKHRjZ2V0YXR0cihmZCwgJmJ1ZikgPCAwKQorICAgIHJldHVybiAtMTsKKyAgICAgCisgIGJ1Zi5jX2lmbGFnICY9IH4oSVhPTnxJWE9GRik7CisKKyAgaWYodGNzZXRhdHRyKGZkLCBUQ1NBRkxVU0gsICZidWYpIDwgMCkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIDA7ICAgCit9CisKKy8qIHR0eV9yZXNldDogU2V0cyB0aGUgdGVybWluYWwgYXR0cmlidXRlcyBiYWNrIHRvIHRoZWlyIHByZXZpb3VzIHN0YXRlLgorICogUFJFOiB0dHlfY2JyZWFrIG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkLgorICogCisgKiBmZCAgICAtIFRoZSBmaWxlIGRlc2NyaW9wdG9yIG9mIHRoZSB0ZXJtaW5hbCB0byByZXNldC4KKyAqIAorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgorICovCitpbnQgdHR5X3Jlc2V0KGludCBmZCkKK3sKKyAgIGlmKHR0eXN0YXRlICE9IFRDQlJFQUspCisgICAgICByZXR1cm4gKDApOworCisgICBpZih0Y3NldGF0dHIoZmQsIFRDU0FGTFVTSCwgJnNhdmVfdGVybWlvcykgPCAwKQorICAgICAgcmV0dXJuICgtMSk7CisgICAgICAKKyAgIHR0eXN0YXRlID0gUkVTRVQ7CisgICAKKyAgIHJldHVybiAwOyAgIAorfQorCitpbnQgCittYWluKCkKK3sKKyAgaW50IHZhbDsKKyAgdmFsID0gb3BlbnB0eSAoJm1hc3RlcmZkLCAmc2xhdmVmZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICh2YWwgPT0gLTEpCisgICAgcmV0dXJuIC0xOworCisgIHZhbCA9IHR0eV9vZmZfeG9uX3hvZmYgKG1hc3RlcmZkKTsKKyAgaWYgKHZhbCA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisKKyAgdmFsID0gaW5pdF9yZWFkbGluZSAoc2xhdmVmZCwgc2xhdmVmZCk7CisgIGlmICh2YWwgPT0gLTEpCisgICAgcmV0dXJuIC0xOworCisgIHZhbCA9IHR0eV9jYnJlYWsgKFNURElOX0ZJTEVOTyk7CisgIGlmICh2YWwgPT0gLTEpCisgICAgcmV0dXJuIC0xOworCisgIHNpZ25hbCAoU0lHSU5ULCBzaWdpbnQpOworCisgIHZhbCA9IG1haW5fbG9vcCAoKTsKKworICB0dHlfcmVzZXQgKFNURElOX0ZJTEVOTyk7CisKKyAgaWYgKHZhbCA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yZWFkbGluZS9zdXBwb3J0L2NvbmZpZy5ycGF0aCBiL3JlYWRsaW5lL3N1cHBvcnQvY29uZmlnLnJwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZhMjRiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbGluZS9zdXBwb3J0L2NvbmZpZy5ycGF0aApAQCAtMCwwICsxLDU0OCBAQAorIyEgL2Jpbi9zaAorIyBPdXRwdXQgYSBzeXN0ZW0gZGVwZW5kZW50IHNldCBvZiB2YXJpYWJsZXMsIGRlc2NyaWJpbmcgaG93IHRvIHNldCB0aGUKKyMgcnVuIHRpbWUgc2VhcmNoIHBhdGggb2Ygc2hhcmVkIGxpYnJhcmllcyBpbiBhbiBleGVjdXRhYmxlLgorIworIyAgIENvcHlyaWdodCAxOTk2LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgVGFrZW4gZnJvbSBHTlUgbGlidG9vbCwgMjAwMQorIyAgIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgICBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgICBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyAgIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgVGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIGZpbGUgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHNwZWNpZmljYXRpb24sCisjICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yCisjICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIENDLCBHQ0MsIExERkxBR1MsIExELCB3aXRoX2dudV9sZAorIyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBjYWxsZXIuCisjCisjIFRoZSBzZXQgb2YgZGVmaW5lZCB2YXJpYWJsZXMgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIHNjcmlwdC4KKworIyBLbm93biBsaW1pdGF0aW9uczoKKyMgLSBPbiBJUklYIDYuNSB3aXRoIENDPSJjYyIsIHRoZSBydW4gdGltZSBzZWFyY2ggcGF0Y2ggbXVzdCBub3QgYmUgbG9uZ2VyCisjICAgdGhhbiAyNTYgYnl0ZXMsIG90aGVyd2lzZSB0aGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgZHVtcCBjb3JlLiBUaGUgb25seQorIyAgIGtub3duIHdvcmthcm91bmQgaXMgdG8gY2hvb3NlIHNob3J0ZXIgZGlyZWN0b3J5IG5hbWVzIGZvciB0aGUgYnVpbGQKKyMgICBkaXJlY3RvcnkgYW5kL29yIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCisjIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nIChleGNlcHQgTSRWQywKKyMgd2hpY2ggbmVlZHMgJy5saWInKS4KK2xpYmV4dD1hCitzaHJleHQ9LnNvCisKK2hvc3Q9IiQxIgoraG9zdF9jcHU9YGVjaG8gIiRob3N0IiB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAiJGhvc3QiIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gIiRob3N0IiB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCisKKyMgQ29kZSB0YWtlbiBmcm9tIGxpYnRvb2wubTQncyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDLgorCit3bD0KK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHdsPSctV2wsJworZWxzZQorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICBhaXgqKQorICAgICAgd2w9Jy1XbCwnCisgICAgICA7OworICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgIDs7CisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICB3bD0nLVdsLCcKKyAgICAgIDs7CisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIHdsPSctV2wsJworICAgICAgOzsKKyAgICBuZXdzb3M2KQorICAgICAgOzsKKyAgICBsaW51eCopCisgICAgICBjYXNlICRDQyBpbgorICAgICAgICBpY2N8ZWNjKQorICAgICAgICAgIHdsPSctV2wsJworICAgICAgICAgIDs7CisgICAgICAgIGNjYykKKyAgICAgICAgICB3bD0nLVdsLCcKKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICB3bD0nLVdsLCcKKyAgICAgIDs7CisgICAgc2NvMy4ydjUqKQorICAgICAgOzsKKyAgICBzb2xhcmlzKikKKyAgICAgIHdsPSctV2wsJworICAgICAgOzsKKyAgICBzdW5vczQqKQorICAgICAgd2w9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIDs7CisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICAgICAgd2w9Jy1XbCwnCisgICAgICA7OworICAgIHN5c3Y0Kk1QKikKKyAgICAgIDs7CisgICAgdXRzNCopCisgICAgICA7OworICBlc2FjCitmaQorCisjIENvZGUgdGFrZW4gZnJvbSBsaWJ0b29sLm00J3MgQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUy4KKworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CitoYXJkY29kZV9kaXJlY3Q9bm8KK2hhcmRjb2RlX21pbnVzX0w9bm8KKworY2FzZSAiJGhvc3Rfb3MiIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKK2VzYWMKKworbGRfc2hsaWJzPXllcworaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKyAgICAgICAgbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBhbWlnYW9zKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cworICAgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKKyAgICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAorICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKKyAgICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbiB1c2UKKyAgICAgICMgdGhlbS4KKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgOgorICAgICAgZWxzZQorICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgOgorICAgICAgZWxzZQorICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIG5ldGJzZCopCisgICAgICA7OworICAgIHNvbGFyaXMqIHwgc3lzdjUqKQorICAgICAgaWYgJExEIC12IDI+JjEgfCBlZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGxkX3NobGlicz1ubworICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIDoKKyAgICAgIGVsc2UKKyAgICAgICAgbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBzdW5vczQqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgOzsKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICA6CisgICAgICBlbHNlCisgICAgICAgIGxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisgIGVzYWMKKyAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSB5ZXM7IHRoZW4KKyAgICAjIFVubGlrZSBsaWJ0b29sLCB3ZSB1c2UgLXJwYXRoIGhlcmUsIG5vdCAtLXJwYXRoLCBzaW5jZSB0aGUgZG9jdW1lbnRlZAorICAgICMgb3B0aW9uIG9mIEdOVSBsZCBpcyBjYWxsZWQgLXJwYXRoLCBub3QgLS1ycGF0aC4KKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgIGZpCitlbHNlCisgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIGFpeDMqKQorICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKyAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgICAjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKyAgICAgICAgIyBicm9rZW4gY29sbGVjdDIuCisgICAgICAgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisgICAgYWl4NCogfCBhaXg1KikKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKyAgICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgIGVsc2UKKyAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworICAgICAgICAjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKyAgICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisgICAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQorICAgICAgICAgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworICAgICAgICAgICAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKyAgICAgICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKyAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorICAgICAgICBlc2FjCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCisgICAgICAgICAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorICAgICAgICAgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKyAgICAgICAgICAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKyAgICAgICAgICB0aGVuCisgICAgICAgICAgICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKyAgICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICAgICAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQorICAgICAgICAgIGZpCisgICAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICAjIEJlZ2luIF9MVF9BQ19TWVNfTElCUEFUSF9BSVguCisgICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKKyAgICAgICR7Q0N9ICR7TERGTEFHU30gY29uZnRlc3QuYyAtbyBjb25mdGVzdAorICAgICAgYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QgMj4vZGV2L251bGwgfCBzZWQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisgICAgICBpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCisgICAgICAgIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0IDI+L2Rldi9udWxsIHwgc2VkIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4KKyAgICAgICAgYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiCisgICAgICBmaQorICAgICAgcm0gLWYgY29uZnRlc3QuYyBjb25mdGVzdAorICAgICAgIyBFbmQgX0xUX0FDX1NZU19MSUJQQVRIX0FJWC4KKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorICAgICAgZWxzZQorICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworICAgICAgICBlbHNlCisgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgICA7OworICAgIGFtaWdhb3MqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKyAgICBic2RpNCopCisgICAgICA7OworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisgICAgICBsaWJleHQ9bGliCisgICAgICA7OworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICBpZiAkQ0MgLXYgMj4mMSB8IGdyZXAgJ0FwcGxlJyA+L2Rldi9udWxsIDsgdGhlbgorICAgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGRndXgqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgOzsKKyAgICBmcmVlYnNkMSopCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZDIuMiopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICA7OworICAgIGZyZWVic2QyKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICA7OworICAgIGZyZWVic2QqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgOzsKKyAgICBocHV4OSopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIDs7CisgICAgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKyAgICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgICAgIGhwcGEqNjQqKQorICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICBpYTY0KikKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICAgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIDs7CisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKyAgICBuZXRic2QqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgOzsKKyAgICBuZXdzb3M2KQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworICAgIG9wZW5ic2QqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICBlbHNlCisgICAgICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICAgICAgIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIDs7CisgICAgb3MyKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICA7OworICAgIG9zZjMqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworICAgIG9zZjQqIHwgb3NmNSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisgICAgICAgICMgQm90aCBjYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKyAgICBzY28zLjJ2NSopCisgICAgICA7OworICAgIHNvbGFyaXMqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgOzsKKyAgICBzdW5vczQqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIDs7CisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgICAgICBzbmkpCisgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKyAgICAgICAgICA7OworICAgICAgICBzaWVtZW5zKQorICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgICAgIDs7CisgICAgICAgIG1vdG9yb2xhKQorICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgc3lzdjQuMyopCisgICAgICA7OworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKyAgICAgICAgbGRfc2hsaWJzPXllcworICAgICAgZmkKKyAgICAgIDs7CisgICAgc3lzdjQuMnV3MiopCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPW5vCisgICAgICA7OworICAgIHN5c3Y1T3BlblVOSVg4KiB8IHN5c3Y1VW5peFdhcmU3KiB8ICBzeXN2NXV3Wzc4XSogfCB1bml4d2FyZTcqKQorICAgICAgOzsKKyAgICBzeXN2NSopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQorICAgICAgOzsKKyAgICB1dHM0KikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKyAgZXNhYworZmkKKworIyBDaGVjayBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MKKyMgQ29kZSB0YWtlbiBmcm9tIGxpYnRvb2wubTQncyBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUi4KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitjYXNlICIkaG9zdF9vcyIgaW4KKyAgYWl4MyopCisgICAgOzsKKyAgYWl4NCogfCBhaXg1KikKKyAgICA7OworICBhbWlnYW9zKikKKyAgICA7OworICBiZW9zKikKKyAgICA7OworICBic2RpNCopCisgICAgOzsKKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgIHNocmV4dD0uZGxsCisgICAgOzsKKyAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICBzaHJleHQ9LmR5bGliCisgICAgOzsKKyAgZGd1eCopCisgICAgOzsKKyAgZnJlZWJzZDEqKQorICAgIDs7CisgIGZyZWVic2QqKQorICAgIDs7CisgIGdudSopCisgICAgOzsKKyAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgaWE2NCopCisgICAgICAgIHNocmV4dD0uc28KKyAgICAgICAgOzsKKyAgICAgIGhwcGEqNjQqKQorICAgICAgICBzaHJleHQ9LnNsCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBzaHJleHQ9LnNsCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgICBpcml4NSogfCBub25zdG9wdXgqKQorICAgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBjYXNlICRMRCBpbgorICAgICAgICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpIGxpYnN1ZmY9IHNobGlic3VmZj0gOzsKKyAgICAgICAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKSBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgOzsKKyAgICAgICAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgOzsKKyAgICAgICAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgICA7OworICBsaW51eCopCisgICAgOzsKKyAgbmV0YnNkKikKKyAgICA7OworICBuZXdzb3M2KQorICAgIDs7CisgIG50by1xbngpCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgOzsKKyAgb3MyKikKKyAgICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICAgIHNocmV4dD0uZGxsCisgICAgOzsKKyAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICA7OworICBzb2xhcmlzKikKKyAgICA7OworICBzdW5vczQqKQorICAgIDs7CisgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKyAgICA7OworICBzeXN2NCpNUCopCisgICAgOzsKKyAgdXRzNCopCisgICAgOzsKK2VzYWMKKworc2VkX3F1b3RlX3N1YnN0PSdzL1woWyJgJFxcXVwpL1xcXDEvZycKK2VzY2FwZWRfd2w9YGVjaG8gIlgkd2wiIHwgc2VkIC1lICdzL15YLy8nIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKK3NobGliZXh0PWBlY2hvICIkc2hyZXh0IiB8IHNlZCAtZSAncyxeXC4sLCdgCitlc2NhcGVkX2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9YGVjaG8gIlgkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfCBzZWQgLWUgJ3MvXlgvLycgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCitzZWQgLWUgJ3MvXlwoW2EtekEtWjAtOV9dKlwpPS9hY2xfY3ZfXDE9LycgPDxFT0YKKworIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgord2w9IiRlc2NhcGVkX3dsIgorCisjIFN0YXRpYyBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0iJGxpYmV4dCIKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICJzbyIpLgorc2hsaWJleHQ9IiRzaGxpYmV4dCIKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSIkZXNjYXBlZF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIgorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0iJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRS5zbyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9IiRoYXJkY29kZV9kaXJlY3QiCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSIkaGFyZGNvZGVfbWludXNfTCIKKworRU9GCmRpZmYgLS1naXQgYS9yZWFkbGluZS9zdXBwb3J0L21raW5zdGFsbGRpcnMgYi9yZWFkbGluZS9zdXBwb3J0L21raW5zdGFsbGRpcnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDJkNWYyMQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRsaW5lL3N1cHBvcnQvbWtpbnN0YWxsZGlycwpAQCAtMCwwICsxLDExMSBAQAorIyEgL2Jpbi9zaAorIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKKyMgQXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+CisjIENyZWF0ZWQ6IDE5OTMtMDUtMTYKKyMgUHVibGljIGRvbWFpbgorCitlcnJzdGF0dXM9MAorZGlybW9kZT0iIgorCit1c2FnZT0iXAorVXNhZ2U6IG1raW5zdGFsbGRpcnMgWy1oXSBbLS1oZWxwXSBbLW0gbW9kZV0gZGlyIC4uLiIKKworIyBwcm9jZXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLWggfCAtLWhlbHAgfCAtLWgqKSAgICAgICAgICMgLWggZm9yIGhlbHAKKyAgICAgIGVjaG8gIiR1c2FnZSIgMT4mMgorICAgICAgZXhpdCAwCisgICAgICA7OworICAgIC1tKSAgICAgICAgICAgICAgICAgICAgICAgICAjIC1tIFBFUk0gYXJnCisgICAgICBzaGlmdAorICAgICAgdGVzdCAkIyAtZXEgMCAmJiB7IGVjaG8gIiR1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgICBkaXJtb2RlPSQxCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAtLSkgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICBzaGlmdAorICAgICAgYnJlYWsKKyAgICAgIDs7CisgICAgLSopICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5rbm93biBvcHRpb24KKyAgICAgIGVjaG8gIiR1c2FnZSIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworICAgICopICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpcnN0IG5vbi1vcHQgYXJnCisgICAgICBicmVhaworICAgICAgOzsKKyAgZXNhYworZG9uZQorCitmb3IgZmlsZQorZG8KKyAgaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisgICAgc2hpZnQKKyAgZWxzZQorICAgIGJyZWFrCisgIGZpCitkb25lCisKK2Nhc2UgJCMgaW4KKyAgMCkgZXhpdCAwIDs7Citlc2FjCisKK2Nhc2UgJGRpcm1vZGUgaW4KKyAgJycpCisgICAgaWYgbWtkaXIgLXAgLS0gLiAyPi9kZXYvbnVsbDsgdGhlbgorICAgICAgZWNobyAibWtkaXIgLXAgLS0gJCoiCisgICAgICBleGVjIG1rZGlyIC1wIC0tICIkQCIKKyAgICBmaQorICAgIDs7CisgICopCisgICAgaWYgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLSAuIDI+L2Rldi9udWxsOyB0aGVuCisgICAgICBlY2hvICJta2RpciAtbSAkZGlybW9kZSAtcCAtLSAkKiIKKyAgICAgIGV4ZWMgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLSAiJEAiCisgICAgZmkKKyAgICA7OworZXNhYworCitmb3IgZmlsZQorZG8KKyAgc2V0IGZub3JkIGBlY2hvICI6JGZpbGUiIHwgc2VkIC1uZSAncy9eOlwvLyMvO3MvXjovLztzL1wvLyAvZztzL14jL1wvLztwJ2AKKyAgc2hpZnQKKworICBwYXRoY29tcD0KKyAgZm9yIGQKKyAgZG8KKyAgICBwYXRoY29tcD0iJHBhdGhjb21wJGQiCisgICAgY2FzZSAkcGF0aGNvbXAgaW4KKyAgICAgIC0qKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorICAgICAgZWNobyAibWtkaXIgJHBhdGhjb21wIgorCisgICAgICBta2RpciAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKyAgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorICAJZXJyc3RhdHVzPSRsYXN0ZXJyCisgICAgICBlbHNlCisgIAlpZiB0ZXN0ICEgLXogIiRkaXJtb2RlIjsgdGhlbgorCSAgZWNobyAiY2htb2QgJGRpcm1vZGUgJHBhdGhjb21wIgorICAgIAkgIGxhc3RlcnI9IiIKKyAgCSAgY2htb2QgIiRkaXJtb2RlIiAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKyAgCSAgaWYgdGVzdCAhIC16ICIkbGFzdGVyciI7IHRoZW4KKyAgCSAgICBlcnJzdGF0dXM9JGxhc3RlcnIKKyAgCSAgZmkKKyAgCWZpCisgICAgICBmaQorICAgIGZpCisKKyAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKKyAgZG9uZQorZG9uZQorCitleGl0ICRlcnJzdGF0dXMKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBFbmQ6CisjIG1raW5zdGFsbGRpcnMgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9zaW0vQ2hhbmdlTG9nIGIvc2ltL0NoYW5nZUxvZwppbmRleCA4M2U2ZGNjLi5jNWIxYWYwIDEwMDY0NAotLS0gYS9zaW0vQ2hhbmdlTG9nCisrKyBiL3NpbS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NCBAQAorMjAwNi0wNC0wOCAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYXhpcy5jb20+CisKKwkqIGNyaXMvY3Jpc3YzMmYuYyAoTVkgKGRlbGl2ZXJfaW50ZXJydXB0KSk6IFNldCBDQ1MgdG8gbmV3X2Njcy4KKworMjAwNi0wNC0wMyAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYXhpcy5jb20+CisKKwkqIGNyaXMvZHYtY3Jpcy5jLCBjcmlzL2R2LXJ2LmMsIGNyaXMvcnZkdW1teS5jOiBOZXcgZmlsZXMuCisJKiBjcmlzL01ha2VmaWxlLmluIChDT05GSUdfREVWSUNFUyk6IFJlbW92ZSByZWR1bmRhbnQgc2V0dGluZy4KKwkoZHYtY3Jpcy5vLCBkdi1ydi5vIHJ2ZHVtbXkkKEVYRUVYVCksIHJ2ZHVtbXkubyk6IE5ldyBydWxlcy4KKwkoYWxsKTogRGVwZW5kIG9uIHJ2ZHVtbXkkKEVYRUVYVCkuCisJKiBjcmlzL2NvbmZpZ3VyZS5hYzogQ2FsbCBTSU1fQUNfT1BUSU9OX1dBUk5JTkdTLiAgQ2hlY2sgZm9yCisJc3lzL3NvY2tldC5oIGFuZCBzeXMvc2VsZWN0LmguICBDYWxsIFNJTV9BQ19PUFRJT05fSEFSRFdBUkUsCisJZGVmYXVsdCBvZmYuCisJKiBjcmlzL2NvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGNyaXMvY3Jpcy1zaW0uaCAoY3Jpc19oYXZlXzkwMDAwMHh4aWYpOiBEZWNsYXJlIGhlcmUuCisJKGVudW0gY3Jpc19pbnRlcnJ1cHRfdHlwZSwgY3Jpc3YxMGRlbGl2ZXJfaW50ZXJydXB0KQorCShjcmlzdjMyZGVsaXZlcl9pbnRlcnJ1cHQ6IE5ldyBkZWNsYXJhdGlvbnMuCisJKiBjcmlzL2NyaXMtdG1wbC5jIFtXSVRIX0hXXSAoTVkgKGZfbW9kZWxfaW5zbl9hZnRlcikpOiBDYWxsCisJc2ltX2V2ZW50c190aWNrbiBhbmQgc2V0IHN0YXRlLWV2ZW50cyBtZW1iZXIgd29ya19wZW5kaW5nIHdoZW4gaXQncworCXRpbWUgZm9yIHRoZSBuZXh0IGV2ZW50LgorCVtXSVRIX0hXXSAoTVkgKGZfc3BlY2lmaWNfaW5pdCkpOiBTZXQgQ1BVLW1vZGVsLXNwZWNpZmljCisJaW50ZXJydXB0LWRlbGl2ZXJ5IGZ1bmN0aW9uLgorCSogY3Jpcy9jcmlzdjEwZi5jIChNWSAoZGVsaXZlcl9pbnRlcnJ1cHQpKTogTmV3IGZ1bmN0aW9uLgorCSogY3Jpcy9jcmlzdjMyZi5jIChNWSAoZGVsaXZlcl9pbnRlcnJ1cHQpKTogTmV3IGZ1bmN0aW9uLgorCSogY3Jpcy9kZXZpY2VzLmM6IEluY2x1ZGUgaHctZGV2aWNlLmguCisJKGRldmljZV9pb19yZWFkX2J1ZmZlcikgW1dJVEhfSFddOiBDYWxsIGh3X2lvX3JlYWRfYnVmZmVyLgorCShkZXZpY2VfaW9fd3JpdGVfYnVmZmVyKTogT25seSBwZXJmb3JtIDB4OTAwMDAweHgtZnVuY3Rpb25zIGlmCisJY3Jpc19oYXZlXzkwMDAwMHh4aWYgaXMgbm9uemVyby4gIEVsc2UgaWYgV0lUSF9IVyBkZWZpbmVkLAorCWNhbGwgaHdfaW9fd3JpdGVfYnVmZmVyLiAgQWRkIHJldHVybiAwIGxhc3QgaW4gZnVuY3Rpb24uCisJKiBjcmlzL3NpbS1pZi5jIChjcmlzX2hhdmVfOTAwMDAweHhpZik6IE5vdyBnbG9iYWwuCisJKHNpbV9vcGVuKSBbV0lUSF9IV106IENsZWFyIGRlbGl2ZXJfaW50ZXJydXB0IGNwdSBtZW1iZXIuCisJRm9yY2UgIi1tb2RlbCIgb3B0aW9uLCBlZmZlY3RpdmVseS4KKwkqIGNyaXMvc2ltLW1haW4uaCAoY3Jpc19pbnRlcnJ1cHRfZGVsaXZlcnlfZm4pOiBOZXcgdHlwZS4KKwkoc3RydWN0IF9zaW1fY3B1KSBbV0lUSF9IV106IE5ldyBtZW1iZXIgZGVsaXZlcl9pbnRlcnJ1cHQuCisKKzIwMDYtMDQtMDIgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuY29tPgorCisJKiBjcmlzL01ha2VmaWxlLmluIChDUklTVjEwRl9PQkpTKTogUmVtb3ZlIHNlbWNyaXN2MTBmLXN3aXRjaC5vLgorCShDUklTVjMyRl9PQkpTKTogUmVtb3ZlIHNlbWNyaXN2MzJmLXN3aXRjaC5vLgorCShzZW1jcmlzdjEwZi1zd2l0Y2gubywgc2VtY3Jpc3YzMmYtc3dpdGNoLm86IFJlbW92ZSBkZXBlbmRlbmN5IHJ1bGVzLgorCiAyMDA2LTAzLTEzICBESiBEZWxvcmllICA8ZGpAcmVkaGF0LmNvbT4KIAogCSogTUFJTlRBSU5FUlM6IEFkZCBzZWxmIGFzIG0zMmMgc2ltIG1haW50YWluZXIuCmRpZmYgLS1naXQgYS9zaW0vY3Jpcy9NYWtlZmlsZS5pbiBiL3NpbS9jcmlzL01ha2VmaWxlLmluCmluZGV4IDg1YWYwMzQuLmUzMDc0MDEgMTAwNjQ0Ci0tLSBhL3NpbS9jcmlzL01ha2VmaWxlLmluCisrKyBiL3NpbS9jcmlzL01ha2VmaWxlLmluCkBAIC0yMCwxMCArMjAsOSBAQAogCiAjIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCiAKLUNSSVNWMTBGX09CSlMgPSBjcmlzdjEwZi5vIGNwdXYxMC5vIGRlY29kZXYxMC5vIHNlbWNyaXN2MTBmLXN3aXRjaC5vIG1vZGVsdjEwLm8gbWxvb3B2MTBmLm8KLUNSSVNWMzJGX09CSlMgPSBjcmlzdjMyZi5vIGNwdXYzMi5vIGRlY29kZXYzMi5vIHNlbWNyaXN2MzJmLXN3aXRjaC5vIG1vZGVsdjMyLm8gbWxvb3B2MzJmLm8KK0NSSVNWMTBGX09CSlMgPSBjcmlzdjEwZi5vIGNwdXYxMC5vIGRlY29kZXYxMC5vIG1vZGVsdjEwLm8gbWxvb3B2MTBmLm8KK0NSSVNWMzJGX09CSlMgPSBjcmlzdjMyZi5vIGNwdXYzMi5vIGRlY29kZXYzMi5vIG1vZGVsdjMyLm8gbWxvb3B2MzJmLm8KIAotQ09ORklHX0RFVklDRVMgPSBkdi1zb2Nrc2VyLm8KIENPTkZJR19ERVZJQ0VTID0KIAogU0lNX09CSlMgPSBcCkBAIC02MiwxMSArNjEsMjkgQEAKIAogc2ltLWlmLm86IHNpbS1pZi5jICQoU0lNX01BSU5fREVQUykgJChzaW0tY29yZV9oKSAkKHNpbS1vcHRpb25zX2gpCiAKKyMgTmVlZHMgQ1BVLXNwZWNpZmljIGtub3dsZWRnZS4KK2R2LWNyaXMubzogZHYtY3Jpcy5jICQoU0lNX01BSU5fREVQUykgJChzaW0tY29yZV9oKQorCisjIFRoaXMgaXMgdGhlIHNhbWUgcnVsZSBhcyBkdi1jb3JlLm8gZXRjLgorZHYtcnYubzogZHYtcnYuYyAkKGh3X21haW5faGVhZGVycykgJChzaW1fbWFpbl9oZWFkZXJzKQorCiBhcmNoLm86IGFyY2guYyAkKFNJTV9NQUlOX0RFUFMpCiAKIHRyYXBzLm86IHRyYXBzLmMgdGFyZy12YWxzLmggJChTSU1fTUFJTl9ERVBTKSAkKHNpbS1vcHRpb25zX2gpCiBkZXZpY2VzLm86IGRldmljZXMuYyAkKFNJTV9NQUlOX0RFUFMpCiAKKyMgcnZkdW1teSBpcyBqdXN0IHVzZWQgZm9yIHRlc3RpbmcuICBJdCBkb2VzIG5vdGhpbmcgaWYKKyMgLS1lbmFibGUtc2ltLWhhcmR3YXJlIGlzbid0IGFjdGl2ZS4KKworYWxsOiBydmR1bW15JChFWEVFWFQpCisKK2NoZWNrOiBydmR1bW15JChFWEVFWFQpCisKK3J2ZHVtbXkkKEVYRUVYVCk6IHJ2ZHVtbXkubyAkKEVYVFJBX0xJQkRFUFMpCisJJChDQykgJChBTExfQ0ZMQUdTKSAtbyBydmR1bW15JChFWEVFWFQpIHJ2ZHVtbXkubyAkKEVYVFJBX0xJQlMpCisKK3J2ZHVtbXkubzogcnZkdW1teS5jIGNvbmZpZy5oIHRjb25maWcuaCAkKHJlbW90ZV9zaW1faCkgJChjYWxsYmFja19oKQorCiAjIENSSVNWMTAgb2JqcwogCiBDUklTVjEwRl9JTkNMVURFX0RFUFMgPSBcCkBAIC04OSw3ICsxMDYsNiBAQAogCiBjcHV2MTAubzogY3B1djEwLmMgJChDUklTVjEwRl9JTkNMVURFX0RFUFMpCiBkZWNvZGV2MTAubzogZGVjb2RldjEwLmMgJChDUklTVjEwRl9JTkNMVURFX0RFUFMpCi1zZW1jcmlzdjEwZi1zd2l0Y2gubzogc2VtY3Jpc3YxMGYtc3dpdGNoLmMgJChDUklTVjEwRl9JTkNMVURFX0RFUFMpCiBtb2RlbHYxMC5vOiBtb2RlbHYxMC5jICQoQ1JJU1YxMEZfSU5DTFVERV9ERVBTKQogCiAjIENSSVNWMzIgb2JqcwpAQCAtMTE2LDcgKzEzMiw2IEBACiAKIGNwdXYzMi5vOiBjcHV2MzIuYyAkKENSSVNWMzJGX0lOQ0xVREVfREVQUykKIGRlY29kZXYzMi5vOiBkZWNvZGV2MzIuYyAkKENSSVNWMzJGX0lOQ0xVREVfREVQUykKLXNlbWNyaXN2MzJmLXN3aXRjaC5vOiBzZW1jcmlzdjMyZi1zd2l0Y2guYyAkKENSSVNWMzJGX0lOQ0xVREVfREVQUykKIG1vZGVsdjMyLm86IG1vZGVsdjMyLmMgJChDUklTVjMyRl9JTkNMVURFX0RFUFMpCiAKIGNyaXMtY2xlYW46CmRpZmYgLS1naXQgYS9zaW0vY3Jpcy9jb25maWd1cmUgYi9zaW0vY3Jpcy9jb25maWd1cmUKaW5kZXggMjUzMzY4Yy4uYjE1ZTdkYyAxMDA3NTUKLS0tIGEvc2ltL2NyaXMvY29uZmlndXJlCisrKyBiL3NpbS9jcmlzL2NvbmZpZ3VyZQpAQCAtODYxLDYgKzg2MSw5IEBACiAgIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQ9YWxpZ24JCVNwZWNpZnkgc3RyaWN0LCAgbm9uc3RyaWN0IG9yIGZvcmNlZCBhbGlnbm1lbnQgb2YgbWVtb3J5IGFjY2Vzc2VzLgogICAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbj1lbmQJCVNwZWNpZnkgaG9zdCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4KICAgLS1lbmFibGUtc2ltLXNjYWNoZT1zaXplCQlTcGVjaWZ5IHNpbXVsYXRvciBleGVjdXRpb24gY2FjaGUgc2l6ZS4KKyAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3MgRW5hYmxlIGJ1aWxkLXRpbWUgY29tcGlsZXIgd2FybmluZ3MgaWYgZ2NjIGlzIHVzZWQKKyAgLS1lbmFibGUtZ2RiLWJ1aWxkLXdhcm5pbmdzIEVuYWJsZSBTSU0gc3BlY2lmaWMgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyBpZiBnY2MgaXMgdXNlZAorICAtLWVuYWJsZS1zaW0taGFyZHdhcmU9TElTVAkJU3BlY2lmeSB0aGUgaGFyZHdhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLgogICAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD1tb2RlbAlTcGVjaWZ5IGRlZmF1bHQgbW9kZWwgdG8gc2ltdWxhdGUuCiAgIC0tZW5hYmxlLXNpbS1lbnZpcm9ubWVudD1lbnZpcm9ubWVudAlTcGVjaWZ5IG1peGVkLCB1c2VyLCB2aXJ0dWFsIG9yIG9wZXJhdGluZyBlbnZpcm9ubWVudC4KICAgLS1lbmFibGUtc2ltLWlubGluZT1pbmxpbmVzCQlTcGVjaWZ5IHdoaWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW5saW5lZC4KQEAgLTcwNDAsNiArNzA0MywxNTkgQEAKIHNpbV9saW5rX2xpbmtzPSIke3NpbV9saW5rX2xpbmtzfSB0YXJnLXZhbHMuZGVmIgogCiAKKyMgRm9yIGR2LXJ2IGFuZCBydmR1bW15LgorCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL3NvY2tldC5oIHN5cy9zZWxlY3QuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKyAgICAoCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIHRoZSBBQ19QQUNLQUdFX05BTUUgbGlzdHMuICAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICApIHwKKyAgICAgIHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgorICAgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKKworZmkKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKwogd2lyZV9hbGlnbm1lbnQ9Ik5PTlNUUklDVF9BTElHTk1FTlQiCiBkZWZhdWx0X2FsaWdubWVudD0iIgogCkBAIC03MzY3LDYgKzc1MjMsMTgwIEBACiBmaTsKIAogCisjIE5PVEU6IERvbid0IGFkZCAtV2FsbCBvciAtV3VudXNlZCwgdGhleSBib3RoIGluY2x1ZGUKKyMgLVd1bnVzZWQtcGFyYW1ldGVyIHdoaWNoIHJlcG9ydHMgYm9ndXMgd2FybmluZ3MuCisjIE5PVEU6IElmIHlvdSBhZGQgdG8gdGhpcyBsaXN0LCByZW1lbWJlciB0byB1cGRhdGUKKyMgZ2RiL2RvYy9nZGJpbnQudGV4aW5mby4KK2J1aWxkX3dhcm5pbmdzPSItV2ltcGxpY2l0IC1XcmV0dXJuLXR5cGUgLVdjb21tZW50IC1XdHJpZ3JhcGhzIFwKKy1XZm9ybWF0IC1XcGFyZW50aGVzZXMgLVdwb2ludGVyLWFyaXRoIgorIyBHQ0Mgc3VwcG9ydHMgLVd1bmluaXRpYWxpemVkIG9ubHkgd2l0aCAtTyBvciAtT24sIG4gIT0gMC4KK2lmIHRlc3QgeCR7Q0ZMQUdTK3NldH0gPSB4c2V0OyB0aGVuCisgIGNhc2UgIiR7Q0ZMQUdTfSIgaW4KKyAgICAqIi1PMCIqICkgOzsKKyAgICAqIi1PIiogKQorICAgICAgYnVpbGRfd2FybmluZ3M9IiR7YnVpbGRfd2FybmluZ3N9IC1XdW5pbml0aWFsaXplZCIKKyAgICA7OworICBlc2FjCitlbHNlCisgIGJ1aWxkX3dhcm5pbmdzPSIke2J1aWxkX3dhcm5pbmdzfSAtV3VuaW5pdGlhbGl6ZWQiCitmaQorIyBVcCBmb3IgZGViYXRlOiAtV3N3aXRjaCAtV2NvbW1lbnQgLXRyaWdyYXBocyAtV3RyaWdyYXBocworIyAtV3VudXNlZC1mdW5jdGlvbiAtV3VudXNlZC1sYWJlbCAtV3VudXNlZC12YXJpYWJsZSAtV3VudXNlZC12YWx1ZQorIyAtV2NoYXItc3Vic2NyaXB0cyAtV3RyYWRpdGlvbmFsIC1Xc2hhZG93IC1XY2FzdC1xdWFsCisjIC1XY2FzdC1hbGlnbiAtV3dyaXRlLXN0cmluZ3MgLVdjb252ZXJzaW9uIC1Xc3RyaWN0LXByb3RvdHlwZXMKKyMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3JlZHVuZGFudC1kZWNscworIyAtV292ZXJsb2FkZWQtdmlydHVhbCAtV2lubGluZSAtV2Vycm9yIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIG9yIC0tZGlzYWJsZS1idWlsZC13YXJuaW5ncyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9idWlsZF93YXJuaW5ncytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfYnVpbGRfd2FybmluZ3MiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQk7OworICBubykJYnVpbGRfd2FybmluZ3M9Ii13Ijs7CisgICwqKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAorICAgICAgICBidWlsZF93YXJuaW5ncz0iJHtidWlsZF93YXJuaW5nc30gJHt0fSI7OworICAqLCkgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKKyAgICAgICAgYnVpbGRfd2FybmluZ3M9IiR7dH0gJHtidWlsZF93YXJuaW5nc30iOzsKKyAgKikgICAgYnVpbGRfd2FybmluZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkYnVpbGRfd2FybmluZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGNvbXBpbGVyIHdhcm5pbmcgZmxhZ3MgPSAkYnVpbGRfd2FybmluZ3MiIDY+JjEKK2ZpCitmaTsgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1idWlsZC13YXJuaW5ncyBvciAtLWRpc2FibGUtc2ltLWJ1aWxkLXdhcm5pbmdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9idWlsZF93YXJuaW5ncytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2J1aWxkX3dhcm5pbmdzIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJOzsKKyAgbm8pCWJ1aWxkX3dhcm5pbmdzPSItdyI7OworICAsKikgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKKyAgICAgICAgYnVpbGRfd2FybmluZ3M9IiR7YnVpbGRfd2FybmluZ3N9ICR7dH0iOzsKKyAgKiwpICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCisgICAgICAgIGJ1aWxkX3dhcm5pbmdzPSIke3R9ICR7YnVpbGRfd2FybmluZ3N9Ijs7CisgICopICAgIGJ1aWxkX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGJ1aWxkX3dhcm5pbmdzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBHREIgc3BlY2lmaWMgY29tcGlsZXIgd2FybmluZyBmbGFncyA9ICRidWlsZF93YXJuaW5ncyIgNj4mMQorZmkKK2ZpOyBXQVJOX0NGTEFHUz0iIgorV0VSUk9SX0NGTEFHUz0iIgoraWYgdGVzdCAieCR7YnVpbGRfd2FybmluZ3N9IiAhPSB4IC1hICJ4JEdDQyIgPSB4eWVzCit0aGVuCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGNvbXBpbGVyIHdhcm5pbmcgZmxhZ3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBjb21waWxlciB3YXJuaW5nIGZsYWdzLi4uICRFQ0hPX0MiID4mNgorICAgICMgU2VwYXJhdGUgb3V0IHRoZSAtV2Vycm9yIGZsYWcgYXMgc29tZSBmaWxlcyBqdXN0IGNhbm5vdCBiZQorICAgICMgY29tcGlsZWQgd2l0aCBpdCBlbmFibGVkLgorICAgIGZvciB3IGluICR7YnVpbGRfd2FybmluZ3N9OyBkbworCWNhc2UgJHcgaW4KKwktV2VyciopIFdFUlJPUl9DRkxBR1M9LVdlcnJvciA7OworCSopICMgQ2hlY2sgdGhhdCBHQ0MgYWNjZXB0cyBpdAorCSAgICBzYXZlZF9DRkxBR1M9IiRDRkxBR1MiCisJICAgIENGTEFHUz0iJENGTEFHUyAkdyIKKwkgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgV0FSTl9DRkxBR1M9IiR7V0FSTl9DRkxBR1N9ICR3IgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCSAgICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiCisJZXNhYworICAgIGRvbmUKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAke1dBUk5fQ0ZMQUdTfSR7V0VSUk9SX0NGTEFHU30iID4mNQorZWNobyAiJHtFQ0hPX1R9JHtXQVJOX0NGTEFHU30ke1dFUlJPUl9DRkxBR1N9IiA+JjYKK2ZpCisKKworaWYgdGVzdCB4Im5vIiA9IHgieWVzIjsgdGhlbgorICBzaW1faHdfcD15ZXMKK2Vsc2UKKyAgc2ltX2h3X3A9bm8KK2ZpCitpZiB0ZXN0ICIiOyB0aGVuCisgIGhhcmR3YXJlPSJjb3JlIHBhbCBnbHVlIgorZWxzZQorICBoYXJkd2FyZT0iY29yZSBwYWwgZ2x1ZSBydiBjcmlzIgorZmkKK3NpbV9od19jZmxhZ3M9Ii1EV0lUSF9IVz0xIgorc2ltX2h3PSIkaGFyZHdhcmUiCitzaW1faHdfb2Jqcz0iXCQoU0lNX0NPTU1PTl9IV19PQkpTKSBgZWNobyAkc2ltX2h3IHwgc2VkIC1lICdzL1woW14gXVteIF0qXCkvZHYtXDEuby9nJ2AiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWhhcmR3YXJlIG9yIC0tZGlzYWJsZS1zaW0taGFyZHdhcmUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2hhcmR3YXJlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faGFyZHdhcmUiCisKK2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1faHdfcD15ZXM7OworICBubykJc2ltX2h3X3A9bm87OworICAsKikgICBzaW1faHdfcD15ZXM7IGhhcmR3YXJlPSIke2hhcmR3YXJlfSBgZWNobyAke2VuYWJsZXZhbH0gfCBzZWQgLWUgJ3MvLC8gLydgIjs7CisgICosKSAgIHNpbV9od19wPXllczsgaGFyZHdhcmU9ImBlY2hvICR7ZW5hYmxldmFsfSB8IHNlZCAtZSAncy8sLyAvJ2AgJHtoYXJkd2FyZX0iOzsKKyAgKikJc2ltX2h3X3A9eWVzOyBoYXJkd2FyZT0iYGVjaG8gJHtlbmFibGV2YWx9IHwgc2VkIC1lICdzLywvIC8nYCInJzs7Citlc2FjCitpZiB0ZXN0ICIkc2ltX2h3X3AiICE9IHllczsgdGhlbgorICBzaW1faHdfb2Jqcz0KKyAgc2ltX2h3X2NmbGFncz0iLURXSVRIX0hXPTAiCisgIHNpbV9odz0KK2Vsc2UKKyAgc2ltX2h3X2NmbGFncz0iLURXSVRIX0hXPTEiCisgICMgcmVtb3ZlIGR1cGxpY2F0ZXMKKyAgc2ltX2h3PSIiCisgIHNpbV9od19vYmpzPSJcJChTSU1fQ09NTU9OX0hXX09CSlMpIgorICBmb3IgaSBpbiAkaGFyZHdhcmUgOyBkbworICAgIGNhc2UgIiAkc2ltX2h3ICIgaW4KKyAgICAgICoiICRpICIqKSA7OworICAgICAgKikgc2ltX2h3PSIkc2ltX2h3ICRpIiA7IHNpbV9od19vYmpzPSIkc2ltX2h3X29ianMgZHYtJGkubyI7OworICAgIGVzYWMKKyAgZG9uZQorZmkKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCAiJHNpbV9od19wIiA9ICJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaGFyZHdhcmUgdG8gJHNpbV9od19jZmxhZ3MsICRzaW1faHcsICRzaW1faHdfb2JqcyIKK2ZpCitlbHNlCisKK2lmIHRlc3QgIiRzaW1faHdfcCIgIT0geWVzOyB0aGVuCisgIHNpbV9od19vYmpzPQorICBzaW1faHdfY2ZsYWdzPSItRFdJVEhfSFc9MCIKKyAgc2ltX2h3PQorZmkKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBoYXJkd2FyZSB0byAkc2ltX2h3X2NmbGFncywgJHNpbV9odywgJHNpbV9od19vYmpzIgorZmkKK2ZpOworCiAjIFRoZSBkZWZhdWx0IG1vZGVsIHNob3VsZG4ndCBtYXR0ZXIgYXMgbG9uZyBhcyB0aGVyZSdzIGEgQkZELgogCiBkZWZhdWx0X3NpbV9kZWZhdWx0X21vZGVsPSJjcmlzdjMyIgpkaWZmIC0tZ2l0IGEvc2ltL2NyaXMvY29uZmlndXJlLmFjIGIvc2ltL2NyaXMvY29uZmlndXJlLmFjCmluZGV4IGEzNGE1MGIuLmEzNDlkOGQgMTAwNjQ0Ci0tLSBhL3NpbS9jcmlzL2NvbmZpZ3VyZS5hYworKysgYi9zaW0vY3Jpcy9jb25maWd1cmUuYWMKQEAgLTksOSArOSwxNCBAQAogIyBpdCBieSBpbmxpbmluZyB0aGUgbWFjcm8ncyBjb250ZW50cy4KIHNpbmNsdWRlKC4uL2NvbW1vbi9jb21tb24ubTQpCiAKKyMgRm9yIGR2LXJ2IGFuZCBydmR1bW15LgorQUNfQ0hFQ0tfSEVBREVSUyhzeXMvc29ja2V0Lmggc3lzL3NlbGVjdC5oKQorCiBTSU1fQUNfT1BUSU9OX0FMSUdOTUVOVChOT05TVFJJQ1RfQUxJR05NRU5UKQogU0lNX0FDX09QVElPTl9IT1NURU5ESUFOCiBTSU1fQUNfT1BUSU9OX1NDQUNIRSgxNjM4NCkKK1NJTV9BQ19PUFRJT05fV0FSTklOR1MKK1NJTV9BQ19PUFRJT05fSEFSRFdBUkUobm8sLHJ2IGNyaXMpCiAKICMgVGhlIGRlZmF1bHQgbW9kZWwgc2hvdWxkbid0IG1hdHRlciBhcyBsb25nIGFzIHRoZXJlJ3MgYSBCRkQuCiBTSU1fQUNfT1BUSU9OX0RFRkFVTFRfTU9ERUwoY3Jpc3YzMikKZGlmZiAtLWdpdCBhL3NpbS9jcmlzL2NyaXMtc2ltLmggYi9zaW0vY3Jpcy9jcmlzLXNpbS5oCmluZGV4IDY2ZjczNjUuLjQ5YTZmNjEgMTAwNjQ0Ci0tLSBhL3NpbS9jcmlzL2NyaXMtc2ltLmgKKysrIGIvc2ltL2NyaXMvY3Jpcy1zaW0uaApAQCAtMSw1ICsxLDUgQEAKIC8qIENvbGxlY3Rpb24gb2YganVuayBmb3IgQ1JJUy4KLSAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgIENvbnRyaWJ1dGVkIGJ5IEF4aXMgQ29tbXVuaWNhdGlvbnMuCiAKIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgc2ltdWxhdG9ycy4KQEAgLTg2LDYgKzg2LDE0IEBACiBleHRlcm4gVVNJIGNyaXN2MzJmX2JyZWFrX2hhbmRsZXIgKFNJTV9DUFUgKiwgVVNJLCBVU0kpOwogZXh0ZXJuIFVTSSBjcmlzX2JyZWFrXzEzX2hhbmRsZXIgKFNJTV9DUFUgKiwgVVNJLCBVU0ksIFVTSSwgVVNJLCBVU0ksIFVTSSwKIAkJCQkgIFVTSSwgVVNJKTsKK2V4dGVybiBjaGFyIGNyaXNfaGF2ZV85MDAwMDB4eGlmOworZW51bSBjcmlzX2ludGVycnVwdF90eXBlIHsgQ1JJU19JTlRfTk1JLCBDUklTX0lOVF9SRVNFVCwgQ1JJU19JTlRfSU5UIH07CitleHRlcm4gaW50IGNyaXN2MTBkZWxpdmVyX2ludGVycnVwdCAoU0lNX0NQVSAqLAorCQkJCSAgICAgZW51bSBjcmlzX2ludGVycnVwdF90eXBlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBjcmlzdjMyZGVsaXZlcl9pbnRlcnJ1cHQgKFNJTV9DUFUgKiwKKwkJCQkgICAgIGVudW0gY3Jpc19pbnRlcnJ1cHRfdHlwZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCk7CiAKIC8qIFVzaW5nIEdOVSBzeW50YXggKG5vdCBDOTkpIHNvIHdlIGNhbiBjb21waWxlIHRoaXMgb24gUkggNi4yCiAgICAoZWdjcy0xLjEuMi9nY2MtMi45MS42NikuICAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NyaXMvY3Jpcy10bXBsLmMgYi9zaW0vY3Jpcy9jcmlzLXRtcGwuYwppbmRleCA4OTk0YTExLi44MWQxY2EyIDEwMDY0NAotLS0gYS9zaW0vY3Jpcy9jcmlzLXRtcGwuYworKysgYi9zaW0vY3Jpcy9jcmlzLXRtcGwuYwpAQCAtMTc4LDYgKzE3OCwxOCBAQAogICBQUk9GSUxFX01PREVMX1RPVEFMX0NZQ0xFUyAocCkgKz0gY3ljbGVzOwogICBDUFVfQ1JJU19NSVNDX1BST0ZJTEUgKGN1cnJlbnRfY3B1KS0+YmFzaWNfY3ljbGVfY291bnQgKz0gY3ljbGVzOwogICBQUk9GSUxFX01PREVMX0NVUl9JTlNOX0NZQ0xFUyAocCkgPSBjeWNsZXM7CisKKyNpZiBXSVRIX0hXCisgIC8qIEZvciBzb21lIHJlYXNvbiwgd2UgZG9uJ3QgZ2V0IHRvIHRoZSBzaW1fZXZlbnRzX3RpY2sgY2FsbCBpbgorICAgICBjZ2VuLXJ1bi5jOmVuZ2luZV9ydW5fMS4gIEJlc2lkZXMsIG1vcmUgdGhhbiBvbmUgY3ljbGUgaGFzCisgICAgIHBhc3NlZCwgc28gd2Ugd2FudCBzaW1fZXZlbnRzX3RpY2tuIGFueXdheS4gIFRoZSAiZXZlbnRzIHdlIHdhbnQKKyAgICAgdG8gcHJvY2VzcyIgaXMgdXN1YWxseSB0byBpbml0aWF0ZSBhbiBpbnRlcnJ1cHQsIGJ1dCBtaWdodCBhbHNvCisgICAgIGJlIG90aGVyIGV2ZW50cy4gIFdlIGNhbid0IGRvIHRoZSBmb3JtZXIgdW50aWwgdGhlIG1haW4gbG9vcCBpcworICAgICBhdCBwb2ludCB3aGVyZSBpdCBhY2NlcHRzIGNoYW5naW5nIHRoZSBQQyB3aXRob3V0IGludGVybmFsCisgICAgIGluY29uc2lzdGVuY3ksIHNvIGp1c3Qgc2V0IGEgZmxhZyBhbmQgd2FpdC4gICovCisgIGlmIChzaW1fZXZlbnRzX3RpY2tuIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSwgY3ljbGVzKSkKKyAgICBTVEFURV9FVkVOVFMgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+d29ya19wZW5kaW5nID0gMTsKKyNlbmRpZgogfQogCiAvKiBJbml0aWFsaXplIGN5Y2xlIGNvdW50aW5nIGZvciBhbiBpbnNuLgpAQCAtMjQ1LDYgKzI1Nyw5IEBACiB7CiAgIGN1cnJlbnRfY3B1LT5tYWtlX3RocmVhZF9jcHVfZGF0YSA9IE1ZIChtYWtlX3RocmVhZF9jcHVfZGF0YSk7CiAgIGN1cnJlbnRfY3B1LT50aHJlYWRfY3B1X2RhdGFfc2l6ZSA9IHNpemVvZiAoY3VycmVudF9jcHUtPmNwdV9kYXRhKTsKKyNpZiBXSVRIX0hXCisgIGN1cnJlbnRfY3B1LT5kZWxpdmVyX2ludGVycnVwdCA9IE1ZIChkZWxpdmVyX2ludGVycnVwdCk7CisjZW5kaWYKIH0KIAwKIC8qIE1vZGVsIGZ1bmN0aW9uIGZvciBhcmJpdHJhcnkgc2luZ2xlIHN0YWxsIGN5Y2xlcy4gICovCmRpZmYgLS1naXQgYS9zaW0vY3Jpcy9jcmlzdjEwZi5jIGIvc2ltL2NyaXMvY3Jpc3YxMGYuYwppbmRleCAwYzJhMTdjLi45NzZiYWRiIDEwMDY0NAotLS0gYS9zaW0vY3Jpcy9jcmlzdjEwZi5jCisrKyBiL3NpbS9jcmlzL2NyaXN2MTBmLmMKQEAgLTEsNSArMSw1IEBACiAvKiBDUklTIHYxMCBzaW11bGF0b3Igc3VwcG9ydCBjb2RlCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICBDb250cmlidXRlZCBieSBBeGlzIENvbW11bmljYXRpb25zLgogCiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIHNpbXVsYXRvcnMuCkBAIC00MCwzICs0MCw2MiBAQAogfQogCiAjZW5kaWYgLyogV0lUSF9QUk9GSUxFX01PREVMX1AgKi8KKworLyogRG8gdGhlIGludGVycnVwdCBzZXF1ZW5jZSBpZiBwb3NzaWJsZSwgYW5kIHJldHVybiAxLiAgSWYgaW50ZXJydXB0cworICAgYXJlIGRpc2FibGVkIG9yIHNvbWUgb3RoZXIgbG9ja291dCBpcyBhY3RpdmUsIHJldHVybiAwIGFuZCBkbworICAgbm90aGluZy4KKworICAgQmV3YXJlLCB0aGUgdjEwIGltcGxlbWVudGF0aW9uIGlzIGluY29tcGxldGUgYW5kIGRvZXNuJ3QgcHJvcGVybHkKKyAgIGxvY2sgb3V0IGludGVycnVwdHMgZS5nLiBhZnRlciBzcGVjaWFsLXJlZ2lzdGVyIGFjY2VzcyBhbmQgZG9lc24ndAorICAgaGFuZGxlIHVzZXItbW9kZS4gICovCisKK2ludAorTVkgKGRlbGl2ZXJfaW50ZXJydXB0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsCisJCQllbnVtIGNyaXNfaW50ZXJydXB0X3R5cGUgdHlwZSwKKwkJCXVuc2lnbmVkIGludCB2ZWMpCit7CisgIHVuc2lnbmVkIGNoYXIgZW50cnlhZGRyX2xlWzRdOworICBpbnQgd2FzX3VzZXI7CisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7CisgIHVuc2lnbmVkMzIgZW50cnlhZGRyOworCisgIC8qIFdlIGhhdmVuJ3QgaW1wbGVtZW50ZWQgb3RoZXIgaW50ZXJydXB0LXR5cGVzIHlldC4gICovCisgIGlmICh0eXBlICE9IENSSVNfSU5UX0lOVCkKKyAgICBhYm9ydCAoKTsKKworICAvKiBXZSdyZSBzdXBwb3NlZCB0byBiZSBjYWxsZWQgb3V0c2lkZSBvZiBwcmVmaXhlcyBhbmQgYnJhbmNoCisgICAgIGRlbGF5LXNsb3RzIGV0YywgYnV0IHdoeSBub3QgY2hlY2suICAqLworICBpZiAoR0VUX0hfSU5TTl9QUkVGSVhFRF9QICgpKQorICAgIGFib3J0ICgpOworCisgIGlmICghR0VUX0hfSUJJVCAoKSkKKyAgICByZXR1cm4gMDsKKworICAvKiBVc2VyIG1vZGUgaXNuJ3Qgc3VwcG9ydGVkIGZvciBpbnRlcnJ1cHRzLiAgKEFuZCB3ZSBzaG91bGRuJ3Qgc2VlCisgICAgIHRoaXMgYXMgMSBhbnl3YXkuICBUaGUgdXNlci1tb2RlIGJpdCBpc24ndCB2aXNpYmxlIGZyb20gdXNlcgorICAgICBtb2RlLiAgSXQgZG9lc24ndCBtYWtlIGl0IGludG8gdGhlIFUgYml0IHVudGlsIHRoZSBuZXh0CisgICAgIGludGVycnVwdC9leGNlcHRpb24uKSAgKi8KKyAgaWYgKEdFVF9IX1VCSVQgKCkpCisgICAgYWJvcnQgKCk7CisKKyAgU0VUX0hfUEJJVCAoMSk7CisKKyAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwKKwkJCSAgICBjdXJyZW50X2NwdSwKKwkJCSAgICByZWFkX21hcCwgZW50cnlhZGRyX2xlLAorCQkJICAgIEdFVF9IX1NSIChIX1NSX1BSRV9WMzJfSUJSKSArIHZlYyAqIDQsIDQpID09IDApCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyBhY3R1YWxseTsgZWl0aGVyIGFib3J0IG9yIHNlbmQgYSBzaWduYWwuICAqLworICAgICAgc2ltX2NvcmVfc2lnbmFsIChzZCwgY3VycmVudF9jcHUsIENJQV9HRVQgKGN1cnJlbnRfY3B1KSwgMCwgNCwKKwkJICAgICAgIEdFVF9IX1NSIChIX1NSX1BSRV9WMzJfSUJSKSArIHZlYyAqIDQsCisJCSAgICAgICByZWFkX3RyYW5zZmVyLCBzaW1fY29yZV91bm1hcHBlZF9zaWduYWwpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGVudHJ5YWRkciA9IGJmZF9nZXRsMzIgKGVudHJ5YWRkcl9sZSk7CisKKyAgU0VUX0hfU1IgKEhfU1JfUFJFX1YzMl9JUlAsIEdFVF9IX1BDICgpKTsKKyAgU0VUX0hfUEMgKGVudHJ5YWRkcik7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zaW0vY3Jpcy9jcmlzdjMyZi5jIGIvc2ltL2NyaXMvY3Jpc3YzMmYuYwppbmRleCBkMWQ1ZmM5Li5hZDgyOTdlIDEwMDY0NAotLS0gYS9zaW0vY3Jpcy9jcmlzdjMyZi5jCisrKyBiL3NpbS9jcmlzL2NyaXN2MzJmLmMKQEAgLTEsNSArMSw1IEBACiAvKiBDUklTIHYzMiBzaW11bGF0b3Igc3VwcG9ydCBjb2RlCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICBDb250cmlidXRlZCBieSBBeGlzIENvbW11bmljYXRpb25zLgogCiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIHNpbXVsYXRvcnMuCkBAIC01NTYsMyArNTU2LDczIEBACiB9CiAKICNlbmRpZiAvKiBXSVRIX1BST0ZJTEVfTU9ERUxfUCAqLworCitpbnQKK01ZIChkZWxpdmVyX2ludGVycnVwdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LAorCQkJZW51bSBjcmlzX2ludGVycnVwdF90eXBlIHR5cGUsCisJCQl1bnNpZ25lZCBpbnQgdmVjKQoreworICB1bnNpZ25lZDMyIG9sZF9jY3MsIHNoaWZ0ZWRfY2NzLCBuZXdfY2NzOworICB1bnNpZ25lZCBjaGFyIGVudHJ5YWRkcl9sZVs0XTsKKyAgaW50IHdhc191c2VyOworICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3VycmVudF9jcHUpOworICB1bnNpZ25lZDMyIGVudHJ5YWRkcjsKKworICAvKiBXZSBoYXZlbid0IGltcGxlbWVudGVkIG90aGVyIGludGVycnVwdC10eXBlcyB5ZXQuICAqLworICBpZiAodHlwZSAhPSBDUklTX0lOVF9JTlQpCisgICAgYWJvcnQgKCk7CisKKyAgLyogV2UncmUgY2FsbGVkIG91dHNpZGUgb2YgYnJhbmNoIGRlbGF5IHNsb3RzIGV0Yywgc28gd2UgZG9uJ3QgY2hlY2sKKyAgICAgZm9yIHRoYXQuICAqLworICBpZiAoIUdFVF9IX0lCSVRfVjMyICgpKQorICAgIHJldHVybiAwOworCisgIG9sZF9jY3MgPSBHRVRfSF9TUl9WMzIgKEhfU1JfQ0NTKTsKKyAgc2hpZnRlZF9jY3MgPSAob2xkX2NjcyA8PCAxMCkgJiAoKDEgPDwgMzApIC0gMSk7CisKKyAgLyogVGhlIE0gYml0IGlzIGhhbmRsZWQgYnkgY29kZSBiZWxvdyBhbmQgdGhlIE0gYml0IHNldHRlciBmdW5jdGlvbiwgYnV0CisgICAgIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIFEgYml0LiAgKi8KKyAgbmV3X2NjcyA9IHNoaWZ0ZWRfY2NzIHwgKG9sZF9jY3MgJiAodW5zaWduZWQzMikgMHg4MDAwMDAwMFVMKTsKKyAgd2FzX3VzZXIgPSBHRVRfSF9VQklUX1YzMiAoKTsKKworICAvKiBXZSBuZWVkIHRvIGZvcmNlIGtlcm5lbCBtb2RlIHNpbmNlIHRoZSBzZXR0ZXIgbWV0aG9kIGRvZXNuJ3QgYWxsb3cKKyAgICAgaXQuICBUaGVuIHdlIGNhbiB1c2Ugc2V0dGVyIG1ldGhvZHMgYXQgd2lsbCwgc2luY2UgdGhleSB0aGVuCisgICAgIHJlY29nbml6ZSB0aGF0IHdlJ3JlIGluIGtlcm5lbCBtb2RlLiAgKi8KKyAgQ1BVIChoX3ViaXRfdjMyKSA9IDA7CisKKyAgU0VUX0hfU1IgKEhfU1JfQ0NTLCBuZXdfY2NzKTsKKworICBpZiAod2FzX3VzZXIpCisgICAgeworICAgICAgLyogVGhlc2UgbWV0aG9kcyByZXF1aXJlIHRoYXQgdXNlciBtb2RlIGlzIHVuc2V0LiAgKi8KKyAgICAgIFNFVF9IX1NSIChIX1NSX1VTUCwgR0VUX0hfR1IgKEhfR1JfU1ApKTsKKyAgICAgIFNFVF9IX0dSIChIX0dSX1NQLCBHRVRfSF9LRVJORUxfU1AgKCkpOworICAgIH0KKworICAvKiBFUlAgc2V0dGluZyBpcyBzaW1wbGlmaWVkIGJ5IG5vdCB0YWtpbmcgaW50ZXJydXB0cyBpbiBkZWxheS1zbG90cworICAgICBvciB3aGVuIGhhbHRpbmcuICAqLworICAvKiBGb3IgYWxsIG90aGVyIGV4Y2VwdGlvbnMgdGhhbiBndXJ1IGFuZCBOTUksIHN0b3JlIHRoZSByZXR1cm4KKyAgICAgYWRkcmVzcyBpbiBFUlAgYW5kIHNldCBFWFMgYW5kIEVYRCBoZXJlLiAgKi8KKyAgU0VUX0hfU1IgKEhfU1JfRVJQLCBHRVRfSF9QQyAoKSk7CisKKyAgLyogU2ltcGxpZmllZCBieSBub3QgaGF2aW5nIGV4Y2VwdGlvbiB0eXBlcyAoZmF1bHQgaW5kaWNhdGlvbnMpLiAgKi8KKyAgU0VUX0hfU1JfVjMyIChIX1NSX0VYUywgKHZlYyAqIDI1NikpOworICBTRVRfSF9TUl9WMzIgKEhfU1JfRURBLCAwKTsKKworICBpZiAoc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLAorCQkJICAgIGN1cnJlbnRfY3B1LAorCQkJICAgIHJlYWRfbWFwLCBlbnRyeWFkZHJfbGUsCisJCQkgICAgR0VUX0hfU1IgKEhfU1JfRUJQKSArIHZlYyAqIDQsIDQpID09IDApCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyBhY3R1YWxseTsgZWl0aGVyIGFib3J0IG9yIHNlbmQgYSBzaWduYWwuICAqLworICAgICAgc2ltX2NvcmVfc2lnbmFsIChzZCwgY3VycmVudF9jcHUsIENJQV9HRVQgKGN1cnJlbnRfY3B1KSwgMCwgNCwKKwkJICAgICAgIEdFVF9IX1NSIChIX1NSX0VCUCkgKyB2ZWMgKiA0LAorCQkgICAgICAgcmVhZF90cmFuc2Zlciwgc2ltX2NvcmVfdW5tYXBwZWRfc2lnbmFsKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBlbnRyeWFkZHIgPSBiZmRfZ2V0bDMyIChlbnRyeWFkZHJfbGUpOworICBTRVRfSF9QQyAoZW50cnlhZGRyKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NpbS9jcmlzL2RldmljZXMuYyBiL3NpbS9jcmlzL2RldmljZXMuYwppbmRleCBmZWI5MDFhLi5lNjk0ZmYzIDEwMDY0NAotLS0gYS9zaW0vY3Jpcy9kZXZpY2VzLmMKKysrIGIvc2ltL2NyaXMvZGV2aWNlcy5jCkBAIC0xLDUgKzEsNSBAQAogLyogQ1JJUyBkZXZpY2Ugc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICAgQ29udHJpYnV0ZWQgYnkgQXhpcyBDb21tdW5pY2F0aW9ucy4KIAogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBzaW11bGF0b3JzLgpAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgImR2LXNvY2tzZXIuaCIKICNlbmRpZgogCisjaW5jbHVkZSAiaHctZGV2aWNlLmgiCisKIC8qIFBsYWNlaG9sZGVyIGRlZmluaXRpb24uICAqLwogc3RydWN0IF9kZXZpY2UgeyBjaGFyIGR1bW15OyB9IGNyaXNfZGV2aWNlczsKIApAQCAtNDgsNyArNTAsMTEgQEAKIAkJICAgICAgIFNJTV9DUFUgKmNwdSBBVFRSSUJVVEVfVU5VU0VELAogCQkgICAgICAgc2ltX2NpYSBjaWEgQVRUUklCVVRFX1VOVVNFRCkKIHsKKyNpZiBXSVRIX0hXCisgIHJldHVybiBod19pb19yZWFkX2J1ZmZlciAoKHN0cnVjdCBodyAqKSBtZSwgc291cmNlLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMpOworI2Vsc2UKICAgYWJvcnQgKCk7CisjZW5kaWYKIH0KIAogaW50CkBAIC02MSwxMyArNjcsMjIgQEAKICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2tbXSA9IHsgNCwgMCwgMCwgMHg5MH07CiAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGJhZFtdID0geyA4LCAwLCAwLCAweDkwfTsKIAotICBpZiAoYWRkciA9PSAweDkwMDAwMDA0ICYmIG1lbWNtcCAoc291cmNlLCBvaywgc2l6ZW9mIG9rKSA9PSAwKQotICAgIGNyaXNfYnJlYWtfMTNfaGFuZGxlciAoY3B1LCAxLCAwLCAwLCAwLCAwLCAwLCAwLCBjaWEpOwotICBlbHNlIGlmIChhZGRyID09IDB4OTAwMDAwMDgKLQkgICAmJiBtZW1jbXAgKHNvdXJjZSwgYmFkLCBzaXplb2YgYmFkKSA9PSAwKQotICAgIGNyaXNfYnJlYWtfMTNfaGFuZGxlciAoY3B1LCAxLCAzNCwgMCwgMCwgMCwgMCwgMCwgY2lhKTsKKyAgaWYgKGNyaXNfaGF2ZV85MDAwMDB4eGlmKQorICAgIHsKKyAgICAgIGlmIChhZGRyID09IDB4OTAwMDAwMDQgJiYgbWVtY21wIChzb3VyY2UsIG9rLCBzaXplb2Ygb2spID09IDApCisJcmV0dXJuIGNyaXNfYnJlYWtfMTNfaGFuZGxlciAoY3B1LCAxLCAwLCAwLCAwLCAwLCAwLCAwLCBjaWEpOworICAgICAgZWxzZSBpZiAoYWRkciA9PSAweDkwMDAwMDA4CisJICAgICAgICYmIG1lbWNtcCAoc291cmNlLCBiYWQsIHNpemVvZiBiYWQpID09IDApCisJcmV0dXJuIGNyaXNfYnJlYWtfMTNfaGFuZGxlciAoY3B1LCAxLCAzNCwgMCwgMCwgMCwgMCwgMCwgY2lhKTsKKyAgICB9CisjaWYgV0lUSF9IVworICBlbHNlCisgICAgcmV0dXJuIGh3X2lvX3dyaXRlX2J1ZmZlciAoKHN0cnVjdCBodyAqKSBtZSwgc291cmNlLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMpOworI2VuZGlmCiAKICAgLyogSWYgaXQgd2Fzbid0IG9uZSBvZiB0aG9zZSwgc2VuZCBhbiBpbnZhbGlkLW1lbW9yeSBzaWduYWwuICAqLwogICBzaW1fY29yZV9zaWduYWwgKHNkLCBjcHUsIGNpYSwgMCwgbnJfYnl0ZXMsIGFkZHIsCiAJCSAgIHdyaXRlX3RyYW5zZmVyLCBzaW1fY29yZV91bm1hcHBlZF9zaWduYWwpOworCisgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc2ltL2NyaXMvZHYtY3Jpcy5jIGIvc2ltL2NyaXMvZHYtY3Jpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OGE2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY3Jpcy9kdi1jcmlzLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qIFRoZSBDUklTIGludGVycnVwdCBmcmFtZXdvcmsgZm9yIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KKworICAgQ29weXJpZ2h0IDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgImh3LW1haW4uaCIKKworLyogREVWSUNFCisKKyAgIENSSVMgY3B1IHZpcnR1YWwgZGV2aWNlICh2ZXJ5IHJ1ZGltZW50YWw7IGdlbmVyaWMgZW5vdWdoIGZvciBhbGwKKyAgIGN1cnJlbnRseSB1c2VkIENSSVMgdmVyc2lvbnMpLgorCisKKyAgIERFU0NSSVBUSU9OCisKKyAgIEltcGxlbWVudHMgdGhlIGV4dGVybmFsIENSSVMgZnVuY3Rpb25hbGl0eS4gIFRoaXMgaW5jbHVkZXMgdGhlCisgICBkZWxpdmVyeSBvZiBpbnRlcnJ1cHRzIGdlbmVyYXRlZCBmcm9tIG90aGVyIGRldmljZXMuCisKKworICAgUFJPUEVSVElFUworCisgICB2ZWMtZm9yLWludCA9IDxpbnQtYT4gPHZlYy1hPiA8aW50LWI+IDx2ZWMtYj4gLi4uCisgICBUaGVzZSBhcmUgdGhlIHRyYW5zbGF0aW9ucyB0byBpbnRlcnJ1cHQgdmVjdG9yIGZvciB2YWx1ZXMgYXBwZWFyaW5nCisgICBvbiB0aGUgImludCIgcG9ydCwgYXMgcGFpcnMgb2YgdGhlIHZhbHVlIGFuZCB0aGUgY29ycmVzcG9uZGluZworICAgdmVjdG9yLiAgRGVmYXVsdHMgdG8gbm8gdHJhbnNsYXRpb24uICBBbGwgdmFsdWVzIHRoYXQgbWF5IGFwcGVhciBvbgorICAgdGhlICJpbnQiIHBvcnQgbXVzdCBiZSBkZWZpbmVkLCBvciB0aGUgZGV2aWNlIGFib3J0cy4KKworICAgbXVsdGlwbGUtaW50ID0gKCJhYm9ydCIgfCAiaWdub3JlX3ByZXZpb3VzIiB8IDx2ZWN0b3I+KQorICAgSWYgbXVsdGlwbGUgaW50ZXJydXB0IHZhbHVlcyBhcmUgZGlzcGF0Y2hlZCwgdGhpcyBwcm9wZXJ0eSBkZWNpZGVzCisgICB3aGF0IHRvIGRvLiAgVGhlIHZhbHVlIGlzIGVpdGhlciBhIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgdmVjdG9yIHRvIHVzZSwgb3IgdGhlIHN0cmluZyAiYWJvcnQiIHRvIGNhdXNlIGEgaGFyZCBhYm9ydCwgb3IgdGhlCisgICBzdHJpbmcgImlnbm9yZV9wcmV2aW91cyIsIHRvIHNpbGVudGx5IHVzZSB0aGUgbmV3IHZlY3RvciBpbnN0ZWFkLgorICAgVGhlIGRlZmF1bHQgaXMgImFib3J0Ii4KKworCisgICBQT1JUUworCisgICBpbnQgKGlucHV0KQorICAgSW50ZXJydXB0IHBvcnQuICBBbiBldmVudCB3aXRoIGEgbm9uLXplcm8gdmFsdWUgb24gdGhpcyBwb3J0IGNhdXNlcworICAgYW4gaW50ZXJydXB0LiAgSWYsIGFmdGVyIGFuIGV2ZW50IGJ1dCBiZWZvcmUgdGhlIGludGVycnVwdCBoYXMgYmVlbgorICAgcHJvcGVybHkgZGlzcGF0Y2hlZCwgYSBub24temVybyB2YWx1ZSBhcHBlYXJzIHRoYXQgaXMgZGlmZmVyZW50CisgICBhZnRlciBtYXBwaW5nIHRoYW4gdGhlIHByZXZpb3VzLCB0aGVuIHRoZSBwcm9wZXJ0eSBtdWx0aXBsZV9pbnQKKyAgIGRlY2lkZXMgd2hhdCB0byBkby4KKworICAgRklYTUU6IHJlZyBwb3J0IHNvIGludGVybmFsIHJlZ2lzdGVycyBjYW4gYmUgcmVhZC4gIFJlcXVpcmVzCisgICBjaGlwLXNwZWNpZmljIHZlcnNpb25zLCB0aG91Z2guICBQb3J0cyAibm1pIiBhbmQgInJlc2V0Ii4KKworCisgICBCVUdTCisgICBXaGVuIGRlbGl2ZXJpbmcgYW4gaW50ZXJydXB0LCB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIG9ubHkKKyAgIG9uZSBwcm9jZXNzb3IgKG51bWJlciAwKS4KKworICAgVGhpcyBjb2RlIGRvZXMgbm90IGF0dGVtcHQgdG8gYmUgZWZmaWNpZW50IGF0IGhhbmRsaW5nIHBlbmRpbmcKKyAgIGludGVycnVwdHMuICBJdCBzaW1wbHkgc2NoZWR1bGVzIHRoZSBpbnRlcnJ1cHQgZGVsaXZlcnkgaGFuZGxlcgorICAgZXZlcnkgaW5zdHJ1Y3Rpb24gY3ljbGUgdW50aWwgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyBnbyBhd2F5LgorICAgSXQgYWxzbyB3b3JrcyBhcm91bmQgYSBidWcgaW4gc2ltX2V2ZW50c19wcm9jZXNzIHdoZW4gZG9pbmcgc28uCisgICAqLworCisvKiBLZWVwIHRoaXMgYW4gZW51bSBmb3Igc2ltcGxlIGFkZGl0aW9uIG9mICJyZXNldCIgYW5kICJubWkiLiAgKi8KK2VudW0KKyB7CisgICBJTlRfUE9SVCwKKyB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciBjcmlzX3BvcnRzW10gPQorIHsKKyAgIHsgImludCIsIElOVF9QT1JULCAwLCBpbnB1dF9wb3J0IH0sCisgICB7IE5VTEwsIDAsIDAsIDAgfQorIH07CisKK3N0cnVjdCBjcmlzX3ZlY190cgorIHsKKyAgIHVuc2lnbmVkMzIgcG9ydHZhbCwgdmVjOworIH07CisKK2VudW0gY3Jpc19tdWx0aXBsZV9pbnRzCisgIHsKKyAgICBjcmlzX211bHRpbnRfYWJvcnQsCisgICAgY3Jpc19tdWx0aW50X2lnbm9yZV9wcmV2aW91cywKKyAgICBjcmlzX211bHRpbnRfdmVjdG9yCisgIH07CisKK3N0cnVjdCBjcmlzX2h3CisgeworICAgc3RydWN0IGh3X2V2ZW50ICpwZW5kaW5nX2hhbmRsZXI7CisgICB1bnNpZ25lZDMyIHBlbmRpbmdfdmVjdG9yOworICAgc3RydWN0IGNyaXNfdmVjX3RyICppbnRfdG9fdmVjOworICAgZW51bSBjcmlzX211bHRpcGxlX2ludHMgbXVsdGlfaW50X2FjdGlvbjsKKyAgIHVuc2lnbmVkMzIgbXVsdGlwbGVfaW50X3ZlY3RvcjsKKyB9OworCisvKiBBbiBldmVudCBmdW5jdGlvbiwgY2FsbGluZyB0aGUgYWN0dWFsIENQVS1tb2RlbC1zcGVjaWZpYworICAgaW50ZXJydXB0LWRlbGl2ZXJ5IGZ1bmN0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2RlbGl2ZXJfY3Jpc19pbnRlcnJ1cHQgKHN0cnVjdCBodyAqbWUsIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBjcmlzX2h3ICpjcmlzaHcgPSBod19kYXRhIChtZSk7CisgIFNJTV9ERVNDIHNpbXVsYXRvciA9IGh3X3N5c3RlbSAobWUpOworICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNpbXVsYXRvciwgMCk7CisgIHVuc2lnbmVkIGludCBpbnRubyA9IGNyaXNody0+cGVuZGluZ192ZWN0b3I7CisKKyBpZiAoQ1BVX0NSSVNfREVMSVZFUl9JTlRFUlJVUFQgKGNwdSkgKGNwdSwgQ1JJU19JTlRfSU5ULCBpbnRubykpCisgICAgeworICAgICAgY3Jpc2h3LT5wZW5kaW5nX3ZlY3RvciA9IDA7CisgICAgICBjcmlzaHctPnBlbmRpbmdfaGFuZGxlciA9IE5VTEw7CisgICAgICByZXR1cm47CisgICAgfQorCisgeworICAgLyogQnVnIHdvcmthcm91bmQ6IGF0IHRpbWUgVCB3aXRoIGEgcGVuZGluZyBudW1iZXIgb2YgY3ljbGVzIE4gdG8KKyAgICAgIHByb2Nlc3MsIGlmIHJlLXNjaGVkdWxpbmcgYW4gZXZlbnQgYXQgdGltZSBUK00sIE0gPCBOLAorICAgICAgc2ltX2V2ZW50c19wcm9jZXNzIGdldHMgc3R1Y2sgYXQgVCAodXBkYXRpbmcgdGhlICJ0aW1lIiB0bworICAgICAgYmVmb3JlIHRoZSBldmVudCByYXRoZXIgdGhhbiBhZnRlciB0aGUgZXZlbnQsIG9yIHNvbWVzdWNoKS4KKworICAgICAgSGFja2luZyB0aGlzIGxvY2FsbHkgaXMgdGhhbmtmdWxseSBlYXN5OiBpZiB3ZSBzZWUgdGhlIHNhbWUKKyAgICAgIHNpbXVsYXRpb24gdGltZSwgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBjeWNsZXMuICBEbyB0aGlzIGV2ZXJ5CisgICAgICB0aW1lIHdlIGdldCBoZXJlLCB1bnRpbCBhIG5ldyB0aW1lIGlzIHNlZW4gKHN1cHBvc2VkbHkgdW5zdHVjaworICAgICAgcmUtZGVsaXZlcnkpLiAgKEZpeGluZyBpbiBTSU0vR0RCIHNvdXJjZSB3aWxsIGhvcGVmdWxseSB0aGVuCisgICAgICBhbHNvIGJlIGVhc2llciwgaGF2aW5nIGEgdGFuZ2libGUgdGVzdC1jYXNlLikgICovCisgICBzdGF0aWMgc2lnbmVkNjQgbGFzdF9ldmVudHNfdGltZSA9IDA7CisgICBzdGF0aWMgc2lnbmVkNjQgZGVsdGEgPSAxOworICAgc2lnbmVkNjQgdGhpc19ldmVudHNfdGltZSA9IGh3X2V2ZW50X3F1ZXVlX3RpbWUgKG1lKTsKKworICAgaWYgKHRoaXNfZXZlbnRzX3RpbWUgPT0gbGFzdF9ldmVudHNfdGltZSkKKyAgICAgZGVsdGErKzsKKyAgIGVsc2UKKyAgICAgeworICAgICAgIGRlbHRhID0gMTsKKyAgICAgICBsYXN0X2V2ZW50c190aW1lID0gdGhpc19ldmVudHNfdGltZTsKKyAgICAgfQorCisgICBjcmlzaHctPnBlbmRpbmdfaGFuZGxlcgorICAgICA9IGh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlIChtZSwgZGVsdGEsIGRlbGl2ZXJfY3Jpc19pbnRlcnJ1cHQsIE5VTEwpOworIH0KK30KKworCisvKiBBIHBvcnQtZXZlbnQgZnVuY3Rpb24gZm9yIGV2ZW50cyBhcnJpdmluZyB0byBhbiBpbnRlcnJ1cHQgcG9ydC4gICovCisKK3N0YXRpYyB2b2lkCitjcmlzX3BvcnRfZXZlbnQgKHN0cnVjdCBodyAqbWUsCisJCSBpbnQgbXlfcG9ydCwKKwkJIHN0cnVjdCBodyAqc291cmNlLAorCQkgaW50IHNvdXJjZV9wb3J0LAorCQkgaW50IGludHBhcmFtKQoreworICBzdHJ1Y3QgY3Jpc19odyAqY3Jpc2h3ID0gaHdfZGF0YSAobWUpOworICB1bnNpZ25lZDMyIHZlYzsKKworICAvKiBBIGZldyBwbGFjZWhvbGRlcnM7IG9ubHkgdGhlIElOVCBwb3J0IGlzIGltcGxlbWVudGVkLiAgKi8KKyAgc3dpdGNoIChteV9wb3J0KQorICAgIHsKKyAgICBjYXNlIElOVF9QT1JUOgorICAgICAgSFdfVFJBQ0UgKChtZSwgIklOVCB2YWx1ZT0weCV4IiwgaW50cGFyYW0pKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGh3X2Fib3J0IChtZSwgImJhZCBzd2l0Y2giKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoaW50cGFyYW0gPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKGNyaXNody0+aW50X3RvX3ZlYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgZm9yIChpID0gMDsgY3Jpc2h3LT5pbnRfdG9fdmVjW2ldLnBvcnR2YWwgIT0gMDsgaSsrKQorCWlmIChjcmlzaHctPmludF90b192ZWNbaV0ucG9ydHZhbCA9PSBpbnRwYXJhbSkKKwkgIGJyZWFrOworCisgICAgICBpZiAoY3Jpc2h3LT5pbnRfdG9fdmVjW2ldLnBvcnR2YWwgPT0gMCkKKwlod19hYm9ydCAobWUsICJ1bnN1cHBvcnRlZCB2YWx1ZSBmb3IgaW50IHBvcnQ6IDB4JXgiLCBpbnRwYXJhbSk7CisKKyAgICAgIHZlYyA9IGNyaXNody0+aW50X3RvX3ZlY1tpXS52ZWM7CisgICAgfQorICBlbHNlCisgICAgdmVjID0gKHVuc2lnbmVkMzIpIGludHBhcmFtOworCisgIGlmIChjcmlzaHctPnBlbmRpbmdfdmVjdG9yICE9IDApCisgICAgeworICAgICAgaWYgKHZlYyA9PSBjcmlzaHctPnBlbmRpbmdfdmVjdG9yKQorCXJldHVybjsKKworICAgICAgc3dpdGNoIChjcmlzaHctPm11bHRpX2ludF9hY3Rpb24pCisJeworCWNhc2UgY3Jpc19tdWx0aW50X2Fib3J0OgorCSAgaHdfYWJvcnQgKG1lLCAiaW50IDB4JXggKDB4JXgpIHdoaWxlIGludCAweCV4IGhhc24ndCBiZWVuIGRlbGl2ZXJlZCIsCisJCSAgICB2ZWMsIGludHBhcmFtLCBjcmlzaHctPnBlbmRpbmdfdmVjdG9yKTsKKwkgIGJyZWFrOworCisJY2FzZSBjcmlzX211bHRpbnRfaWdub3JlX3ByZXZpb3VzOgorCSAgYnJlYWs7CisKKwljYXNlIGNyaXNfbXVsdGludF92ZWN0b3I6CisJICB2ZWMgPSBjcmlzaHctPm11bHRpcGxlX2ludF92ZWN0b3I7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBod19hYm9ydCAobWUsICJiYWQgc3dpdGNoIik7CisJfQorICAgIH0KKworICBjcmlzaHctPnBlbmRpbmdfdmVjdG9yID0gdmVjOworCisgIC8qIFNjaGVkdWxlIG91ciBldmVudCBoYW5kbGVyICpub3cqLiAgKi8KKyAgaWYgKGNyaXNody0+cGVuZGluZ19oYW5kbGVyID09IE5VTEwpCisgICAgY3Jpc2h3LT5wZW5kaW5nX2hhbmRsZXIKKyAgICAgID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCAwLCBkZWxpdmVyX2NyaXNfaW50ZXJydXB0LCBOVUxMKTsKK30KKworLyogSW5zdGFuY2UgaW5pdGlhbGl6ZXIgZnVuY3Rpb24uICAqLworCitzdGF0aWMgdm9pZAorY3Jpc19maW5pc2ggKHN0cnVjdCBodyAqbWUpCit7CisgIHN0cnVjdCBjcmlzX2h3ICpjcmlzaHc7CisgIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqdmVjX2Zvcl9pbnQ7CisgIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqbXVsdGlwbGVfaW50OworCisgIGNyaXNodyA9IEhXX1pBTExPQyAobWUsIHN0cnVjdCBjcmlzX2h3KTsKKyAgc2V0X2h3X2RhdGEgKG1lLCBjcmlzaHcpOworICBzZXRfaHdfcG9ydHMgKG1lLCBjcmlzX3BvcnRzKTsKKyAgc2V0X2h3X3BvcnRfZXZlbnQgKG1lLCBjcmlzX3BvcnRfZXZlbnQpOworCisgIHZlY19mb3JfaW50ID0gaHdfZmluZF9wcm9wZXJ0eSAobWUsICJ2ZWMtZm9yLWludCIpOworICBpZiAodmVjX2Zvcl9pbnQgIT0gTlVMTCkKKyAgICB7CisgICAgICB1bnNpZ25lZDMyIHZlY3NpemU7CisgICAgICB1bnNpZ25lZDMyIGk7CisKKyAgICAgIGlmIChod19wcm9wZXJ0eV90eXBlICh2ZWNfZm9yX2ludCkgIT0gYXJyYXlfcHJvcGVydHkpCisJaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCJ2ZWMtZm9yLWludFwiIGhhcyB0aGUgd3JvbmcgdHlwZSIpOworCisgICAgICB2ZWNzaXplID0gaHdfcHJvcGVydHlfc2l6ZW9mX2FycmF5ICh2ZWNfZm9yX2ludCkgLyBzaXplb2YgKHNpZ25lZF9jZWxsKTsKKworICAgICAgaWYgKCh2ZWNzaXplICUgMikgIT0gMCkKKwlod19hYm9ydCAobWUsICJ0cmFuc2xhdGlvbiB2ZWN0b3IgZG9lcyBub3QgY29uc2lzdCBvZiBldmVuIHBhaXJzIik7CisKKyAgICAgIGNyaXNody0+aW50X3RvX3ZlYworCT0gaHdfbWFsbG9jIChtZSwgKHZlY3NpemUvMiArIDEpICogc2l6ZW9mIChjcmlzaHctPmludF90b192ZWNbMF0pKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHZlY3NpemUvMjsgaSsrKQorCXsKKwkgIHNpZ25lZF9jZWxsIHBvcnR2YWxfc2M7CisJICBzaWduZWRfY2VsbCB2ZWNfc2M7CisKKwkgIGlmICghaHdfZmluZF9pbnRlZ2VyX2FycmF5X3Byb3BlcnR5IChtZSwgInZlYy1mb3ItaW50IiwgaSoyLAorCQkJCQkgICAgICAgJnBvcnR2YWxfc2MpCisJICAgICAgfHwgIWh3X2ZpbmRfaW50ZWdlcl9hcnJheV9wcm9wZXJ0eSAobWUsICJ2ZWMtZm9yLWludCIsIGkqMiArIDEsCisJCQkJCQkgICZ2ZWNfc2MpCisJICAgICAgfHwgcG9ydHZhbF9zYyA8IDAKKwkgICAgICB8fCB2ZWNfc2MgPCAwKQorCSAgICBod19hYm9ydCAobWUsICJubyB2YWxpZCB2ZWN0b3IgdHJhbnNsYXRpb24gcGFpciAldSIsIGkpOworCisJICBjcmlzaHctPmludF90b192ZWNbaV0ucG9ydHZhbCA9ICh1bnNpZ25lZDMyKSBwb3J0dmFsX3NjOworCSAgY3Jpc2h3LT5pbnRfdG9fdmVjW2ldLnZlYyA9ICh1bnNpZ25lZDMyKSB2ZWNfc2M7CisJfQorCisgICAgICBjcmlzaHctPmludF90b192ZWNbaV0ucG9ydHZhbCA9IDA7CisgICAgICBjcmlzaHctPmludF90b192ZWNbaV0udmVjID0gMDsKKyAgICB9CisKKyAgbXVsdGlwbGVfaW50ID0gaHdfZmluZF9wcm9wZXJ0eSAobWUsICJtdWx0aXBsZS1pbnQiKTsKKyAgaWYgKG11bHRpcGxlX2ludCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChod19wcm9wZXJ0eV90eXBlIChtdWx0aXBsZV9pbnQpID09IGludGVnZXJfcHJvcGVydHkpCisJeworCSAgY3Jpc2h3LT5tdWx0aXBsZV9pbnRfdmVjdG9yCisJICAgID0gaHdfZmluZF9pbnRlZ2VyX3Byb3BlcnR5IChtZSwgIm11bHRpcGxlLWludCIpOworCSAgY3Jpc2h3LT5tdWx0aV9pbnRfYWN0aW9uID0gY3Jpc19tdWx0aW50X3ZlY3RvcjsKKwl9CisgICAgICBlbHNlCisJeworCSAgY29uc3QgY2hhciAqYWN0aW9uID0gaHdfZmluZF9zdHJpbmdfcHJvcGVydHkgKG1lLCAibXVsdGlwbGUtaW50Iik7CisKKwkgIGlmIChhY3Rpb24gPT0gTlVMTCkKKwkgICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCJtdWx0aXBsZS1pbnRcIiBoYXMgdGhlIHdyb25nIHR5cGUiKTsKKworCSAgaWYgKHN0cmNtcCAoYWN0aW9uLCAiYWJvcnQiKSA9PSAwKQorCSAgICBjcmlzaHctPm11bHRpX2ludF9hY3Rpb24gPSBjcmlzX211bHRpbnRfYWJvcnQ7CisJICBlbHNlIGlmIChzdHJjbXAgKGFjdGlvbiwgImlnbm9yZV9wcmV2aW91cyIpID09IDApCisJICAgIGNyaXNody0+bXVsdGlfaW50X2FjdGlvbiA9IGNyaXNfbXVsdGludF9pZ25vcmVfcHJldmlvdXM7CisJICBlbHNlCisJICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwibXVsdGlwbGUtaW50XCIgbXVzdCBiZSBvbmUgb2YgPHZlY3RvciBudW1iZXI+XG4iCisJCSAgICAgICJcImFib3J0XCIgYW5kIFwiaWdub3JlX3ByZXZpb3VzXCIsIG5vdCBcIiVzXCIiLCBhY3Rpb24pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICBjcmlzaHctPm11bHRpX2ludF9hY3Rpb24gPSBjcmlzX211bHRpbnRfYWJvcnQ7Cit9CisKK2NvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yIGR2X2NyaXNfZGVzY3JpcHRvcltdID0geworICB7ICJjcmlzIiwgY3Jpc19maW5pc2gsIH0sCisgIHsgTlVMTCB9LAorfTsKZGlmZiAtLWdpdCBhL3NpbS9jcmlzL2R2LXJ2LmMgYi9zaW0vY3Jpcy9kdi1ydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODQ1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY3Jpcy9kdi1ydi5jCkBAIC0wLDAgKzEsMTIyMSBAQAorLyogVGhlIHJlbW90ZS12aXJ0dWFsLWNvbXBvbmVudCBzaW11bGF0b3IgZnJhbWV3b3JrCisgICBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgorCisgICBDb3B5cmlnaHQgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJody1tYWluLmgiCisKKyNpbmNsdWRlICJody10cmVlLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYKKworLyogTm90IGd1YXJkZWQgaW4gZHYtc29ja3Nlci5jLCBzbyB3aHkgaGVyZS4gICovCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisKKy8qIERFVklDRQorCisKKyAgIHJ2IC0gUmVtb3RlIFZpcnR1YWwgY29tcG9uZW50CisKKworICAgREVTQ1JJUFRJT04KKworCisgICBTb2NrZXQgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBzaW11bGF0b3IgY29tcG9uZW50LCBmb3IgZXhhbXBsZSBvbmUKKyAgIGZvciB0ZXN0aW5nIGEgdmVyaWxvZyBjb25zdHJ1Y3Rpb24uICBQcm90b2NvbCBkZWZpbmVkIGJlbG93LgorCisgICBUaGVyZSBpcyBhIHNldCBvZiAzMi1iaXQgSS9PIHBvcnRzLCB3aXRoIGEgbWFwcGluZyBmcm9tIGxvY2FsIHRvCisgICByZW1vdGUgYWRkcmVzc2VzLiAgVGhlcmUgaXMgYSBzZXQgb2YgaW50ZXJydXB0cyBleHByZXNzZWQgYXMgYQorICAgYml0LW1hc2ssIHdpdGggYSBtYXBwaW5nIGZyb20gcmVtb3RlIHRvIGxvY2FsLiAgVGhlcmUgaXMgYSBzZXQgb2YKKyAgIG1lbW9yeSByYW5nZXMgKGFjdHVhbCBtZW1vcnkgZGVmaW5lZCBlbHNld2hlcmUpLCBhbHNvIHdpdGggYQorICAgbWFwcGluZyBmcm9tIHJlbW90ZSB0byBsb2NhbCBhZGRyZXNzZXMsIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUKKyAgIGFjY2Vzc2libGUgdG8gdGhlIHJlbW90ZSBzaW11bGF0b3IgaW4gMzItYnl0ZSBjaHVua3MgKHNpbXVsYXRpbmcKKyAgIERNQSkuICBUaGVyZSBpcyBhIG1hcHBpbmcgZnJvbSByZW1vdGUgY3ljbGVzIChvciBhbiBhcHByb3ByaWF0ZQorICAgZWxzZXdoZXJlIGRlZmluZWQgdGltZS1zbGljZSkgdG8gbG9jYWwgY3ljbGVzLgorCisgICBQUk9QRVJUSUVTCisKKyAgIHJlZyA9IDxhZGRyZXNzPiA8c2l6ZT4KKyAgIFRoZSBhZGRyZXNzICh3aXRoaW4gdGhlIHBhcmVudCBidXMpIHRoYXQgdGhpcyBkZXZpY2UgaXMgdG8KKyAgIGJlIGxvY2F0ZWQuCisKKyAgIHJlbW90ZS1yZWcgPSA8cmVtb3RlLWFkZHJlc3M+CisgICBUaGUgYWRkcmVzcyBvZiByZWcgb24gdGhlIHJlbW90ZSBzaWRlLiAgRGVmYXVsdHMgdG8gMC4KKworICAgbWVtID0gPGFkZHJlc3M+IDxzaXplPgorICAgU3BlY2lmeSBhbiBhZGRyZXNzLXJhbmdlICh3aXRoaW4gdGhlIHBhcmVudCBidXMpIHRoYXQgdGhlIHJlbW90ZQorICAgZGV2aWNlIGNhbiBhY2Nlc3MuICBUaGUgbWVtb3J5IGlzIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSBkZWZpbmVkLgorICAgSWYgdGhlcmUncyBubyBtZW1vcnkgZGVmaW5lZCBidXQgdGhlIHJlbW90ZSBzaWRlIGFza3MgZm9yIGEgbWVtb3J5CisgICBhY2Nlc3MsIHRoZSBzaW11bGF0aW9uIGlzIGFib3J0ZWQuCisKKyAgIHJlbW90ZS1tZW0gPSA8cmVtb3RlLWFkZHJlc3M+CisgICBUaGUgYWRkcmVzcyBvZiBtZW0gb24gdGhlIHJlbW90ZSBzaWRlLiAgRGVmYXVsdHMgdG8gMC4KKworICAgbWJveCA9IDxhZGRyZXNzPgorICAgQWRkcmVzcyBvZiB0aGUgbWFpbGJveCBpbnRlcmZhY2UuICBXcml0ZXMgdG8gdGhpcyBhZGRyZXNzIHdpdGggdGhlCisgICBsb2NhbCBhZGRyZXNzIG9mIGEgbWFpbGJveCBjb21tYW5kLCBhIGNvbXBsZXRlIHBhY2tldCB3aXRoIGxlbmd0aAorICAgYW5kIGNvbW1hbmQ7ICg0IG9yIDYpKSBpbnZva2VzIHRoZSBtYWlsYm94IGludGVyZmFjZS4gIFJlYWRzIGFyZQorICAgaW52YWxpZC4gIFJlcGxpZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgYWRkcmVzcy4gIEFkZHJlc3Mgc3BhY2UKKyAgIGZyb20gPGFkZHJlc3M+IHVwLXRvLWFuZC1pbmNsdWRpbmcgPGFkZHJlc3M+KzMgaXMgYWxsb2NhdGVkLgorCisgICBtYXgtcG9sbC10aWNrcyA9IDxsb2NhbC1jb3VudD4KKyAgIFNldHMgdGhlIG1heGltdW0gaW50ZXJ2YWwgYmV0d2VlbiBwb2xsaW5nIHRoZSBleHRlcm5hbCBjb21wb25lbnQsCisgICBleHByZXNzZWQgaW4gaW50ZXJuYWwgY3ljbGVzLiAgRGVmYXVsdHMgdG8gMTAwMDAuCisKKyAgIHdhdGNoZG9nLWludGVydmFsID0gPHNlY29uZHM+CisgICBTZXRzIHRoZSB3YWxsY2xvY2sgc2Vjb25kcyBiZXR3ZWVuIHdhdGNoZG9nIHBhY2tldHMgc2VudCB0byB0aGUKKyAgIHJlbW90ZSBzaWRlIChtYXkgYmUgbGFyZ2VyIGlmIHRoZXJlJ3Mgbm8gcnYgYWN0aXZpdHkgaW4gdGhhdCB0aW1lKS4KKyAgIERlZmF1bHRzIHRvIDMwLiAgSWYgc2V0IHRvIDAsIG5vIHdhdGNoZG9nIHBhY2tldHMgYXJlIHNlbnQuCisKKyAgIGludG51bSA9IDxsb2NhbC1pbnQtMD4gPGxvY2FsLWludC0xPiAuLi4gPGxvY2FsLWludC0zMT4KKyAgIERlZmluZXMgYSBtYXAgZnJvbSByZW1vdGUgYml0IG51bWJlcnMgdG8gbG9jYWwgdmFsdWVzIHRvIGJlIGVtaXR0ZWQKKyAgIG9uIHRoZSAiaW50IiBwb3J0LCB3aXRoIHRoZSBleHRlcm5hbCBiaXQgbnVtYmVyIGFzIHRoZSBvcmRpbmFsIC0gMQorICAgb2YgdGhlIGxvY2FsIHRyYW5zbGF0aW9uLiAgRS5nLiA0MyAxMjEgd291bGQgbWVhbiBtYXAgZXh0ZXJuYWwKKyAgICgxPDwwKSB0byBpbnRlcm5hbCA0MyBhbmQgZXh0ZXJuYWwgKDE8PDEpIHRvIGludGVybmFsIDEyMS4gIFRoZQorICAgZGVmYXVsdCBpcyB1bml0eTsgbm8gdHJhbnNsYXRpb24uICBJZiBtb3JlIHRoYW4gb25lIGJpdCBpcyBzZXQgaW4KKyAgIHRoZSByZW1vdGUgaW50ZXJydXB0IHdvcmQsIHRoZSBpbnRtdWx0aXBsZSBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0bworICAgY29udHJvbCB0aGUgdHJhbnNsYXRpb24uCisKKyAgIGludG11bHRpcGxlID0gPGludHZhbHVlPgorICAgV2hlbiBtb3JlIHRoYW4gb25lIGJpdCBpcyBzZXQgaW4gdGhlIHJlbW90ZSBpbnRlcnJ1cHQgd29yZCwgeW91IG1heQorICAgd2FudCB0byBtYXAgdGhpcyBzaXR1YXRpb24gdG8gYSBzZXBhcmF0ZSBpbnRlcnJ1cHQgdmFsdWUuICBJZiB0aGlzCisgICBwcm9wZXJ0eSBpcyBub24temVybywgaXQgaXMgdXNlZCBhcyB0aGF0IHZhbHVlLiAgSWYgaXQgaXMgemVybywgdGhlCisgICBsb2NhbCB2YWx1ZSBmb3IgdGhlICJpbnQiIHBvcnQgaXMgdGhlIGJpdHdpc2Utb3Igb2YgdGhlIHRyYW5zbGF0ZWQKKyAgIGxvY2FsIHZhbHVlcy4KKworICAgaG9zdCA9IDxob3N0aWQ+CisgICBUaGUgaG9zdG5hbWUgb3IgYWRkcmVzcyB3aGVyZSB0aGUgc2ltdWxhdG9yIHRvIGJlIHVzZWQgbGlzdGVucy4KKyAgIERlZmF1bHRzIHRvICIxMjcuMC4wLjEiCisKKyAgIHBvcnQgPSA8cG9ydG51bWJlcj4KKyAgIFRoZSBob3N0bmFtZSBvciBhZGRyZXNzIHdoZXJlIHRoZSBzaW11bGF0b3IgdG8gYmUgdXNlZCBsaXN0ZW5zLgorICAgRGVmYXVsdHMgdG8gMTAwMDAuCisKKyAgIGR1bW15ID0gPHZhbHVlPgorICAgIG9yCisgICBkdW1teSA9IDxmaWxlbmFtZT4KKyAgIERvbid0IGNvbm5lY3QgdG8gYSByZW1vdGUgc2lkZTsgdXNlIGluaXRpYWwgZHVtbXkgY29udGVudHMgZnJvbQorICAgPGZpbGVuYW1lPiAod2hpY2ggaGFzIHRvIGJlIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUgPHNpemU+IGFyZ3VtZW50CisgICBvZiByZWcgYWJvdmUpIG9yIGZpbGxlZCB3aXRoIGJ5dGUtdmFsdWUgPHZhbHVlPi4gIE1haWxib3hlcyBhcmUgbm90CisgICBzdXBwb3J0ZWQgKGNhbiBiZSBkZWZpbmVkIGJ1dCBjYW4gbm90IGJlIHVzZWQpIGFuZCByZW1vdGUtbWVtb3J5CisgICBhY2Nlc3NlcyBkb24ndCBhcHBseS4gIFRoZSBtYWluIHB1cnBvc2UgZm9yIHRoaXMgcHJvcGVydHkgaXMgdG8KKyAgIHNpbXBsaWZ5IHVzZSBvZiBjb25maWd1cmF0aW9uIGFuZCBzaW11bGF0ZWQgaGFyZHdhcmUgdGhhdCBpcworICAgZS5nLiBvbmx5IHRyaXZpYWxseSBpbml0aWFsaXplZCBidXQgbm90IGFjdHVhbGx5IHVzZWQuCisKKworICAgUE9SVFMKKworICAgaW50IChvdXRwdXQpCisgICBEcml2ZW4gYXMgYSByZXN1bHQgb2YgYSByZW1vdGUgaW50ZXJydXB0IHJlcXVlc3QuICBUaGUgdmFsdWUgaXMgYQorICAgMzItYml0IGJpdHNldCBvZiBhY3RpdmUgaW50ZXJydXB0cy4KKworCisgICBCVUdTCisKKyAgIEFsbCBhbmQgbm9uZS4KKworCisgICBQUk9UT0NPTAorCisgICBUaGlzIGlzIHZlcnNpb24gMS4wIG9mIHRoaXMgcHJvdG9jb2wsIGRlZmluaW5nIHBhY2tldCBmb3JtYXQgYW5kCisgICBhY3Rpb25zIGluIGEgc3VwcG9zZWRseSB1cHdhcmQtY29tcGF0aWJsZSBtYW5uZXIgd2hlcmUgY2xpZW50IGFuZAorICAgc2VydmVycyBvZiBkaWZmZXJlbnQgdmVyc2lvbnMgYXJlIGV4cGVjdGVkIHRvIGludGVyb3BlcmF0ZTsgdGhlCisgICBmb3JtYXQgYW5kIHRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgaG9wZWZ1bGx5IGdlbmVyaWMgZW5vdWdoIHRvCisgICBhbGxvdyB0aGlzLgorCisgICBFYWNoIGNvbm5lY3Rpb24gaGFzIGEgc2VydmVyIGFuZCBhIGNsaWVudCAodGhpcyBjb2RlKTsgdGhlIHJvbGVzCisgICBhcmUga25vd24gYmVmb3JlaGFuZC4gIFRoZSBjbGllbnQgdXN1YWxseSBjb3JyZXNwb25kcyB0byBhIENQVSBhbmQKKyAgIG1lbW9yeSBzeXN0ZW0gYW5kIHRoZSBzZXJ2ZXIgY29ycmVzcG9uZHMgdG8gYSBtZW1vcnktbWFwcGVkCisgICByZWdpc3RlciBoYXJkd2FyZSBpbnRlcmZhY2UgYW5kL29yIGEgRE1BIGNvbnRyb2xsZXIuICBUaGV5CisgICBjb21tdW5pY2F0ZSB1c2luZyBwYWNrZXRzIHdpdGggc3BlY2lmaWMgY29tbWFuZHMsIG9mIHdoaWNoIHNvbWUKKyAgIHJlcXVpcmUgcmVwbGllcyBmcm9tIHRoZSBvdGhlciBzaWRlOyBtb3N0IGFyZSBpbnRpYXRlZCBieSB0aGUKKyAgIGNsaWVudCB3aXRoIG9uZSBleGNlcHRpb24uICBBIHJlcGx5IHVzZXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZQorICAgY29tbWFuZC4KKworICAgUGFja2V0cyBhcmUgYXQgbGVhc3QgdGhyZWUgYnl0ZXMgbG9uZywgd2hlcmUgdGhlIGZpcnN0IHR3byBieXRlcworICAgZm9ybSBhIGhlYWRlciwgYSAxNi1iaXQgbGl0dGxlLWVuZGlhbiBudW1iZXIgdGhhdCBpcyB0aGUgdG90YWwKKyAgIGxlbmd0aCBvZiB0aGUgcGFja2V0IGluY2x1ZGluZyB0aGUgaGVhZGVyLiAgVGhlcmUgaXMgYWxzbyBhCisgICBvbmUtYnl0ZSBjb21tYW5kLiAgVGhlIHBheWxvYWQgaXMgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUKKyAgIGNvbW1hbmQuCisKKyAgIFtbMTYtYml0LWxvdy1ieXRlLW9mLWxlbmd0aF0gWzE2LWJpdC1oaWdoLWJ5dGUtb2YtbGVuZ3RoXQorICAgIFtjb21tYW5kL3JlcGx5XSBbcGF5bG9hZCBieXRlIDBdIFtwYXlsb2FkIGJ5dGUgMV0KKyAgICAuLi4gW3BheWxvYWQgYnl0ZSAobGVuZ3RoLW9mLXBhY2tldCAtIDMpXV0KKworICAgQ29tbWFuZHM6CisKKyAgIEEgY2xpZW50IG9yIHNlcnZlciB0aGF0IHJlYWRzIGFuIHVuZG9jdW1lbnRlZCBjb21tYW5kIG1heSBleGl0IHdpdGgKKyAgIGEgaGFyZCBlcnJvci4gIFBheWxvYWQgbm90IGRlZmluZWQgb3IgZGlzYWxsb3dlZCBiZWxvdyBpcyBpZ25vcmVkLgorCisgICBJdCBpcyBleHBlY3RlZCB0aGF0IGZ1dHVyZSBjbGllbnQgdmVyc2lvbnMgZmluZCBvdXQgdGhlIHZlcnNpb24gb2YKKyAgIHRoZSBzZXJ2ZXIgc2lkZSBieSBwb2xsaW5nIHdpdGggYmFzZSBjb21tYW5kcywgYXNzdW1pbmcgZWFybGllcgorICAgdmVyc2lvbnMgaWYgYSBjZXJ0YWluIHJlcGx5IGlzbid0IHNlZW4sIHdpdGggbmV3bHkgZGVmaW5lZCBwYXlsb2FkCisgICBwYXJ0cyB3aGVyZSBlYXJsaWVyIHZlcnNpb25zIGxlZnQgaXQgdW5kZWZpbmVkLiAgTmV3IGNvbW1hbmRzIGFuZAorICAgZm9ybWF0cyBhcmUgc2VudCBvbmx5IHRvIHRoZSBvdGhlciBzaWRlIGFmdGVyIHRoZSBjbGllbnQgYW5kIHNlcnZlcgorICAgaGFzIGZvdW5kIG91dCBlYWNoIG90aGVycyB2ZXJzaW9uLiAgTm90IGFsbCBzZXJ2ZXJzIHN1cHBvcnQgYWxsCisgICBjb21tYW5kczsgdGhlIHR5cGUgb2Ygc2VydmVyIGFuZCBzdXBwb3J0ZWQgc2V0IG9mIGNvbW1hbmRzIGlzCisgICBleHBlY3RlZCB0byBiZSBrbm93biBiZWZvcmVoYW5kLgorCisgICBSVl9SRUFEX0NNRCA9IDAKKyAgIEluaXRpYXRlZCBieSB0aGUgY2xpZW50LCByZXF1aXJlcyBhIHJlcGx5IGZyb20gdGhlIHNlcnZlci4gIFRoZQorICAgcGF5bG9hZCBmcm9tIHRoZSBjbGllbnQgaXMgYXQgbGVhc3QgNCBieXRlcywgZm9ybWluZyBhIDQtYnl0ZQorICAgbGl0dGxlLWVuZGlhbiBhZGRyZXNzLCB0aGUgcmVzdCBiZWluZyB1bmRlZmluZWQuICBUaGUgcmVwbHkgZnJvbQorICAgdGhlIHNlcnZlciBpcyBhdCBsZWFzdCA4IGJ5dGVzLCBmb3JtaW5nIHRoZSBzYW1lIGFkZHJlc3MgZGF0YSBhcyBpbgorICAgdGhlIHJlcXVlc3QgYW5kIHRoZSBzZWNvbmQgNC1ieXRlIGRhdGEgYmVpbmcgdGhlIGxpdHRsZS1lbmRpYW4KKyAgIGNvbnRlbnRzLgorCisgICBSVl9XUklURV9DTUQgPSAxCisgICBJbml0aWF0ZWQgYnkgdGhlIGNsaWVudCwgcmVxdWlyZXMgYSByZXBseSBmcm9tIHRoZSBzZXJ2ZXIuICBQYXlsb2FkCisgICBmcm9tIHRoZSBjbGllbnQgaXMgYXQgbGVhc3QgOCBieXRlcywgZm9ybWluZyBhIDQtYnl0ZSBsaXR0bGUtZW5kaWFuCisgICB3b3JkIGJlaW5nIHRoZSBhZGRyZXNzLCB0aGUgcmVzdCBiZWluZyB0aGUgbGl0dGxlLWVuZGlhbiBjb250ZW50cworICAgdG8gd3JpdGUuICBUaGUgcmVwbHkgZnJvbSB0aGUgc2VydmVyIGlzIDggYnl0ZXMgdW5sZXNzIGVsc2V3aGVyZQorICAgYWdyZWVkIG90aGVyd2lzZSwgZm9ybWluZyB0aGUgc2FtZSBhZGRyZXNzIGFuZCBkYXRhIGFzIGluIHRoZQorICAgcmVxdWVzdC4gIFRoZSBkYXRhIHNlbnQgYmFjayBtYXkgaGF2ZSBiZWVuIGFsdGVyZWQgdG8gY29ycmVzcG9uZCB0bworICAgZGVmaW5lZCBwYXJ0cyBidXQgY2FuIHNhZmVseSBiZSBkaXNjYXJkZWQuCisKKyAgIFJWX0lSUV9DTUQgPSAyCisgICBJbml0aWF0ZWQgYnkgdGhlIHNlcnZlciwgbm8gcmVwbHkuICBUaGUgcGF5bG9hZCBpcyA0IGJ5dGVzLCBmb3JtaW5nCisgICBhIGxpdHRsZS1lbmRpYW4gd29yZCB3aXRoIGJpdHMgbnVtYmVycyBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbnRseQorICAgYWN0aXZlIGludGVycnVwdCBzb3VyY2VzOyB2YWx1ZSAoMTw8TikgaW5kaWNhdGluZyBpbnRlcnJ1cHQgc291cmNlCisgICBOIGJlaW5nIGFjdGl2ZS4KKworICAgUlZfTUVNX1JEX0NNRCA9IDMKKyAgIEluaXRpYXRlZCBieSB0aGUgc2VydmVyLCByZXF1aXJlcyBhIHJlcGx5LiAgQSBjbGllbnQgbXVzdCBrbm93CisgICBiZWZvcmVoYW5kIHdoZW4gKGluIGNvbW1hbmQgc2VxdWVuY2Ugb3IgY29uc3RhbnQpIHRoZSBzZXJ2ZXIgY2FuCisgICBzZW5kIHRoaXMgY29tbWFuZCBhbmQgaWYgc28gbXVzdCB0aGVuIG5vdCBzZW5kIGFueSBjb21tYW5kcyBvZiBpdHMKKyAgIG93biAoaW5jbHVkaW5nIHdhdGNoZG9nIGNvbW1hbmRzKTsgdGhlIHNlcnZlciBpcyBhbGxvd2VkIHRvIGFzc3VtZQorICAgdGhhdCBpbmNvbWluZyBkYXRhIGlzIG9ubHkgcmVwbGllcyB0byB0aGlzIGNvbW1hbmQuICBUaGUgZm9ybWF0IGlzCisgICA4IGJ5dGVzIG9mIGRhdGE7IDQgYnl0ZXMgb2YgbGl0dGxlLWVuZGlhbiBhZGRyZXNzIGZvbGxvd2VkIGJ5IGEKKyAgIDMyLWJpdCBsaXR0bGUgZW5kaWFuIHdvcmQgd2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuICBUaGUKKyAgIHJlcGx5IGlzIHRoZSBzYW1lIGFkZHJlc3MgYW5kIG51bWJlciBvZiBieXRlcywgZm9sbG93ZWQgYnkgdGhlIGRhdGEKKyAgIHRoYXQgaGFkIGJlZW4gcmVhZC4KKworICAgUlZfTUVNX1dSX0NNRCA9IDQKKyAgIEluaXRpYXRlZCBieSB0aGUgc2VydmVyLCBubyByZXBseS4gIFRoZSBmb3JtYXQgaXMgdGhlIHNhbWUgYXMgYQorICAgcmVwbHkgdG8gUlZfTUVNX1JEX0NNRDsgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBhZGRyZXNzLCBmb2xsb3dlZCBieQorICAgdGhlIDMyLWJpdCBsaXR0bGUtZW5kaWFuIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAocmVkdW5kYW50CisgICBpbmZvcm1hdGlvbiBidXQgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHBhY2tldCBoZWFkZXIpLgorCisgICBSVl9NQk9YX0hBTkRMRV9DTUQgPSA1CisgICBJbml0aWF0ZWQgYnkgdGhlIGNsaWVudCwgcmVxdWlyZXMgYSByZXBseS4gIFRoZSBwYXlsb2FkIGlzIDQKKyAgIHVuZGVmaW5lZCBieXRlcyBmb2xsb3dlZCBieSBhbiBiaW5hcnkgYmxvYiwgdGhlIHNpemUgb2YgdGhlCisgICBibG9iIGdpdmVuIGJ5IHRoZSBwYWNrZXQgaGVhZGVyLiAgVGhlIHJlcGx5IGlzIGEgMzItYml0IGxpdHRsZQorICAgZW5kaWFuIG51bWJlciBhdCB0aGUgc2FtZSBpbmRleCBhcyB0aGUgdW5kZWZpbmVkIGJ5dGVzLiAgQWN0dWFsCisgICBzZW1hbnRpY3MgYXJlIGFwcGxpY2F0aW9uLXNwZWNpZmljLgorCisgICBSVl9NQk9YX1BVVF9DTUQgPSA2CisgICBJbml0aWF0ZWQgYnkgdGhlIGNsaWVudCwgcmVxdWlyZXMgYSByZXBseSwgd2l0aCB0aGUgcmVwbHkgdXNpbmcgdGhlCisgICBSVl9NQk9YX0hBTkRMRV9DTUQgcmVwbHkgZm9ybWF0IChpLmUuICpib3RoKiB0aGF0IGNvbW1hbmQgYW5kCisgICAzMi1iaXQgbGl0dGxlLWVuZGlhbiBudW1iZXIpLiAgVGhlIHBheWxvYWQgaXMgYSAzMi1iaXQgbGl0dGxlCisgICBlbmRpYW4gbnVtYmVyIGZvbGxvd2VkIGJ5IGFuIHVuZGVmaW5lZCBwYXlsb2FkLCBhdCBtb3N0IDIwIGJ5dGVzCisgICBsb25nLiAgVGhlIHJlcGx5IGlzIGEgMzItYml0IGxpdHRsZSBlbmRpYW4gbnVtYmVyLiAgQWN0dWFsCisgICBzZW1hbnRpY3MgYXJlIGFwcGxpY2F0aW9uLXNwZWNpZmljLgorCisgICBSVl9XQVRDSERPR19DTUQgPSA3CisgICBJbml0aWF0ZWQgYnkgdGhlIGNsaWVudCwgbm8gcmVwbHkuICBBIHZlcnNpb24gMS4wIGNsaWVudCBzZW5kcyBubworICAgcGF5bG9hZDsgYSB2ZXJzaW9uIDEuMCBzZXJ2ZXIgc2hvdWxkIGlnbm9yZSBhbnkgc3VjaCBwYXlsb2FkLiAgQQorICAgdmVyc2lvbiAxLjAgc2VydmVyIG11c3Qgbm90IHNlbmQgYSByZXBseS4KKworCisgICBQb3NzaWJsZSBmdXR1cmUgZW5oYW5jZW1lbnRzOgorCisgICBTeW5jaHJvbml6YXRpb247IHNlcnZlciBhbmQgY2xpZW50IHJlcG9ydHMgdGhlIG51bWJlciBvZiBlbGFwc2VkCisgICBjeWNsZXMgKHVuaXQgdG8tYmUtZGVmaW5lZCkgYXQgZWFjaCByZXF1ZXN0IG9yIG5vdGlmaWNhdGlvbi4KKyAgIFByZXR0eSBtdWNoIHRoZSB0b3Atb2YtdGhlLXRvZG8tbGlzdCBpdGVtLgorCisgICBMYXJnZSBhZGRyZXNzZXM7IDEuMCBiZWluZyByZXN0cmljdGVkIHRvIDMyLWJpdCBhZGRyZXNzZXMuCisKKyAgIFZhcmlhYmxlLXNpemUgZGF0YTsgY3VycmVudGx5IHJlc3RyaWN0ZWQgdG8gMzItYml0IHJlZ2lzdGVyCisgICBhY2Nlc3Nlcy4KKworICAgU3BlY2lmaWVkIGRhdGEgZW5kaWFubmVzcyAobm90IHRoZSBwYWNrZXQgaGVhZGVyKSBwZXJoYXBzIGFzIHBhcnQKKyAgIG9mIGFuIGluaXRpYWwgZm9ybWF0IHJlcXVlc3Q7IGN1cnJlbnRseSBsaXR0bGUtZW5kaWFuIG9ubHkuCisKKworICAgVXNhZ2Ugbm90ZXM6CisgICBXaGVuIHVzZWQgd2l0aCBzZXJ2ZXJzIHNlbmRpbmcgUlZfTUVNX1JEX0NNRCBidXQgYmVpbmcKKyAgIG5hcnJvdy1taW5kZWQgYWJvdXQgaW5kYXRhLCBzZXQgd2F0Y2hkb2ctaW50ZXJ2YWwgdG8gMC4gIFVzZQorICAgbXVsdGlwbGUgcnYgaW5zdGFuY2VzIHdoZW4gdGhlcmUgYXJlIGUuZy4gc2VwYXJhdGUgcmVnaXN0ZXIgYW5kCisgICBtZW1vcnkgc2VydmVycy4gIEFsd2F5IGxvZywgc2V0dGluZyAiL3J2L3RyYWNlPyB0cnVlIiwgYXQgdGhlCisgICBkZXZlbG9wbWVudCBwaGFzZS4gIEJvcnJvdyBmcm9tIHRoZSB0ZXN0LXN1aXRlLgorICAgKi8KKworI2RlZmluZSBSVl9GQU1JTFlfTkFNRSAicnYiCisKK2VudW0gcnZfY29tbWFuZCB7CisgIFJWX1JFQURfQ01EID0gMCwKKyAgUlZfV1JJVEVfQ01EID0gMSwKKyAgUlZfSVJRX0NNRCA9IDIsCisgIFJWX01FTV9SRF9DTUQgPSAzLAorICBSVl9NRU1fV1JfQ01EID0gNCwKKyAgUlZfTUJPWF9IQU5ETEVfQ01EID0gNSwKKyAgUlZfTUJPWF9QVVRfQ01EID0gNiwKKyAgUlZfV0FUQ0hET0dfQ01EID0gNworfTsKKworCit0eXBlZGVmIHN0cnVjdCBfaHdfcnZfZGV2aWNlCit7CisgIC8qIE1hcHBpbmcgb2YgcmVtb3RlIGludGVycnVwdCBiaXQtbnVtYmVycyB0byBsb2NhbCBvbmVzLiAgKi8KKyAgdW5zaWduZWQzMiByZW1vdGVfdG9fbG9jYWxfaW50WzMyXTsKKworICAvKiBXaGVuIG11bHRpcGxlIGJpdHMgYXJlIHNldCwgYSBub24temVybyB2YWx1ZSBoZXJlIGluZGljYXRlcyB0aGF0CisgICAgIHRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4gICovCisgIHVuc2lnbmVkMzIgaW50bXVsdGlwbGU7CisKKyAgLyogTG9jYWwgYWRkcmVzcyBvZiByZWdpc3RlcnMuICAqLworICB1bnNpZ25lZDMyIHJlZ19hZGRyZXNzOworCisgIC8qIFNpemUgb2YgcmVnaXN0ZXIgYmFuayBpbiBieXRlcy4gICovCisgIHVuc2lnbmVkMzIgcmVnX3NpemU7CisKKyAgLyogUmVtb3RlIGFkZHJlc3Mgb2YgcmVnaXN0ZXJzLiAgKi8KKyAgdW5zaWduZWQzMiByZW1vdGVfcmVnX2FkZHJlc3M7CisKKyAgLyogTG9jYWwgYWRkcmVzcyBvZiBETUE6YWJsZSBtZW1vcnkuICAqLworICB1bnNpZ25lZDMyIG1lbV9hZGRyZXNzOworCisgIC8qIFNpemUgb2YgRE1BOmFibGUgbWVtb3J5IGluIGJ5dGVzLiAgKi8KKyAgdW5zaWduZWQzMiBtZW1fc2l6ZTsKKworICAvKiBCaXRtYXNrIGZvciB2YWxpZCBETUEgcmVxdWVzdCBzaXplLiAgKi8KKyAgdW5zaWduZWQzMiBtZW1fYnVyc3RfbWFzazsKKworICAvKiBSZW1vdGUgYWRkcmVzcyBvZiBETUE6YWJsZSBtZW1vcnkuICAqLworICB1bnNpZ25lZDMyIHJlbW90ZV9tZW1fYWRkcmVzczsKKworICAvKiAoTG9jYWwpIGFkZHJlc3Mgb2YgbWJveDsgd2hlcmUgdG8gcHV0IGEgcG9pbnRlciB0byB0aGUgbWJveCB0byBiZQorICAgICBzZW50LiAgKi8KKyAgdW5zaWduZWQzMiBtYm94X2FkZHJlc3M7CisKKyAgLyogUHJvYmFibHkgbm90IDEyNy4wLjAuMToxMDAwMC4gICovCisgIGNvbnN0IGNoYXIgKmhvc3Q7CisgIGludCBwb3J0OworCisgIC8qIElmIG5vbi1OVUxMLCBwb2ludHMgdG8gbWVtb3J5IHRvIHVzZSBpbnN0ZWFkIG9mIGNvbm5lY3Rpb24uICAqLworICB1bnNpZ25lZDggKmR1bW15OworCisgIC8qIEZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHNvY2tldC4gIFNldCB0byAtMSB3aGVuIGVycm9yLiAgT25seSBvbmUKKyAgICAgb2YgZHVtbXkgYW5kIHRoaXMgaXMgYWN0aXZlLiAgKi8KKyAgaW50IGZkOworCisgIC8qIFN0YXNoZWQgZXJybm8sIGFzIHdlIGRvbid0IGVtaXQgYW4gZXJyb3IgcmlnaHQgYXdheS4gICovCisgIGludCBzYXZlZF9lcnJubzsKKworICAvKiBUaGlzLCBwbHVzIGxhdGVuY3kgYmVjYXVzZSB0aGUgQ1BVIG1pZ2h0IG5vdCBiZSBjaGVja2luZyB1bnRpbCBhCisgICAgIENUSSBpbnNuICh1c3VhbGx5IGEgYnJhbmNoIG9yIGEganVtcCkgaXMgdGhlIGludGVydmFsIGluIGN5Y2xlcworICAgICBiZXR3ZWVuIHRoZSBydiBpcyBwb2xsZWQgZm9yIGUuZy4gRE1BIHJlcXVlc3RzLiAgKi8KKyAgdW5zaWduZWQzMiBtYXhfdGlja19wb2xsX2ludGVydmFsOworCisgIC8qIFJ1bm5pbmcgY291bnRlciBmb3IgZXhwb25lbnRpYWwgYmFja29mZiB1cCB0bworICAgICBtYXhfdGlja19wb2xsX2ludGVydmFsIHRvIGF2b2lkIHBvbGxpbmcgdGhlIGNvbm5lY3Rpb24KKyAgICAgdW5uZWNlc3NhcmlseSBvZnRlbi4gIFNldCB0byAxIHdoZW4gcnYgYWN0aXZpdHkgKHJlYWQvd3JpdGUKKyAgICAgcmVnaXN0ZXIsIERNQSByZXF1ZXN0KSBpcyBkZXRlY3RlZC4gICovCisgIHVuc2lnbmVkMzIgbmV4dF9wZXJpb2Q7CisKKyAgLyogVGhpcyBpcyB0aGUgaW50ZXJ2YWwgaW4gd2FsbC1jbG9jayBzZWNvbmRzIGJldHdlZW4gd2F0Y2hkb2cKKyAgICAgcGFja2V0cyBhcmUgc2VudCB0byB0aGUgcmVtb3RlIHNpZGUuICBaZXJvIG1lYW5zIG5vIHdhdGNoZG9nCisgICAgIHBhY2tldHMuICovCisgIHVuc2lnbmVkMzIgd2F0Y2hkb2dfaW50ZXJ2YWw7CisKKyAgLyogTGFzdCB0aW1lIHdlIHNlbnQgYSB3YXRjaGRvZyBwYWNrZXQuICAqLworICBzdHJ1Y3QgdGltZXZhbCBsYXN0X3dkb2dfdGltZTsKKworICAvKiBNb3N0bHkgdXNlZCBhcyBhIGtsdWRnZSBmb3Iga25vd2luZyB3aGljaCBydjpzIGhhdmUgcG9sbCBldmVudHMKKyAgICAgYWN0aXZlLiAgKi8KKyAgc3RydWN0IGh3X2V2ZW50ICpwb2xsX2NhbGxiYWNrOworfSBod19ydl9kZXZpY2U7CisKKworLyogV2UgbWlnaHQgYWRkIHBvcnRzIGluIHRoZSBmdXR1cmUsIHNvIGtlZXAgdGhpcyBhbiBlbnVtZXJhdGlvbi4gICovCitlbnVtCisgIHsKKyAgICBJTlRfUE9SVAorICB9OworCisvKiBPdXIgcG9ydHMuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgaHdfcnZfcG9ydHNbXSA9IHsKKyAgeyAiaW50IiwgSU5UX1BPUlQsIDAsIG91dHB1dF9wb3J0IH0sCisgIHsgTlVMTCB9Cit9OworCisvKiBTZW5kIExFTiBieXRlcyBvZiBkYXRhIGZyb20gQlVGIHRvIHRoZSBzb2NrZXQuICBBYm9ydCBvbgorICAgZXJyb3JzLiAgKi8KKworc3RhdGljIHZvaWQKK2h3X3J2X3dyaXRlIChzdHJ1Y3QgaHcgKm1lLAorCSAgICAgdm9pZCAqYnVmLAorCSAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgaHdfcnZfZGV2aWNlICpydiA9IChod19ydl9kZXZpY2UgKikgaHdfZGF0YSAobWUpOworICB1bnNpZ25lZDggKmJ1ZnAgPSBidWY7CisKKyAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIGZkIGhlcmUsIGl0J3MgYmVjYXVzZSB3ZSBnb3QgYW4gZXJyb3IKKyAgICAgaW5pdGlhbGx5LCBhbmQgd2Ugc3VwcHJlc3NlZCB0aGF0IGVycm9yLiAgKi8KKyAgaWYgKHJ2LT5mZCA8IDApCisgICAgaHdfYWJvcnQgKG1lLCAiY291bGRuJ3Qgb3BlbiBhIGNvbm5lY3Rpb24gdG8gJXM6JWQgYmVjYXVzZTogJXMiLAorCSAgICAgIHJ2LT5ob3N0LCBydi0+cG9ydCwgc3RyZXJyb3IgKHJ2LT5zYXZlZF9lcnJubykpOworCisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIHNzaXplX3QgcmV0ID0gd3JpdGUgKHJ2LT5mZCwgYnVmcCwgbGVuKTsKKyAgICAgIGlmIChyZXQgPCAwKQorCS8qIEZJWE1FOiBNb3JlIGdyYWNlZnVsIGV4aXQuICAqLworCWh3X2Fib3J0IChtZSwgIndyaXRlIHRvICVzOiVkIGZhaWxlZDogJXNcbiIsIHJ2LT5ob3N0LCBydi0+cG9ydCwKKwkJICBzdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgbGVuIC09IHJldDsKKyAgICAgIGJ1ZnAgKz0gcmV0OworICAgIH0KK30KKworLyogUmVhZCBMRU4gYnl0ZXMgb2YgZGF0YSBpbnRvIEJVRiBmcm9tIHRoZSBzb2NrZXQuICBTZXQgdGhlIGZpbGUKKyAgIGRlc2NyaXB0b3IgdG8gLTEgaWYgdGhlcmUncyBhbiBlcnJvci4gICovCisKK3N0YXRpYyB2b2lkCitod19ydl9yZWFkIChzdHJ1Y3QgaHcgKm1lLAorCSAgICB2b2lkICpidWYsCisJICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisgIGh3X3J2X2RldmljZSAqcnYgPSAoaHdfcnZfZGV2aWNlICopIGh3X2RhdGEgKG1lKTsKKyAgdW5zaWduZWQ4ICpidWZwID0gYnVmOworCisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIHNzaXplX3QgcmV0ID0gcmVhZCAocnYtPmZkLCBidWZwLCBsZW4pOworCisgICAgICAvKiBXZSBnZXQgYWxsIHplcm8gaWYgdGhlIHJlbW90ZSBlbmQgcXVpdHMsIGJ1dCBubyBlcnJvcgorCSBpbmRpY2F0aW9uOyBldmVuIHNlbGVjdCBzYXlzIHRoZXJlJ3MgZGF0YSBhY3RpdmUuICAqLworICAgICAgaWYgKHJldCA8PSAwKQorCXsKKwkgIGlmIChjbG9zZSAocnYtPmZkKSAhPSAwKQorCSAgICAvKiBGSVhNRTogTW9yZSBncmFjZWZ1bCBleGl0LiAgKi8KKwkgICAgaHdfYWJvcnQgKG1lLCAicmVhZCBmcm9tICVzOiVkIGZhaWxlZDogJWRcbiIsIHJ2LT5ob3N0LCBydi0+cG9ydCwgZXJybm8pOworCSAgcnYtPmZkID0gLTE7CisJICByZXR1cm47CisJfQorCisgICAgICBsZW4gLT0gcmV0OworICAgICAgYnVmcCArPSByZXQ7CisgICAgfQorfQorCisvKiBDb25zdHJ1Y3QgYW5kIHNlbmQgYSBwYWNrZXQgb2YgZGF0YSBvZiB0eXBlIENNRCBhbmQgbGVuCisgICBMRU5fTk9IRUFERVIgKG5vdCBjb3VudGluZyB0aGUgaGVhZGVyLi4uKS4gICovCisKK3N0YXRpYyB2b2lkCitod19ydl9zZW5kIChzdHJ1Y3QgaHcgKm1lLAorCSAgICB1bnNpZ25lZCBpbnQgY21kLAorCSAgICB2b2lkICptc2csCisJICAgIHVuc2lnbmVkIGludCBsZW5fbm9oZWFkZXIpCit7CisgIGh3X3J2X2RldmljZSAqcnYgPSAoaHdfcnZfZGV2aWNlICopIGh3X2RhdGEgKG1lKTsKKyAgdW5zaWduZWQ4IGJ1ZlszMiszXTsKKyAgdW5zaWduZWQ4ICpidWZwOworICB1bnNpZ25lZCBpbnQgbGVuID0gbGVuX25vaGVhZGVyICsgMzsKKyAgaW50IHJldDsKKworICBidWZbMF0gPSBsZW4gJiAyNTU7CisgIGJ1ZlsxXSA9IChsZW4gPj4gOCkgJiAyNTU7CisgIGJ1ZlsyXSA9IGNtZDsKKworICBpZiAobGVuID4gc2l6ZW9mIChidWYpKQorICAgIHsKKyAgICAgIGh3X3J2X3dyaXRlIChtZSwgYnVmLCAzKTsKKyAgICAgIGxlbiA9IGxlbl9ub2hlYWRlcjsKKyAgICAgIGJ1ZnAgPSBtc2c7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbWVtY3B5IChidWYgKyAzLCBtc2csIGxlbl9ub2hlYWRlcik7CisgICAgICBidWZwID0gYnVmOworICAgIH0KKworICBod19ydl93cml0ZSAobWUsIGJ1ZnAsIGxlbik7Cit9CisKKy8qIEhhbmRsZSBpbmNvbWluZyBETUEgcmVxdWVzdHMgYXMgcGVyIHRoZSBSVl9NRU1fUkRfQ01EIHBhY2tldC4KKyAgIEFib3J0IG9uIGVycm9ycy4gICovCisKK3N0YXRpYyB2b2lkCitod19ydl9yZWFkX21lbSAoc3RydWN0IGh3ICptZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgaHdfcnZfZGV2aWNlICpydiA9IChod19ydl9kZXZpY2UgKikgaHdfZGF0YSAobWUpOworICAvKiBJZiB5b3UgY2hhbmdlIHRoaXMgc2l6ZSwgcGxlYXNlIGFkanVzdCB0aGUgbWVtMiB0ZXN0Y2FzZS4gICovCisgIHVuc2lnbmVkOCBidWZbMzIrOF07CisgIHVuc2lnbmVkOCAqYnVmcCA9IGJ1ZjsKKyAgdW5zaWduZWQzMiBsZWFkZHI7CisgIHVuc2lnbmVkMzIgYWRkcjsKKyAgdW5zaWduZWQzMiBsZWxlbjsKKyAgdW5zaWduZWQzMiBpOworCisgIGlmIChsZW4gIT0gOCkKKyAgICBod19hYm9ydCAobWUsICJleHBlY3RlZCBETUEgcmVhZCByZXF1ZXN0IGxlbiA4KzMsIGdvdCAlZCszIiwgbGVuKTsKKworICBod19ydl9yZWFkIChtZSwgJmxlYWRkciwgNCk7CisgIGh3X3J2X3JlYWQgKG1lLCAmbGVsZW4sIDQpOworICBsZW4gPSBMRTJIXzQgKGxlbGVuKTsKKyAgYWRkciA9IExFMkhfNCAobGVhZGRyKTsKKworICBpZiAoYWRkciA8IHJ2LT5yZW1vdGVfbWVtX2FkZHJlc3MKKyAgICAgIHx8IGFkZHIgPj0gcnYtPnJlbW90ZV9tZW1fYWRkcmVzcyArIHJ2LT5tZW1fc2l6ZSkKKyAgICBod19hYm9ydCAobWUsICJETUEgcmVhZCBhdCByZW1vdGUgMHgleDsgb3V0c2lkZSBbMHgleC4uMHgleC0xXSIsCisJICAgICAgKHVuc2lnbmVkKSBhZGRyLCAodW5zaWduZWQpIHJ2LT5yZW1vdGVfbWVtX2FkZHJlc3MsCisJICAgICAgKHVuc2lnbmVkKSAocnYtPnJlbW90ZV9tZW1fYWRkcmVzcyArIHJ2LT5tZW1fc2l6ZSkpOworICBhZGRyID0gYWRkciAtIHJ2LT5yZW1vdGVfbWVtX2FkZHJlc3MgKyBydi0+bWVtX2FkZHJlc3M7CisKKyAgaWYgKGxlbiA9PSAwKQorICAgIGh3X2Fib3J0IChtZSwgIkRNQSByZWFkIHJlcXVlc3QgZm9yIDAgYnl0ZXMgaXNuJ3Qgc3VwcG9ydGVkIik7CisKKyAgaWYgKGxlbiAmIH5ydi0+bWVtX2J1cnN0X21hc2spCisgICAgaHdfYWJvcnQgKG1lLCAiRE1BIHRyeWluZyB0byByZWFkICVkIGJ5dGVzOyBub3QgbWF0Y2hpbmcgbWFzayBvZiAweCV4IiwKKwkgICAgICBsZW4sIHJ2LT5tZW1fYnVyc3RfbWFzayk7CisgIGlmIChsZW4gKyA4ID4gc2l6ZW9mIChidWYpKQorICAgIGJ1ZnAgPSBod19tYWxsb2MgKG1lLCBsZW4gKyA4KTsKKworICBIV19UUkFDRSAoKG1lLCAiRE1BIFIgMHgleC4uMHgleCIsIGFkZHIsIGFkZHIgKyBsZW4gLTEpKTsKKyAgaHdfZG1hX3JlYWRfYnVmZmVyIChtZSwgYnVmcCArIDgsIDAsIGFkZHIsIGxlbik7CisgIGlmIChod190cmFjZV9wIChtZSkpCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KQorICAgICAgSFdfVFJBQ0UgKChtZSwgIjB4JXg6ICUwMnggJTAyeCAlMDJ4ICUwMngiLAorCQkgYWRkciArIGksCisJCSBidWZwW2krOF0sIGJ1ZnBbaSs5XSwgYnVmcFtpKzEwXSwgYnVmcFtpKzExXSkpOworCisgIG1lbWNweSAoYnVmcCwgJmxlYWRkciwgNCk7CisgIG1lbWNweSAoYnVmcCArIDQsICZsZWxlbiwgNCk7CisgIGh3X3J2X3NlbmQgKG1lLCBSVl9NRU1fUkRfQ01ELCBidWZwLCBsZW4gKyA4KTsKKyAgaWYgKGJ1ZnAgIT0gYnVmKQorICAgIGh3X2ZyZWUgKG1lLCBidWZwKTsKK30KKworLyogSGFuZGxlIGluY29taW5nIERNQSByZXF1ZXN0cyBhcyBwZXIgdGhlIFJWX01FTV9XUl9DTUQgcGFja2V0LgorICAgQWJvcnQgb24gZXJyb3JzLiAgKi8KKworc3RhdGljIHZvaWQKK2h3X3J2X3dyaXRlX21lbSAoc3RydWN0IGh3ICptZSwgdW5zaWduZWQgaW50IHBsZW4pCit7CisgIGh3X3J2X2RldmljZSAqcnYgPSAoaHdfcnZfZGV2aWNlICopIGh3X2RhdGEgKG1lKTsKKyAgLyogSWYgeW91IGNoYW5nZSB0aGlzIHNpemUsIHBsZWFzZSBhZGp1c3QgdGhlIG1lbTIgdGVzdGNhc2UuICAqLworICB1bnNpZ25lZDggYnVmWzMyKzhdOworICB1bnNpZ25lZDggKmJ1ZnAgPSBidWY7CisgIHVuc2lnbmVkMzIgbGVhZGRyOworICB1bnNpZ25lZDMyIGFkZHI7CisgIHVuc2lnbmVkMzIgbGVsZW47CisgIHVuc2lnbmVkMzIgbGVuOworICB1bnNpZ25lZDMyIGk7CisKKyAgaHdfcnZfcmVhZCAobWUsICZsZWFkZHIsIDQpOworICBod19ydl9yZWFkIChtZSwgJmxlbGVuLCA0KTsKKyAgbGVuID0gTEUySF80IChsZWxlbik7CisgIGFkZHIgPSBMRTJIXzQgKGxlYWRkcik7CisKKyAgaWYgKGxlbiAhPSBwbGVuIC0gOCkKKyAgICBod19hYm9ydCAobWUsCisJICAgICAgImluY29uc2lzdGVuY3kgaW4gRE1BIHdyaXRlIHJlcXVlc3QgcGFja2V0OiAiCisJICAgICAgImVudmVsb3BlICVkKzMsIGlubmVyICVkIGJ5dGVzIiwgcGxlbiwgbGVuKTsKKworICBpZiAoYWRkciA8IHJ2LT5yZW1vdGVfbWVtX2FkZHJlc3MKKyAgICAgIHx8IGFkZHIgPj0gcnYtPnJlbW90ZV9tZW1fYWRkcmVzcyArIHJ2LT5tZW1fc2l6ZSkKKyAgICBod19hYm9ydCAobWUsICJETUEgd3JpdGUgYXQgcmVtb3RlIDB4JXg7IG91dHNpZGUgWzB4JXguLjB4JXgtMV0iLAorCSAgICAgICh1bnNpZ25lZCkgYWRkciwgKHVuc2lnbmVkKSBydi0+cmVtb3RlX21lbV9hZGRyZXNzLAorCSAgICAgICh1bnNpZ25lZCkgKHJ2LT5yZW1vdGVfbWVtX2FkZHJlc3MgKyBydi0+bWVtX3NpemUpKTsKKworICBhZGRyID0gYWRkciAtIHJ2LT5yZW1vdGVfbWVtX2FkZHJlc3MgKyBydi0+bWVtX2FkZHJlc3M7CisgIGlmIChsZW4gPT0gMCkKKyAgICBod19hYm9ydCAobWUsICJETUEgd3JpdGUgcmVxdWVzdCBmb3IgMCBieXRlcyBpc24ndCBzdXBwb3J0ZWQiKTsKKworICBpZiAobGVuICYgfnJ2LT5tZW1fYnVyc3RfbWFzaykKKyAgICBod19hYm9ydCAobWUsICJETUEgdHJ5aW5nIHRvIHdyaXRlICVkIGJ5dGVzOyBub3QgbWF0Y2hpbmcgbWFzayBvZiAweCV4IiwKKwkgICAgICBsZW4sIHJ2LT5tZW1fYnVyc3RfbWFzayk7CisgIGlmIChsZW4gKyA4ID4gc2l6ZW9mIChidWYpKQorICAgIGJ1ZnAgPSBod19tYWxsb2MgKG1lLCBsZW4gKyA4KTsKKworICBod19ydl9yZWFkIChtZSwgYnVmcCArIDgsIGxlbik7CisgIEhXX1RSQUNFICgobWUsICJETUEgVyAweCV4Li4weCV4IiwgYWRkciwgYWRkciArIGxlbiAtIDEpKTsKKyAgaHdfZG1hX3dyaXRlX2J1ZmZlciAobWUsIGJ1ZnAgKyA4LCAwLCBhZGRyLCBsZW4sIDApOworICBpZiAoaHdfdHJhY2VfcCAobWUpKQorICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkKKyAgICAgIEhXX1RSQUNFICgobWUsICIweCV4OiAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwKKwkJIGFkZHIgKyBpLAorCQkgYnVmcFtpKzhdLCBidWZwW2krOV0sIGJ1ZnBbaSsxMF0sIGJ1ZnBbaSsxMV0pKTsKKyAgaWYgKGJ1ZnAgIT0gYnVmKQorICAgIGh3X2ZyZWUgKG1lLCBidWZwKTsKK30KKworc3RhdGljIHZvaWQKK2h3X3J2X2lycSAoc3RydWN0IGh3ICptZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgaHdfcnZfZGV2aWNlICpydiA9IChod19ydl9kZXZpY2UgKikgaHdfZGF0YSAobWUpOworICB1bnNpZ25lZDMyIGludGJpdHNsZTsKKyAgdW5zaWduZWQzMiBpbnRiaXRzX2V4dDsKKyAgdW5zaWduZWQzMiBpbnR2YWwgPSAwOworICBpbnQgaTsKKworICBpZiAobGVuICE9IDQpCisgICAgaHdfYWJvcnQgKG1lLCAiSVJRIHdpdGggJWQgZGF0YSBub3Qgc3VwcG9ydGVkIiwgbGVuKTsKKworICBod19ydl9yZWFkIChtZSwgJmludGJpdHNsZSwgNCk7CisgIGludGJpdHNfZXh0ID0gTEUySF80IChpbnRiaXRzbGUpOworICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICBpZiAoKGludGJpdHNfZXh0ICYgKDEgPDwgaSkpICE9IDApCisgICAgICBpbnR2YWwgfD0gcnYtPnJlbW90ZV90b19sb2NhbF9pbnRbaV07CisgIGlmICgoaW50Yml0c19leHQgJiB+KGludGJpdHNfZXh0IC0gMSkpICE9IGludGJpdHNfZXh0CisgICAgICAmJiBydi0+aW50bXVsdGlwbGUgIT0gMCkKKyAgICBpbnR2YWwgPSBydi0+aW50bXVsdGlwbGU7CisKKyAgSFdfVFJBQ0UgKChtZSwgIklSUSAweCV4IiwgaW50dmFsKSk7CisgIGh3X3BvcnRfZXZlbnQgKG1lLCBJTlRfUE9SVCwgaW50dmFsKTsKK30KKworLyogSGFuZGxlIGluY29taW5nIGludGVycnVwdCBub3RpZmljYXRpb25zIGFzIHBlciB0aGUgUlZfSVJRX0NNRAorICAgcGFja2V0LiAgQWJvcnQgb24gZXJyb3JzLiAgKi8KKworc3RhdGljIHZvaWQKK2h3X3J2X2hhbmRsZV9pbmNvbWluZyAoc3RydWN0IGh3ICptZSwKKwkJICAgICAgIGludCBleHBlY3RlZF90eXBlLAorCQkgICAgICAgdW5zaWduZWQ4ICpidWYsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKnJldHVybl9sZW4pCit7CisgIGh3X3J2X2RldmljZSAqcnYgPSAoaHdfcnZfZGV2aWNlICopIGh3X2RhdGEgKG1lKTsKKyAgdW5zaWduZWQ4IGNidWZbMzJdOworICB1bnNpZ25lZCBpbnQgbGVuOworICB1bnNpZ25lZCBpbnQgY21kOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGh3X3J2X3JlYWQgKG1lLCBjYnVmLCAzKTsKKworICAgICAgaWYgKHJ2LT5mZCA8IDApCisJcmV0dXJuOworCisgICAgICBsZW4gPSBjYnVmWzBdICsgY2J1ZlsxXSAqIDI1NiAtIDM7CisgICAgICBjbWQgPSBjYnVmWzJdOworCisgICAgICAvKiBUaGVzZSBjb21lIGluICJhc3luY2hyb25vdXNseSI7IG5vdCBhcyBhIHJlcGx5LiAgKi8KKyAgICAgIHN3aXRjaCAoY21kKQorCXsKKwljYXNlIFJWX0lSUV9DTUQ6CisJICBod19ydl9pcnEgKG1lLCBsZW4pOworCSAgYnJlYWs7CisKKwljYXNlIFJWX01FTV9SRF9DTUQ6CisJICBod19ydl9yZWFkX21lbSAobWUsIGxlbik7CisJICBicmVhazsKKworCWNhc2UgUlZfTUVNX1dSX0NNRDoKKwkgIGh3X3J2X3dyaXRlX21lbSAobWUsIGxlbik7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIFNvbWV0aGluZyBpcyBpbmNvbWluZyBmcm9tIHRoZSBvdGhlciBzaWRlLCBzbyB0aWdodGVuIHVwIGFsbAorCSBzbGFjayBhdCB0aGUgbmV4dCB3YWl0LiAgKi8KKyAgICAgIHJ2LT5uZXh0X3BlcmlvZCA9IDE7CisKKyAgICAgIHN3aXRjaCAoY21kKQorCXsKKwljYXNlIFJWX01FTV9SRF9DTUQ6CisJY2FzZSBSVl9NRU1fV1JfQ01EOgorCWNhc2UgUlZfSVJRX0NNRDoKKwkgIC8qIERvbid0IHRyeSB0byBoYW5kbGUgbW9yZSB0aGFuIG9uZSBvZiB0aGVzZSBpZiB3ZSB3ZXJlJ250CisJICAgICBleHBlY3RpbmcgYSByZXBseS4gICovCisJICBpZiAoZXhwZWN0ZWRfdHlwZSA9PSAtMSkKKwkgICAgcmV0dXJuOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBSZXF1aXJlIGEgbWF0Y2ggYmV0d2VlbiB0aGlzIHN1cHBvc2VkLXJlcGx5IGFuZCB0aGUgY29tbWFuZAorCSBmb3IgdGhlIHJlc3QuICAqLworICAgICAgaWYgKGNtZCAhPSBleHBlY3RlZF90eXBlKQorCWh3X2Fib3J0IChtZSwgInVuZXhwZWN0ZWQgcmVwbHksIGV4cGVjdGVkIGNvbW1hbmQgJWQsIGdvdCAlZCIsCisJCSAgZXhwZWN0ZWRfdHlwZSwgY21kKTsKKworICAgICAgc3dpdGNoIChjbWQpCisJeworCWNhc2UgUlZfTUJPWF9QVVRfQ01EOgorCWNhc2UgUlZfTUJPWF9IQU5ETEVfQ01EOgorCWNhc2UgUlZfV1JJVEVfQ01EOgorCWNhc2UgUlZfUkVBRF9DTUQ6CisJICBod19ydl9yZWFkIChtZSwgYnVmLCBsZW4gPD0gKnJldHVybl9sZW4gPyBsZW4gOiAqcmV0dXJuX2xlbik7CisJICAqcmV0dXJuX2xlbiA9IGxlbjsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogU2VuZCBhIHdhdGNoZG9nIHBhY2tldC4gIE1ha2UgYSBub3RlIG9mIHdhbGxjbG9jayB0aW1lLiAgKi8KKworc3RhdGljIHZvaWQKK2h3X3J2X3NlbmRfd2RvZyAoc3RydWN0IGh3ICptZSkKK3sKKyAgaHdfcnZfZGV2aWNlICpydiA9IChod19ydl9kZXZpY2UgKikgaHdfZGF0YSAobWUpOworICBIV19UUkFDRSAoKG1lLCAiV0QiKSk7CisgIGdldHRpbWVvZmRheSAoJnJ2LT5sYXN0X3dkb2dfdGltZSwgTlVMTCk7CisgIGh3X3J2X3NlbmQgKG1lLCBSVl9XQVRDSERPR19DTUQsICIiLCAwKTsKK30KKworLyogUG9sbCB0aGUgcmVtb3RlIHNpZGU6IHNlZSBpZiB0aGVyZSdzIGFueSBpbmNvbWluZyB0cmFmZmljOyBoYW5kbGUgYQorICAgcGFja2V0IGlmIHNvLiAgU2VuZCBhIHdhdGNoZG9nIHBhY2tldCBpZiBpdCdzIHRpbWUgdG8gZG8gc28uCisgICBCZXdhcmUgdGhhdCB0aGUgTGludXggc2VsZWN0IGNhbGwgaW5kaWNhdGVzIHRyYWZmaWMgZm9yIGEgc29ja2V0CisgICB0aGF0IHRoZSByZW1vdGUgc2lkZSBoYXMgY2xvc2VkICh3aGljaCBtYXkgYmUgYmVjYXVzZSBpdCB3YXMKKyAgIGZpbmlzaGVkOyBkb24ndCBob3JrIHVudGlsIHdlIG5lZWQgdG8gd3JpdGUgc29tZXRoaW5nIGp1c3QgYmVjYXVzZQorICAgd2UncmUgcG9sbGluZykuICAqLworCitzdGF0aWMgdm9pZAoraHdfcnZfcG9sbF9vbmNlIChzdHJ1Y3QgaHcgKm1lKQoreworICBod19ydl9kZXZpY2UgKnJ2ID0gKGh3X3J2X2RldmljZSAqKSBod19kYXRhIChtZSk7CisgIGZkX3NldCByZmRzOworICBmZF9zZXQgZWZkczsKKyAgc3RydWN0IHRpbWV2YWwgbm93OworICBpbnQgcmV0OworICBzdHJ1Y3QgdGltZXZhbCB0djsKKworICBpZiAocnYtPmZkIDwgMCkKKyAgICAvKiBDb25uZWN0aW9uIGhhcyBkaWVkIG9yIHdhcyBuZXZlciBpbml0aWF0ZWQuICAqLworICAgIHJldHVybjsKKworICBGRF9aRVJPICgmcmZkcyk7CisgIEZEX1NFVCAocnYtPmZkLCAmcmZkcyk7CisgIEZEX1pFUk8gKCZlZmRzKTsKKyAgRkRfU0VUIChydi0+ZmQsICZlZmRzKTsKKyAgdHYudHZfc2VjID0gMDsKKyAgdHYudHZfdXNlYyA9IDA7CisKKyAgcmV0ID0gc2VsZWN0IChydi0+ZmQgKyAxLCAmcmZkcywgTlVMTCwgJmVmZHMsICZ0dik7CisgIGdldHRpbWVvZmRheSAoJm5vdywgTlVMTCk7CisKKyAgaWYgKHJldCA8IDApCisgICAgaHdfYWJvcnQgKG1lLCAic2VsZWN0IGZhaWxlZDogJWRcbiIsIGVycm5vKTsKKworICBpZiAocnYtPndhdGNoZG9nX2ludGVydmFsICE9IDAKKyAgICAgICYmIG5vdy50dl9zZWMgLSBydi0+bGFzdF93ZG9nX3RpbWUudHZfc2VjID49IHJ2LT53YXRjaGRvZ19pbnRlcnZhbCkKKyAgICBod19ydl9zZW5kX3dkb2cgKG1lKTsKKworICBpZiAoRkRfSVNTRVQgKHJ2LT5mZCwgJnJmZHMpKQorICAgIGh3X3J2X2hhbmRsZV9pbmNvbWluZyAobWUsIC0xLCBOVUxMLCBOVUxMKTsKK30KKworLyogSW5pdGlhbGl6ZSBtYXBwaW5nIG9mIHJlbW90ZS10by1sb2NhbCBpbnRlcnJ1cHQgZGF0YS4gICovCisKK3N0YXRpYyB2b2lkCitod19ydl9tYXBfaW50cyAoc3RydWN0IGh3ICptZSkKK3sKKyAgaHdfcnZfZGV2aWNlICpydiA9IChod19ydl9kZXZpY2UgKikgaHdfZGF0YSAobWUpOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICBydi0+cmVtb3RlX3RvX2xvY2FsX2ludFtpXSA9IDEgPDwgaTsKKworICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAobWUsICJpbnRudW0iKSAhPSBOVUxMKQorICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgICAgeworCXNpZ25lZF9jZWxsIHZhbCA9IC0xOworCWlmIChod19maW5kX2ludGVnZXJfYXJyYXlfcHJvcGVydHkgKG1lLCAiaW50bnVtIiwgaSwgJnZhbCkgPiAwKQorCSAgeworCSAgICBpZiAodmFsID4gMCkKKwkgICAgICBydi0+cmVtb3RlX3RvX2xvY2FsX2ludFtpXSA9IHZhbDsKKwkgICAgZWxzZQorCSAgICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiaW50bnVtQCVkXCIgbXVzdCBiZSA+IDA7IGlzICVkIiwKKwkJCWksIChpbnQpIHZhbCk7CisJICB9CisgICAgICB9Cit9CisKKy8qIEhhbmRsZSB0aGUgYWZ0ZXItTi10aWNrcyAicG9sbCBldmVudCIsIGNhbGxpbmcgdGhlIHBvbGwtdGhlLWZkCisgICBtZXRob2QuICBVcGRhdGUgdGhlIHBlcmlvZC4gICovCisKK3N0YXRpYyB2b2lkCitkb19wb2xsX2V2ZW50IChzdHJ1Y3QgaHcgKm1lLCB2b2lkICpkYXRhKQoreworICBod19ydl9kZXZpY2UgKnJ2ID0gKGh3X3J2X2RldmljZSAqKSBod19kYXRhIChtZSk7CisgIHVuc2lnbmVkMzIgbmV3X3BlcmlvZDsKKworICBpZiAocnYtPmR1bW15ICE9IE5VTEwpCisgICAgcmV0dXJuOworCisgIGh3X3J2X3BvbGxfb25jZSAobWUpOworICBpZiAocnYtPmZkID49IDApCisgICAgcnYtPnBvbGxfY2FsbGJhY2sKKyAgICAgID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCBydi0+bmV4dF9wZXJpb2QsIGRvX3BvbGxfZXZlbnQsIE5VTEwpOworCisgIG5ld19wZXJpb2QgPSBydi0+bmV4dF9wZXJpb2QgKiAyOworICBpZiAobmV3X3BlcmlvZCA8PSBydi0+bWF4X3RpY2tfcG9sbF9pbnRlcnZhbCkKKyAgICBydi0+bmV4dF9wZXJpb2QgPSBuZXdfcGVyaW9kOworfQorCisvKiBIVyB0cmVlIHRyYXZlcnNlIGZ1bmN0aW9uIGZvciBod19ydl9hZGRfaW5pdC4gICovCisKK3N0YXRpYyB2b2lkCitod19ydl9hZGRfcG9sbGVyIChzdHJ1Y3QgaHcgKm1lLCB2b2lkICpkYXRhKQoreworICBod19ydl9kZXZpY2UgKnJ2OworCisgIGlmIChod19mYW1pbHkgKG1lKSA9PSBOVUxMCisgICAgICB8fCBzdHJjbXAgKGh3X2ZhbWlseSAobWUpLCBSVl9GQU1JTFlfTkFNRSkgIT0gMCkKKyAgICByZXR1cm47CisKKyAgcnYgPSAoaHdfcnZfZGV2aWNlICopIGh3X2RhdGEgKG1lKTsKKyAgaWYgKHJ2LT5wb2xsX2NhbGxiYWNrICE9IE5VTEwpCisgICAgcmV0dXJuOworCisgIHJ2LT5wb2xsX2NhbGxiYWNrCisgICAgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDEsIGRvX3BvbGxfZXZlbnQsIE5VTEwpOworfQorCisvKiBTaW11bGF0b3IgbW9kdWxlIGluaXQgZnVuY3Rpb24gZm9yIGh3X3J2X2FkZF9pbml0LiAgKi8KKworLyogRklYTUU6IEZvciB0aGUgY2FsbCBzbyBod190cmVlX3RyYXZlcnNlLCB3ZSBuZWVkIHRvIGtub3cgdGhhdCB0aGUKKyAgIGZpcnN0IG1lbWJlciBvZiBzdHJ1Y3Qgc2ltX2h3IGlzIHRoZSBzdHJ1Y3QgaHcgKnJvb3QsIGJ1dCB0aGVyZSdzCisgICBubyBhY2Nlc3NvciBtZXRob2QgYW5kIHN0cnVjdCBzaW1faHcgaXMgZGVmaW5lZCBpbiBzaW0taHcuYyBvbmx5LgorICAgSGVuY2UgdGhpcyBoYWNrLCB1bnRpbCBhbiBhY2Nlc3NvciBpcyBhZGRlZCwgb3IgdGhlcmUncyBhIHRyYXZlcnNlCisgICBmdW5jdGlvbiB0aGF0IHRha2VzIGEgU0lNX0RFU0MgYXJndW1lbnQuICAqLworc3RydWN0IHNpbV9odyB7IHN0cnVjdCBodyAqdHJlZTsgfTsKKworc3RhdGljIFNJTV9SQworaHdfcnZfYWRkX3J2X3BvbGxlcnMgKFNJTV9ERVNDIHNkKQoreworICBod190cmVlX3RyYXZlcnNlIChTVEFURV9IVyAoc2QpLT50cmVlLCBod19ydl9hZGRfcG9sbGVyLCBOVUxMLCBOVUxMKTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworLyogV2UgbmVlZCB0byBhZGQgZXZlbnRzIGZvciBwb2xsaW5nLCBidXQgd2UgY2FuJ3QgYWRkIG9uZSBmcm9tIHRoZQorICAgZmluaXNoLWZ1bmN0aW9uLCBhbmQgdGhlcmUgYXJlIG5vIG90aGVyIGNhbGwgcG9pbnRzLCBhdCBsZWFzdCBmb3IKKyAgIGluc3RhbmNlcyB3aXRob3V0ICJyZWciICh3aGVuIHRoZXJlIGFyZSBqdXN0IERNQSByZXF1ZXN0cyBmcm9tIHRoZQorICAgcmVtb3RlIGVuZDsgbm8gbG9jYWxseSBpbml0aWF0ZWQgYWN0aXZpdHkpLiAgVGhlcmVmb3JlIHdlIGFkZCBhCisgICBzaW11bGF0b3IgbW9kdWxlIGluaXQgZnVuY3Rpb24sIGJ1dCB0aG9zZSBkb24ndCBoYXZlIHByaXZhdGUKKyAgIHBheWxvYWQgYXJndW1lbnRzOyBqdXN0IGEgU0QgYXJndW1lbnQuICBXZSBjb3BlIGJ5IHBhcnNpbmcgdGhlIEhXCisgICByb290IGFuZCBtYWtpbmcgc3VyZSAqYWxsKiAicnYiOnMgaGF2ZSBwb2xsIGNhbGxiYWNrcyBpbnN0YWxsZWQuCisgICBMdWNraWx5LCB0aGlzIGlzIGp1c3QgYW4gaW5pdGlhbGl6YXRpb24gc3RlcCwgYW5kIG5vdCBtYW55CisgICBzaW11bHRhbmVvdXMgaW5zdGFuY2VzIG9mIHJ2IGFyZSBleHBlY3RlZDogd2UgZ2V0IGEgTioqMiBjb21wbGV4aXR5CisgICBmb3IgdmlzaXRzIHRvIGVhY2ggcnYgbm9kZSBieSB0aGlzIG1ldGhvZC4gICovCisKK3N0YXRpYyB2b2lkCitod19ydl9hZGRfaW5pdCAoc3RydWN0IGh3ICptZSkKK3sKKyAgc2ltX21vZHVsZV9hZGRfaW5pdF9mbiAoaHdfc3lzdGVtIChtZSksIGh3X3J2X2FkZF9ydl9wb2xsZXJzKTsKK30KKworLyogT3BlbiB1cCBhIGNvbm5lY3Rpb24gdG8gdGhlIG90aGVyIHNpZGUuICBBYm9ydCBvbiBlcnJvcnMuICAqLworCitzdGF0aWMgdm9pZAoraHdfcnZfaW5pdF9zb2NrZXQgKHN0cnVjdCBodyAqbWUpCit7CisgIGh3X3J2X2RldmljZSAqcnYgPSAoaHdfcnZfZGV2aWNlICopIGh3X2RhdGEgKG1lKTsKKyAgaW50IHNvY2s7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXI7CisKKyAgcnYtPmZkID0gLTE7CisKKyAgaWYgKHJ2LT5kdW1teSAhPSBOVUxMKQorICAgIHJldHVybjsKKworICBtZW1zZXQgKCZzZXJ2ZXIsIDAsIHNpemVvZiAoc2VydmVyKSk7CisgIHNlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc2VydmVyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkciAocnYtPmhvc3QpOworCisgIC8qIFNvbGFyaXMgMi43IGxhY2tzIHRoaXMgbWFjcm8uICAqLworI2lmbmRlZiBJTkFERFJfTk9ORQorI2RlZmluZSBJTkFERFJfTk9ORSAtMQorI2VuZGlmCisKKyAgaWYgKHNlcnZlci5zaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX05PTkUpCisgICAgeworICAgICAgc3RydWN0IGhvc3RlbnQgKmg7CisgICAgICBoID0gZ2V0aG9zdGJ5bmFtZSAocnYtPmhvc3QpOworICAgICAgaWYgKGggIT0gTlVMTCkKKwl7CisJICBtZW1jcHkgKCZzZXJ2ZXIuc2luX2FkZHIsIGgtPmhfYWRkciwgaC0+aF9sZW5ndGgpOworCSAgc2VydmVyLnNpbl9mYW1pbHkgPSBoLT5oX2FkZHJ0eXBlOworCX0KKyAgICAgIGVsc2UKKwlod19hYm9ydCAobWUsICJjYW4ndCByZXNvbHZlIGhvc3QgJXMiLCBydi0+aG9zdCk7CisgICAgfQorCisgIHNlcnZlci5zaW5fcG9ydCA9IGh0b25zIChydi0+cG9ydCk7CisgIHNvY2sgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKworICBpZiAoc29jayA8IDApCisgICAgaHdfYWJvcnQgKG1lLCAiY2FuJ3QgZ2V0IGEgc29ja2V0IGZvciAlczolZCBjb25uZWN0aW9uIiwKKwkgICAgICBydi0+aG9zdCwgcnYtPnBvcnQpOworCisgIGlmIChjb25uZWN0IChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2ZXIsIHNpemVvZiBzZXJ2ZXIpID49IDApCisgICAgeworICAgICAgcnYtPmZkID0gc29jazsKKworICAgICAgLyogRklYTUU6IGluaXQgcGFja2V0IGhlcmUuICBNYXliZSBzdGFydCBwYWNrZXQgdG9vLiAgKi8KKyAgICAgIGlmIChydi0+d2F0Y2hkb2dfaW50ZXJ2YWwgIT0gMCkKKwlod19ydl9zZW5kX3dkb2cgKG1lKTsKKyAgICB9CisgIGVsc2UKKyAgICAvKiBTdGFzaCB0aGUgZXJybm8gZm9yIGxhdGVyIGRpc3BsYXksIGlmIHNvbWUgY29ubmVjdGlvbiBhY3Rpdml0eQorICAgICAgIGlzIHJlcXVlc3RlZC4gIERvbid0IGVtaXQgYW4gZXJyb3IgaGVyZTsgd2UgbWlnaHQgaGF2ZSBiZWVuCisgICAgICAgY2FsbGVkIGp1c3QgZm9yIHRlc3QgcHVycG9zZXMuICAqLworICAgIHJ2LT5zYXZlZF9lcnJubyA9IGVycm5vOworfQorCisvKiBMb2NhbCBydiByZWdpc3RlciByZWFkcyBlbmQgdXAgaGVyZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2h3X3J2X3JlZ19yZWFkIChzdHJ1Y3QgaHcgKm1lLAorCQl2b2lkICpkZXN0LAorCQlpbnQgc3BhY2UsCisJCXVuc2lnbmVkX3dvcmQgYWRkciwKKwkJdW5zaWduZWQgaW50IG5yX2J5dGVzKQoreworICBod19ydl9kZXZpY2UgKnJ2ID0gKGh3X3J2X2RldmljZSAqKSBod19kYXRhIChtZSk7CisgIHVuc2lnbmVkOCBhZGRyX2RhdGFbOF0gPSAiIjsKKyAgdW5zaWduZWQzMiBhX2wgPSBIMkxFXzQgKGFkZHIgLSBydi0+cmVnX2FkZHJlc3MgKyBydi0+cmVtb3RlX3JlZ19hZGRyZXNzKTsKKyAgdW5zaWduZWQgaW50IGxlbiA9IDg7CisKKyAgaWYgKG5yX2J5dGVzICE9IDQpCisgICAgaHdfYWJvcnQgKG1lLCAibXVzdCBiZSBmb3VyIGJ5dGUgcmVhZCIpOworCisgIGlmIChhZGRyID09IHJ2LT5tYm94X2FkZHJlc3MpCisgICAgaHdfYWJvcnQgKG1lLCAiaW52YWxpZCByZWFkIG9mIG1ib3ggYWRkcmVzcyAweCV4IiwKKwkgICAgICAodW5zaWduZWQpIHJ2LT5tYm94X2FkZHJlc3MpOworCisgIG1lbWNweSAoYWRkcl9kYXRhLCAmYV9sLCA0KTsKKyAgSFdfVFJBQ0UgKChtZSwgIlJFRyBSIDB4JXgiLCBhZGRyKSk7CisgIGlmIChydi0+ZHVtbXkgIT0gTlVMTCkKKyAgICB7CisgICAgICBsZW4gPSA4OworICAgICAgbWVtY3B5IChhZGRyX2RhdGEgKyA0LCBydi0+ZHVtbXkgKyBhZGRyIC0gcnYtPnJlZ19hZGRyZXNzLCA0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19ydl9zZW5kIChtZSwgUlZfUkVBRF9DTUQsIGFkZHJfZGF0YSwgbGVuKTsKKyAgICAgIGh3X3J2X2hhbmRsZV9pbmNvbWluZyAobWUsIFJWX1JFQURfQ01ELCBhZGRyX2RhdGEsICZsZW4pOworICAgIH0KKworICBpZiAobGVuICE9IDgpCisgICAgaHdfYWJvcnQgKG1lLCAicmVhZCAlZCAhPSA4IGJ5dGVzIHJldHVybmVkIiwgbGVuKTsKKyAgSFdfVFJBQ0UgKChtZSwgIjo9IDB4JTAyeCUwMnglMDJ4JTAyeCIsCisJICAgICBhZGRyX2RhdGFbN10sIGFkZHJfZGF0YVs2XSwgYWRkcl9kYXRhWzVdLCBhZGRyX2RhdGFbNF0pKTsKKyAgbWVtY3B5IChkZXN0LCBhZGRyX2RhdGEgKyA0LCA0KTsKKyAgcmV0dXJuIG5yX2J5dGVzOworfQorCisvKiBMb2NhbCBydiBtYm94IHJlcXVlc3RzIChoYW5kbGUgb3IgcHV0KSBlbmQgdXAgaGVyZS4gICovCisKK3N0YXRpYyB2b2lkCitod19ydl9tYm94IChzdHJ1Y3QgaHcgKm1lLCB1bnNpZ25lZF93b3JkIGFkZHJlc3MpCit7CisgIHVuc2lnbmVkOCBidWZbMjU2KzNdOworICB1bnNpZ25lZCBpbnQgY21kOworICB1bnNpZ25lZCBpbnQgcmxlbjsKKyAgdW5zaWduZWQzMiBpOworICB1bnNpZ25lZCBpbnQgbGVuCisgICAgPSBod19kbWFfcmVhZF9idWZmZXIgKG1lLCBidWYsIDAsIGFkZHJlc3MsIDMpOworCisgIGlmIChsZW4gIT0gMykKKyAgICBod19hYm9ydCAobWUsICJtYm94IHJlYWQgJWQgIT0gMyBieXRlcyByZXR1cm5lZCIsIGxlbik7CisKKyAgY21kID0gYnVmWzJdOworICBpZiAoY21kICE9IFJWX01CT1hfSEFORExFX0NNRCAmJiBjbWQgIT0gUlZfTUJPWF9QVVRfQ01EKQorICAgIGh3X2Fib3J0IChtZSwgInVuc3VwcG9ydGVkIG1ib3ggY29tbWFuZCAlZCIsIGNtZCk7CisKKyAgbGVuID0gYnVmWzBdICsgYnVmWzFdKjI1NjsKKworICBpZiAobGVuID4gc2l6ZW9mIChidWYpKQorICAgIGh3X2Fib3J0IChtZSwgIm1ib3ggY21kICVkIHNlbmQgc2l6ZSAlZCB1bnN1cHBvcnRlZCIsIGNtZCwgbGVuKTsKKworICBybGVuID0gaHdfZG1hX3JlYWRfYnVmZmVyIChtZSwgYnVmICsgMywgMCwgYWRkcmVzcyArIDMsIGxlbiAtIDMpOworICBpZiAocmxlbiAhPSBsZW4gLSAzKQorICAgIGh3X2Fib3J0IChtZSwgIm1ib3ggcmVhZCAlZCAhPSAlZCBieXRlcyByZXR1cm5lZCIsIHJsZW4sIGxlbiAtIDMpOworCisgIEhXX1RSQUNFICgobWUsICJNQk9YICVzIDB4JXguLjB4JXgiLAorCSAgICAgY21kID09IFJWX01CT1hfSEFORExFX0NNRCA/ICJIIiA6ICJQIiwKKwkgICAgIGFkZHJlc3MsIGFkZHJlc3MgKyBsZW4gLSAxKSk7CisgIGZvciAoaSA9IDA7IGkgPCBybGVuOyBpICs9IDgpCisgICAgSFdfVFJBQ0UgKChtZSwgIjB4JXg6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCIsCisJICAgICAgIGFkZHJlc3MgKyAzICsgaSwKKwkgICAgICAgYnVmWzMraV0sIGJ1Zls0K2ldLCBidWZbNStpXSwgYnVmWzYraV0sIGJ1Zls3K2ldLCBidWZbOCtpXSwKKwkgICAgICAgYnVmWzkraV0sIGJ1ZlsxMCtpXSkpOworCisgIGxlbiAtPSAzOworICBod19ydl9zZW5kIChtZSwgY21kLCBidWYgKyAzLCBsZW4pOworCisgIC8qIE5vdGU6IGJvdGggLi4uX1BVVCBhbmQgLi4uX0hBTkRMRSBnZXQgdGhlIC4uLl9IQU5ETEUgcmVwbHkuICAqLworICBod19ydl9oYW5kbGVfaW5jb21pbmcgKG1lLCBSVl9NQk9YX0hBTkRMRV9DTUQsIGJ1ZiArIDMsICZsZW4pOworICBpZiAobGVuID4gc2l6ZW9mIChidWYpKQorICAgIGh3X2Fib3J0IChtZSwgIm1ib3ggY21kICVkIHJlY2VpdmUgc2l6ZSAlZCB1bnN1cHBvcnRlZCIsIGNtZCwgbGVuKTsKKyAgSFdfVFJBQ0UgKChtZSwgIi0+IDB4JXguLjB4JXgiLCBhZGRyZXNzLCBhZGRyZXNzICsgbGVuICsgMyAtIDEpKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA4KQorICAgIEhXX1RSQUNFICgobWUsICIweCV4OiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMngiLAorCSAgICAgICBhZGRyZXNzICsgMyArIGksCisJICAgICAgIGJ1ZlszK2ldLCBidWZbNCtpXSwgYnVmWzUraV0sIGJ1Zls2K2ldLCBidWZbNytpXSwgYnVmWzgraV0sCisJICAgICAgIGJ1Zls5K2ldLCBidWZbMTAraV0pKTsKKworICBsZW4gKz0gMzsKKyAgYnVmWzBdID0gbGVuICYgMjU1OworICBidWZbMV0gPSBsZW4gLyAyNTY7CisgIHJsZW4gPSBod19kbWFfd3JpdGVfYnVmZmVyIChtZSwgYnVmLCAwLCBhZGRyZXNzLCBsZW4sIDApOworICBpZiAocmxlbiAhPSBsZW4pCisgICAgaHdfYWJvcnQgKG1lLCAibWJveCB3cml0ZSAlZCAhPSAlZCBieXRlcyIsIHJsZW4sIGxlbik7Cit9CisKKy8qIExvY2FsIHJ2IHJlZ2lzdGVyIHdyaXRlcyBlbmQgdXAgaGVyZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2h3X3J2X3JlZ193cml0ZSAoc3RydWN0IGh3ICptZSwKKwkJIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJIGludCBzcGFjZSwKKwkJIHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJIHVuc2lnbmVkIGludCBucl9ieXRlcykKK3sKKyAgaHdfcnZfZGV2aWNlICpydiA9IChod19ydl9kZXZpY2UgKikgaHdfZGF0YSAobWUpOworCisgIHVuc2lnbmVkOCBhZGRyX2RhdGFbOF0gPSAiIjsKKyAgdW5zaWduZWQzMiBhX2wgPSBIMkxFXzQgKGFkZHIgLSBydi0+cmVnX2FkZHJlc3MgKyBydi0+cmVtb3RlX3JlZ19hZGRyZXNzKTsKKyAgdW5zaWduZWQgaW50IGxlbiA9IDg7CisKKyAgaWYgKG5yX2J5dGVzICE9IDQpCisgICAgaHdfYWJvcnQgKG1lLCAibXVzdCBiZSBmb3VyIGJ5dGUgd3JpdGUiKTsKKworICBtZW1jcHkgKGFkZHJfZGF0YSwgJmFfbCwgNCk7CisgIG1lbWNweSAoYWRkcl9kYXRhICsgNCwgc291cmNlLCA0KTsKKworICBpZiAoYWRkciA9PSBydi0+bWJveF9hZGRyZXNzKQorICAgIHsKKyAgICAgIHVuc2lnbmVkMzIgbWJveF9hZGRyX2xlOworICAgICAgaWYgKHJ2LT5kdW1teSAhPSBOVUxMKQorCWh3X2Fib3J0IChtZSwgIm1ib3ggbm90IHN1cHBvcnRlZCBmb3IgYSBkdW1teSBpbnN0YW5jZSIpOworICAgICAgbWVtY3B5ICgmbWJveF9hZGRyX2xlLCBzb3VyY2UsIDQpOworICAgICAgaHdfcnZfbWJveCAobWUsIExFMkhfNCAobWJveF9hZGRyX2xlKSk7CisgICAgICByZXR1cm4gbnJfYnl0ZXM7CisgICAgfQorCisgIEhXX1RSQUNFICgobWUsICJSRUcgVyAweCV4IDo9IDB4JTAyeCUwMnglMDJ4JTAyeCIsIGFkZHIsCisJICAgICBhZGRyX2RhdGFbN10sIGFkZHJfZGF0YVs2XSwgYWRkcl9kYXRhWzVdLCBhZGRyX2RhdGFbNF0pKTsKKyAgaWYgKHJ2LT5kdW1teSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxlbiA9IDg7CisgICAgICBtZW1jcHkgKHJ2LT5kdW1teSArIGFkZHIgLSBydi0+cmVnX2FkZHJlc3MsIGFkZHJfZGF0YSArIDQsIDQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGh3X3J2X3NlbmQgKG1lLCBSVl9XUklURV9DTUQsIGFkZHJfZGF0YSwgbGVuKTsKKyAgICAgIGh3X3J2X2hhbmRsZV9pbmNvbWluZyAobWUsIFJWX1dSSVRFX0NNRCwgYWRkcl9kYXRhLCAmbGVuKTsKKyAgICB9CisKKyAgaWYgKGxlbiAhPSA4KQorICAgIGh3X2Fib3J0IChtZSwgInJlYWQgJWQgIT0gOCBieXRlcyByZXR1cm5lZCIsIGxlbik7CisKKyAgLyogV2UgaGFkIGFuIGFjY2VzczogdGlnaHRlbiB1cCBhbGwgc2xhY2suICAqLworICBydi0+bmV4dF9wZXJpb2QgPSAxOworCisgIHJldHVybiBucl9ieXRlczsKK30KKworLyogSW5zdGFuY2UgaW5pdGlhbGl6ZXIgZnVuY3Rpb24uICAqLworCitzdGF0aWMgdm9pZAoraHdfcnZfZmluaXNoIChzdHJ1Y3QgaHcgKm1lKQoreworICBod19ydl9kZXZpY2UgKnJ2ID0gSFdfWkFMTE9DIChtZSwgaHdfcnZfZGV2aWNlKTsKKyAgaW50IGk7CisgIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqbWVtX3Byb3A7CisgIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqZHVtbXlfcHJvcDsKKyAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICptYm94X3Byb3A7CisKKyAgc2V0X2h3X2RhdGEgKG1lLCBydik7CisKKyN1bmRlZiBSVl9HRVRfSVBST1AKKyN1bmRlZiBSVl9HRVRfUFJPUAorI2RlZmluZSBSVl9HRVRfUFJPUChULCBOLCBNLCBEKQkJCQlcCisgIGRvCQkJCQkJCVwKKyAgICB7CQkJCQkJCVwKKyAgICAgIGlmIChod19maW5kX3Byb3BlcnR5IChtZSwgTikgIT0gTlVMTCkJCVwKKwlydi0+TSA9IGh3X2ZpbmRfICMjIFQgIyMgX3Byb3BlcnR5IChtZSwgTik7CVwKKyAgICAgIGVsc2UJCQkJCQlcCisJcnYtPk0gPSAoRCk7CQkJCQlcCisgICAgfQkJCQkJCQlcCisgIHdoaWxlICgwKQorI2RlZmluZSBSVl9HRVRfSVBST1AoTiwgTSwgRCkgUlZfR0VUX1BST1AgKGludGVnZXIsIE4sIE0sIEQpCisKKyAgUlZfR0VUX1BST1AgKHN0cmluZywgImhvc3QiLCBob3N0LCAiMTI3LjAuMC4xIik7CisgIFJWX0dFVF9JUFJPUCAoInBvcnQiLCBwb3J0LCAxMDAwMCk7CisgIFJWX0dFVF9JUFJPUCAoInJlbW90ZS1yZWciLCByZW1vdGVfcmVnX2FkZHJlc3MsIDApOworICBSVl9HRVRfSVBST1AgKCJtYXgtcG9sbC10aWNrcyIsIG1heF90aWNrX3BvbGxfaW50ZXJ2YWwsIDEwMDAwKTsKKyAgUlZfR0VUX0lQUk9QICgid2F0Y2hkb2ctaW50ZXJ2YWwiLCB3YXRjaGRvZ19pbnRlcnZhbCwgMzApOworICBSVl9HRVRfSVBST1AgKCJyZW1vdGUtbWVtIiwgcmVtb3RlX21lbV9hZGRyZXNzLCAwKTsKKyAgUlZfR0VUX0lQUk9QICgibWVtLWJ1cnN0LW1hc2siLCBtZW1fYnVyc3RfbWFzaywgMHhmZmZmKTsKKyAgUlZfR0VUX0lQUk9QICgiaW50bXVsdGlwbGUiLCBpbnRtdWx0aXBsZSwgMCk7CisKKyAgc2V0X2h3X2lvX3JlYWRfYnVmZmVyIChtZSwgaHdfcnZfcmVnX3JlYWQpOworICBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyIChtZSwgaHdfcnZfcmVnX3dyaXRlKTsKKyAgc2V0X2h3X3BvcnRzIChtZSwgaHdfcnZfcG9ydHMpOworICBydi0+bmV4dF9wZXJpb2QgPSAxOworCisgIC8qIEZJWE1FOiBXZSBvbmx5IHN1cHBvcnQgemVybyBvciBvbmUgcmVnIGFuZCB6ZXJvIG9yIG9uZSBtZW0gYXJlYS4gICovCisgIGlmIChod19maW5kX3Byb3BlcnR5IChtZSwgInJlZyIpICE9IE5VTEwpCisgICAgeworICAgICAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOworICAgICAgaWYgKGh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5IChtZSwgInJlZyIsIDAsICZyZWcpKQorCXsKKwkgIHVuc2lnbmVkX3dvcmQgYXR0YWNoX2FkZHJlc3M7CisJICBpbnQgYXR0YWNoX3NwYWNlOworCSAgdW5zaWduZWQgaW50IGF0dGFjaF9zaXplOworCisJICBod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAorCQkJCQkgICAgICZyZWcuYWRkcmVzcywKKwkJCQkJICAgICAmYXR0YWNoX3NwYWNlLAorCQkJCQkgICAgICZhdHRhY2hfYWRkcmVzcywKKwkJCQkJICAgICBtZSk7CisJICBydi0+cmVnX2FkZHJlc3MgPSBhdHRhY2hfYWRkcmVzczsKKwkgIGh3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSAoaHdfcGFyZW50IChtZSksCisJCQkJICAgICAgICZyZWcuc2l6ZSwKKwkJCQkgICAgICAgJmF0dGFjaF9zaXplLCBtZSk7CisJICBydi0+cmVnX3NpemUgPSBhdHRhY2hfc2l6ZTsKKwkgIGlmICgoYXR0YWNoX2FkZHJlc3MgJiAzKSAhPSAwKQorCSAgICBod19hYm9ydCAobWUsICJyZWdpc3RlciBibG9jayBtdXN0IGJlIDQgYnl0ZSBhbGlnbmVkIik7CisJICBod19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksCisJCQkgICAgIDAsCisJCQkgICAgIGF0dGFjaF9zcGFjZSwgYXR0YWNoX2FkZHJlc3MsIGF0dGFjaF9zaXplLAorCQkJICAgICBtZSk7CisJfQorICAgICAgZWxzZQorCWh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwicmVnXCIgaGFzIHRoZSB3cm9uZyB0eXBlIik7CisgICAgfQorCisgIGR1bW15X3Byb3AgPSBod19maW5kX3Byb3BlcnR5IChtZSwgImR1bW15Iik7CisgIGlmIChkdW1teV9wcm9wICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHJ2LT5yZWdfc2l6ZSA9PSAwKQorCWh3X2Fib3J0IChtZSwgImR1bW15IGFyZ3VtZW50IHJlcXVpcmVzIGEgXCJyZWdcIiBwcm9wZXJ0eSIpOworCisgICAgICBpZiAoaHdfcHJvcGVydHlfdHlwZSAoZHVtbXlfcHJvcCkgPT0gaW50ZWdlcl9wcm9wZXJ0eSkKKwl7CisJICB1bnNpZ25lZDMyIGR1bW15ZmlsbCA9IGh3X2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eSAobWUsICJkdW1teSIpOworCSAgdW5zaWduZWQ4ICpkdW1teW1lbSA9IGh3X21hbGxvYyAobWUsIHJ2LT5yZWdfc2l6ZSk7CisJICBtZW1zZXQgKGR1bW15bWVtLCBkdW1teWZpbGwsIHJ2LT5yZWdfc2l6ZSk7CisJICBydi0+ZHVtbXkgPSBkdW1teW1lbTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY29uc3QgY2hhciAqZHVtbXlhcmcgPSBod19maW5kX3N0cmluZ19wcm9wZXJ0eSAobWUsICJkdW1teSIpOworCSAgdW5zaWduZWQ4ICpkdW1teW1lbSA9IGh3X21hbGxvYyAobWUsIHJ2LT5yZWdfc2l6ZSk7CisJICBGSUxFICpmID0gZm9wZW4gKGR1bW15YXJnLCAicmIiKTsKKworCSAgaWYgKGYgPT0gTlVMTCkKKwkgICAgaHdfYWJvcnQgKG1lLCAib3BlbmluZyBkdW1teS1maWxlIFwiJXNcIjogJXMiLAorCQkgICAgICBkdW1teWFyZywgc3RyZXJyb3IgKGVycm5vKSk7CisJICBpZiAoZnJlYWQgKGR1bW15bWVtLCAxLCBydi0+cmVnX3NpemUsIGYpICE9IHJ2LT5yZWdfc2l6ZSkKKwkgICAgaHdfYWJvcnQgKG1lLCAicmVhZGluZyBkdW1teS1maWxlIFwiJXNcIjogJXMiLAorCQkgICAgICBkdW1teWFyZywgc3RyZXJyb3IgKGVycm5vKSk7CisJICBmY2xvc2UgKGYpOworCSAgcnYtPmR1bW15ID0gZHVtbXltZW07CisJfQorICAgIH0KKworICBtYm94X3Byb3AgPSBod19maW5kX3Byb3BlcnR5IChtZSwgIm1ib3giKTsKKyAgaWYgKG1ib3hfcHJvcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChod19wcm9wZXJ0eV90eXBlIChtYm94X3Byb3ApID09IGludGVnZXJfcHJvcGVydHkpCisJeworCSAgc2lnbmVkX2NlbGwgYXR0YWNoX2FkZHJlc3Nfc2MKKwkgICAgPSBod19maW5kX2ludGVnZXJfcHJvcGVydHkgKG1lLCAibWJveCIpOworCisJICBydi0+bWJveF9hZGRyZXNzID0gKHVuc2lnbmVkMzIpIGF0dGFjaF9hZGRyZXNzX3NjOworCSAgaHdfYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAorCQkJICAgICAwLAorCQkJICAgICAwLCAodW5zaWduZWQzMikgYXR0YWNoX2FkZHJlc3Nfc2MsIDQsIG1lKTsKKwl9CisgICAgICBlbHNlCisJaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCJtYm94XCIgaGFzIHRoZSB3cm9uZyB0eXBlIik7CisgICAgfQorCisgIG1lbV9wcm9wID0gaHdfZmluZF9wcm9wZXJ0eSAobWUsICJtZW0iKTsKKyAgaWYgKG1lbV9wcm9wICE9IE5VTEwpCisgICAgeworICAgICAgc2lnbmVkX2NlbGwgYXR0YWNoX2FkZHJlc3Nfc2M7CisgICAgICBzaWduZWRfY2VsbCBhdHRhY2hfc2l6ZV9zYzsKKworICAgICAgLyogT25seSBzcGVjaWZpYyBuYW1lcyBhcmUgcmVnX2FycmF5X3Byb3BlcnRpZXMsIHRoZSByZXN0IGFyZQorCSBhcnJheV9wcm9wZXJ0aWVzLiAgKi8KKyAgICAgIGlmIChod19wcm9wZXJ0eV90eXBlIChtZW1fcHJvcCkgPT0gYXJyYXlfcHJvcGVydHkKKwkgICYmIGh3X3Byb3BlcnR5X3NpemVvZl9hcnJheSAobWVtX3Byb3ApID09IDIgKiBzaXplb2YgKGF0dGFjaF9hZGRyZXNzX3NjKQorCSAgJiYgaHdfZmluZF9pbnRlZ2VyX2FycmF5X3Byb3BlcnR5IChtZSwgIm1lbSIsIDAsICZhdHRhY2hfYWRkcmVzc19zYykKKwkgICYmIGh3X2ZpbmRfaW50ZWdlcl9hcnJheV9wcm9wZXJ0eSAobWUsICJtZW0iLCAxLCAmYXR0YWNoX3NpemVfc2MpKQorCXsKKwkgIC8qIFVuZm9ydHVuYXRlIGNob2ljZSBvZiB0eXBlcyBmb3JjZXMgdXMgdG8gZGFuY2UgYXJvdW5kIGEgYml0LiAgKi8KKwkgIHJ2LT5tZW1fYWRkcmVzcyA9ICh1bnNpZ25lZDMyKSBhdHRhY2hfYWRkcmVzc19zYzsKKwkgIHJ2LT5tZW1fc2l6ZSA9ICh1bnNpZ25lZDMyKSBhdHRhY2hfc2l6ZV9zYzsKKwkgIGlmICgoYXR0YWNoX2FkZHJlc3Nfc2MgJiAzKSAhPSAwKQorCSAgICBod19hYm9ydCAobWUsICJtZW1vcnkgYmxvY2sgbXVzdCBiZSA0IGJ5dGUgYWxpZ25lZCIpOworCX0KKyAgICAgIGVsc2UKKwlod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIm1lbVwiIGhhcyB0aGUgd3JvbmcgdHlwZSIpOworICAgIH0KKworICBod19ydl9tYXBfaW50cyAobWUpOworCisgIGh3X3J2X2luaXRfc29ja2V0IChtZSk7CisKKyAgLyogV2UgbmVlZCBhbiBleHRyYSBpbml0aWFsaXphdGlvbiBwYXNzLCBhZnRlciBhbGwgb3RoZXJzIGN1cnJlbnRseQorICAgICBzY2hlZHVsZWQgKG1vc3RseSwgYWZ0ZXIgdGhlIHNpbXVsYXRpb24gZXZlbnRzIG1hY2hpbmVyeSBoYXMgYmVlbgorICAgICBpbml0aWFsaXplZCBzbyB0aGUgZXZlbnRzIHdlIHdhbnQgZG9uJ3QgZ2V0IHRocm93biBvdXQpLiAgKi8KKyAgaHdfcnZfYWRkX2luaXQgKG1lKTsKK30KKworLyogT3VyIHJvb3Qgc3RydWN0dXJlOyBzZWUgZHYtKiBidWlsZCBtYWNoaW5lcnkgZm9yIHVzYWdlLiAgKi8KKworY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfcnZfZGVzY3JpcHRvcltdID0geworICB7IFJWX0ZBTUlMWV9OQU1FLCBod19ydl9maW5pc2ggfSwKKyAgeyBOVUxMIH0KK307CmRpZmYgLS1naXQgYS9zaW0vY3Jpcy9ydmR1bW15LmMgYi9zaW0vY3Jpcy9ydmR1bW15LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzZWRkYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jcmlzL3J2ZHVtbXkuYwpAQCAtMCwwICsxLDUzNiBAQAorLyogVGVzdC1kcml2ZXIgZm9yIHRoZSByZW1vdGUtdmlydHVhbC1jb21wb25lbnQgc2ltdWxhdG9yIGZyYW1ld29yaworICAgZm9yIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KKworICAgQ29weXJpZ2h0IDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEF2b2lkIGFueSBwcm9ibGVtcyB3aGF0c29ldmVyIGJ1aWxkaW5nIHRoaXMgcHJvZ3JhbSBpZiB3ZSdyZSBub3QKKyAgIGFsc28gYnVpbGRpbmcgaGFyZHdhcmUgc3VwcG9ydC4gICovCisKKyNpZiAhV0lUSF9IVworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICByZXR1cm4gMjsKK30KKyNlbHNlCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY2NvbmZpZy5oIgorI2luY2x1ZGUgInRjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKy8qIE5vdCBndWFyZGVkIGluIGR2LXNvY2tzZXIuYywgc28gd2h5IGhlcmUuICAqLworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworZW51bSBydl9jb21tYW5kIHsKKyAgUlZfUkVBRF9DTUQgPSAwLAorICBSVl9XUklURV9DTUQgPSAxLAorICBSVl9JUlFfQ01EID0gMiwKKyAgUlZfTUVNX1JEX0NNRCA9IDMsCisgIFJWX01FTV9XUl9DTUQgPSA0LAorICBSVl9NQk9YX0hBTkRMRV9DTUQgPSA1LAorICBSVl9NQk9YX1BVVF9DTUQgPSA2LAorICBSVl9XQVRDSERPR19DTUQgPSA3Cit9OworCitlbnVtIG9wdHMgeyBPUFRfUE9SVCA9IDEsIE9QVF9USU1FT1VULCBPUFRfVkVSQk9TRSB9OworCitzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQorICB7CisgICAgeyJwb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVF9QT1JUfSwKKyAgICB7InRpbWVvdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUX1RJTUVPVVR9LAorICAgIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRfVkVSQk9TRX0sCisgICAge05VTEwsIDAsIE5VTEwsIDB9CisgIH07CisKK2ludCBwb3J0ID0gMTAwMDA7Cit0aW1lX3QgdGltZW91dCA9IDMwMDAwOworY2hhciAqcHJvZ25hbWUgPSAiKHVua25vd24pIjsKK2ludCB2ZXJib3NlID0gMDsKKworLyogUmVxdWlyZWQgZm9yd2FyZC1kZWNsYXJhdGlvbnMuICAqLworc3RhdGljIHZvaWQgaGFuZGxlX2lucHV0X2ZpbGUgKGludCwgY2hhciAqKTsKKworLyogU2V0IHVwIGEgInNlcnZlciIgbGlzdGVuaW5nIHRvIHRoZSBwb3J0IGluIFBPUlQgZm9yIGEgcmF3IFRDUAorICAgY29ubmVjdGlvbi4gIFJldHVybiBhIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGNvbm5lY3Rpb24gb3IgLTEgb24KKyAgIGVycm9yLiAgKi8KKworaW50IHNldHVwc29ja2V0ICh2b2lkKQoreworICBpbnQgczsKKyAgc29ja2xlbl90IGxlbjsKKyAgaW50IHJldXNlID0gMTsKKyAgc3RydWN0IHNvY2thZGRyX2luIHNhX2luOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZnJvbTsKKworICBsZW4gPSBzaXplb2YgKGZyb20pOworICBtZW1zZXQgKCZmcm9tLCAwLCBsZW4pOworICBtZW1zZXQgKCZzYV9pbiwgMCwgc2l6ZW9mIChzYV9pbikpOworCisgIHMgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKHMgPCAwKQorICAgIHJldHVybiAtMTsKKworICBpZiAoc2V0c29ja29wdCAocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmcmV1c2UsIHNpemVvZiByZXVzZSkgIT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgc2FfaW4uc2luX3BvcnQgPSBodG9ucyAocG9ydCk7CisgIHNhX2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCisgIGlmIChiaW5kIChzLCAoc3RydWN0IHNvY2thZGRyICopICYgc2FfaW4sIHNpemVvZiBzYV9pbikgPCAwKQorICAgIHJldHVybiAtMTsKKworICBpZiAobGlzdGVuIChzLCAxKSA8IDApCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiBhY2NlcHQgKHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmZyb20sICZsZW4pOworfQorCisvKiBCYXNpYyBob3N0LXRvLWxpdHRsZS1lbmRpYW4gMzItYml0IHZhbHVlLiAgQ291bGQgdXNlIHRoZSBCRkQKKyAgIG1hY2hpbmVyeSwgYnV0IGxldCdzIGF2b2lkIGl0IGZvciB0aGlzIG9ubHkgZGVwZW5kZW5jeS4gICovCisKK3N0YXRpYyB2b2lkCitoMmxlMzIgKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCB2YWwpCit7CisgIGRlc3RbMF0gPSB2YWwgJiAyNTU7CisgIGRlc3RbMV0gPSAodmFsID4+IDgpICYgMjU1OworICBkZXN0WzJdID0gKHZhbCA+PiAxNikgJiAyNTU7CisgIGRlc3RbM10gPSAodmFsID4+IDI0KSAmIDI1NTsKK30KKworLyogU2VuZCBhIGJsb2Igb2YgZGF0YS4gICovCisKK3N0YXRpYyB2b2lkCitzZW5kX291dHB1dCAoaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBuYnl0ZXMpCit7CisgIHdoaWxlIChuYnl0ZXMgPiAwKQorICAgIHsKKyAgICAgIHNzaXplX3Qgd3JpdHRlbiA9IHdyaXRlIChmZCwgYnVmLCBuYnl0ZXMpOworICAgICAgaWYgKHdyaXR0ZW4gPCAwKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB3cml0ZSB0byBzb2NrZXQgZmFpbGVkOiAlc1xuIiwKKwkJICBwcm9nbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisJICBleGl0ICgyKTsKKwl9CisgICAgICBuYnl0ZXMgLT0gd3JpdHRlbjsKKyAgICB9Cit9CisKKy8qIFJlY2VpdmUgYSBibG9iIG9mIGRhdGEsIE5CWVRFUyBsYXJnZS4gIENvbXBhcmUgdG8gdGhlIGZpcnN0IE5DT01QCisgICBieXRlcyBvZiBCVUY7IGlmIG5vdCBhIG1hdGNoLCB3cml0ZSBlcnJvciBtZXNzYWdlIHRvIHN0ZGVyciBhbmQKKyAgIGV4aXQgKDIpLiAgRWxzZSBwdXQgaXQgaW4gYnVmLiAgKi8KKworc3RhdGljIHZvaWQKK2V4cGVjdF9pbnB1dCAoaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBuYnl0ZXMsIGludCBuY29tcCkKK3sKKyAgdW5zaWduZWQgY2hhciBieXQ7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuYnl0ZXM7IGkrKykKKyAgICB7CisgICAgICBpbnQgcjsKKworICAgICAgZG8KKwl7CisJICBlcnJubyA9IDA7CisJICByID0gcmVhZCAoZmQsICZieXQsIDEpOworCX0KKyAgICAgIHdoaWxlIChyIDw9IDAgJiYgKHIgPT0gMCB8fCBlcnJubyA9PSBFQUdBSU4pKTsKKworICAgICAgaWYgKHIgIT0gMSkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICIlczogcmVhZCBmcm9tIHNvY2tldCBmYWlsZWQ6ICVzIiwKKwkJICBwcm9nbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisJICBleGl0ICgyKTsKKwl9CisKKyAgICAgIGlmIChpIDwgbmNvbXAgJiYgYnl0ICE9IGJ1ZltpXSkKKwl7CisJICBpbnQgajsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmV4cGVjdGVkIGlucHV0LFxuICIsIHByb2duYW1lKTsKKwkgIGlmIChpID09IDApCisJICAgIGZwcmludGYgKHN0ZGVyciwgIm5vdGhpbmcsIik7CisJICBlbHNlCisJICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJTAyeCIsIGJ1ZltqXSk7CisJICBmcHJpbnRmIChzdGRlcnIsICJcbnRoZW4gJTAyeCBpbnN0ZWFkIG9mICUwMnhcbiIsIGJ5dCwgYnVmW2ldKTsKKwkgIGV4aXQgKDIpOworCX0KKyAgICAgIGVsc2UKKwlidWZbaV0gPSBieXQ7CisgICAgfQorfQorCisvKiBIYW5kbGUgZXZlcnl0aGluZyBhYm91dCBhIG5pbC10ZXJtaW5hdGVkIGxpbmUgb2YgaW5wdXQuCisgICBDYWxsIGV4aXQgKDIpIG9uIGVycm9yIHdpdGggZXJyb3IgdGV4dCBvbiBzdGRlcnIuICAqLworCitzdGF0aWMgdm9pZAoraGFuZGxlX2lucHV0IChpbnQgZmQsIGNoYXIgKmJ1ZiwgY2hhciAqZm5hbWUsIGludCBsaW5lbm8pCit7CisgIGludCBuYnl0ZXMgPSAwOworICBpbnQgbiA9IC0xOworICBjaGFyICpzID0gYnVmICsgMjsKKyAgdW5zaWduZWQgaW50IGRhdGE7CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ5dGVzWzEwMjRdOworICBpbnQgaTsKKworICBtZW1zZXQgKGJ5dGVzLCAwLCBzaXplb2YgYnl0ZXMpOworICBsaW5lbm8rKzsKKworICBpZiAoYnVmWzFdICE9ICcsJykKKyAgICBnb3RvIHN5bnRheF9lcnJvcjsKKworICBzd2l0Y2ggKGJ1ZlswXSkKKyAgICB7CisgICAgICAvKiBDb21tZW50IGNoYXJhY3RlcnMgYW5kIGVtcHR5IGxpbmVzLiAgKi8KKyAgICBjYXNlIDA6IGNhc2UgJyEnOiBjYXNlICcjJzoKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBJbmNsdWRlIGFub3RoZXIgZmlsZS4gICovCisgICAgY2FzZSAnQCc6CisgICAgICBoYW5kbGVfaW5wdXRfZmlsZSAoZmQsIHMpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFJhdyBpbnB1dCAodG8gYmUgZXhwZWN0ZWQpLiAgKi8KKyAgICBjYXNlICdpJzoKKyAgICAgIGRvCisJeworCSAgbiA9IC0xOworCSAgc3NjYW5mIChzLCAiJTAyeCVuIiwgJmRhdGEsICZuKTsKKwkgIHMgKz0gbjsKKwkgIGlmIChuID4gMCkKKwkgICAgYnl0ZXNbbmJ5dGVzKytdID0gZGF0YTsKKwl9CisgICAgICB3aGlsZSAobiA+IDApOworICAgICAgZXhwZWN0X2lucHV0IChmZCwgYnl0ZXMsIG5ieXRlcywgbmJ5dGVzKTsKKyAgICAgIGlmICh2ZXJib3NlKQorCXsKKwkgIHByaW50ZiAoImksIik7CisJICBmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspCisJICAgIHByaW50ZiAoIiUwMngiLCBieXRlc1tpXSk7CisJICBwcmludGYgKCJcbiIpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBSYXcgb3V0cHV0ICh0byBiZSB3cml0dGVuKS4gICovCisgICAgY2FzZSAnbyc6CisgICAgICBkbworCXsKKwkgIG4gPSAtMTsKKwkgIHNzY2FuZiAocywgIiUwMnglbiIsICZkYXRhLCAmbik7CisJICBpZiAobiA+IDApCisJICAgIHsKKwkgICAgICBzICs9IG47CisJICAgICAgYnl0ZXNbbmJ5dGVzKytdID0gZGF0YTsKKwkgICAgfQorCX0KKyAgICAgIHdoaWxlIChuID4gMCk7CisgICAgICBpZiAoKnMgIT0gMCkKKwlnb3RvIHN5bnRheF9lcnJvcjsKKyAgICAgIHNlbmRfb3V0cHV0IChmZCwgYnl0ZXMsIG5ieXRlcyk7CisgICAgICBpZiAodmVyYm9zZSkKKwl7CisJICBwcmludGYgKCJvLCIpOworCSAgZm9yIChpID0gMDsgaSA8IG5ieXRlczsgaSsrKQorCSAgICBwcmludGYgKCIlMDJ4IiwgYnl0ZXNbaV0pOworCSAgcHJpbnRmICgiXG4iKTsKKwl9CisgICAgICBicmVhazsKKworICAgICAgLyogUmVhZCBhIHJlZ2lzdGVyLiAgKi8KKyAgICBjYXNlICdyJzoKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwlzc2NhbmYgKHMsICIleCwleCVuIiwgJmFkZHIsICZkYXRhLCAmbik7CisJaWYgKG4gPCAwIHx8IHNbbl0gIT0gMCkKKwkgIGdvdG8gc3ludGF4X2Vycm9yOworCWJ5dGVzWzBdID0gMTE7CisJYnl0ZXNbMV0gPSAwOworCWJ5dGVzWzJdID0gUlZfUkVBRF9DTUQ7CisJaDJsZTMyIChieXRlcyArIDMsIGFkZHIpOworCWV4cGVjdF9pbnB1dCAoZmQsIGJ5dGVzLCAxMSwgNyk7CisJaDJsZTMyIChieXRlcyArIDcsIGRhdGEpOworCXNlbmRfb3V0cHV0IChmZCwgYnl0ZXMsIDExKTsKKwlpZiAodmVyYm9zZSkKKwkgIHByaW50ZiAoInIsJXgsJXhcbiIsIGFkZHIsIGRhdGEpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFdyaXRlIGEgcmVnaXN0ZXIuICAqLworICAgIGNhc2UgJ3cnOgorICAgICAgeworCXVuc2lnbmVkIGludCBhZGRyOworCXNzY2FuZiAocywgIiV4LCV4JW4iLCAmYWRkciwgJmRhdGEsICZuKTsKKwlpZiAobiA8IDAgfHwgc1tuXSAhPSAwKQorCSAgZ290byBzeW50YXhfZXJyb3I7CisJYnl0ZXNbMF0gPSAxMTsKKwlieXRlc1sxXSA9IDA7CisJYnl0ZXNbMl0gPSBSVl9XUklURV9DTUQ7CisJaDJsZTMyIChieXRlcyArIDMsIGFkZHIpOworCWgybGUzMiAoYnl0ZXMgKyA3LCBkYXRhKTsKKwlleHBlY3RfaW5wdXQgKGZkLCBieXRlcywgMTEsIDExKTsKKwlzZW5kX291dHB1dCAoZmQsIGJ5dGVzLCAxMSk7CisJaWYgKHZlcmJvc2UpCisJICBwcmludGYgKCJ3LCV4LCV4XG4iLCBhZGRyLCBkYXRhKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBXYWl0IGZvciBzb21lIG1pbGxpc2Vjb25kcy4gICovCisgICAgY2FzZSAndCc6CisgICAgICB7CisJaW50IGRlbCA9IDA7CisJc3RydWN0IHRpbWV2YWwgdG87CisJc3NjYW5mIChzLCAiJWQlbiIsICZkZWwsICZuKTsKKwlpZiAobiA8IDAgfHwgc1tuXSAhPSAwIHx8IGRlbCA9PSAwKQorCSAgZ290byBzeW50YXhfZXJyb3I7CisKKwl0by50dl9zZWMgPSBkZWwgLyAxMDAwOworCXRvLnR2X3VzZWMgPSAoZGVsICUgMTAwMCkgKiAxMDAwOworCisJaWYgKHNlbGVjdCAoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJnRvKSAhPSAwKQorCSAgeworCSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogcHJvYmxlbSB3YWl0aW5nIGZvciAlZCBtczpcbiAlc1xuIiwKKwkJICAgICBwcm9nbmFtZSwgZGVsLCBzdHJlcnJvciAoZXJybm8pKTsKKwkgICAgZXhpdCAoMik7CisJICB9CisJaWYgKHZlcmJvc2UpCisJICBwcmludGYgKCJ0LCVkXG4iLCBkZWwpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEV4cGVjdCBhIHdhdGNoZG9nIGNvbW1hbmQuICAqLworICAgIGNhc2UgJ1cnOgorICAgICAgaWYgKCpzICE9IDApCisJZ290byBzeW50YXhfZXJyb3I7CisgICAgICBieXRlc1swXSA9IDM7CisgICAgICBieXRlc1sxXSA9IDA7CisgICAgICBieXRlc1syXSA9IFJWX1dBVENIRE9HX0NNRDsKKyAgICAgIGV4cGVjdF9pbnB1dCAoZmQsIGJ5dGVzLCAzLCAzKTsKKyAgICAgIGlmICh2ZXJib3NlKQorCXByaW50ZiAoIldcbiIpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNlbmQgYW4gSVJRIG5vdGlmaWNhdGlvbi4gICovCisgICAgY2FzZSAnSSc6CisgICAgICBzc2NhbmYgKHMsICIleCVuIiwgJmRhdGEsICZuKTsKKyAgICAgIGlmIChuIDwgMCB8fCBzW25dICE9IDApCisJZ290byBzeW50YXhfZXJyb3I7CisgICAgICBieXRlc1swXSA9IDc7CisgICAgICBieXRlc1sxXSA9IDA7CisgICAgICBieXRlc1syXSA9IFJWX0lSUV9DTUQ7CisgICAgICBoMmxlMzIgKGJ5dGVzICsgMywgZGF0YSk7CisgICAgICBzZW5kX291dHB1dCAoZmQsIGJ5dGVzLCA3KTsKKyAgICAgIGlmICh2ZXJib3NlKQorCXByaW50ZiAoIkksJXhcbiIsIGRhdGEpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIERNQSBzdG9yZSAodG8gQ1BVKS4gICovCisgICAgY2FzZSAncyc6CisgICAgICB7CisJdW5zaWduZWQgaW50IGFkZHI7CisJc3NjYW5mIChzLCAiJXgsJW4iLCAmYWRkciwgJm4pOworCisJaWYgKG4gPCAwIHx8IHNbbl0gPT0gMCkKKwkgIGdvdG8gc3ludGF4X2Vycm9yOworCXMgKz0gbjsKKwlkbworCSAgeworCSAgICBuID0gLTE7CisJICAgIHNzY2FuZiAocywgIiUwMnglbiIsICZkYXRhLCAmbik7CisJICAgIGlmIChuID4gMCkKKwkgICAgICB7CisJCXMgKz0gbjsKKwkJYnl0ZXNbMTEgKyBuYnl0ZXMrK10gPSBkYXRhOworCSAgICAgIH0KKwkgIH0KKwl3aGlsZSAobiA+IDApOworCisJaWYgKCpzICE9IDApCisJICBnb3RvIHN5bnRheF9lcnJvcjsKKwloMmxlMzIgKGJ5dGVzLCBuYnl0ZXMgKyAxMSk7CisJYnl0ZXNbMl0gPSBSVl9NRU1fV1JfQ01EOworCWgybGUzMiAoYnl0ZXMgKyAzLCBhZGRyKTsKKwloMmxlMzIgKGJ5dGVzICsgNywgbmJ5dGVzKTsKKwlzZW5kX291dHB1dCAoZmQsIGJ5dGVzLCBuYnl0ZXMgKyAxMSk7CisJaWYgKHZlcmJvc2UpCisJICB7CisJICAgIHByaW50ZiAoInMsJXgsIiwgYWRkcik7CisJICAgIGZvciAoaSA9IDA7IGkgPCBuYnl0ZXM7IGkrKykKKwkgICAgICBwcmludGYgKCIlMDJ4IiwgYnl0ZXNbaV0pOworCSAgICBwcmludGYgKCJcbiIpOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIERNQSBsb2FkIChmcm9tIENQVSkuICAqLworICAgIGNhc2UgJ2wnOgorICAgICAgeworCXVuc2lnbmVkIGludCBhZGRyOworCXNzY2FuZiAocywgIiV4LCVuIiwgJmFkZHIsICZuKTsKKworCWlmIChuIDwgMCB8fCBzW25dID09IDApCisJICBnb3RvIHN5bnRheF9lcnJvcjsKKwlzICs9IG47CisJZG8KKwkgIHsKKwkgICAgbiA9IC0xOworCSAgICBzc2NhbmYgKHMsICIlMDJ4JW4iLCAmZGF0YSwgJm4pOworCSAgICBpZiAobiA+IDApCisJICAgICAgeworCQlzICs9IG47CisJCWJ5dGVzWzExICsgbmJ5dGVzKytdID0gZGF0YTsKKwkgICAgICB9CisJICB9CisJd2hpbGUgKG4gPiAwKTsKKworCWlmICgqcyAhPSAwKQorCSAgZ290byBzeW50YXhfZXJyb3I7CisJaDJsZTMyIChieXRlcywgbmJ5dGVzICsgMTEpOworCWJ5dGVzWzBdID0gMTE7CisJYnl0ZXNbMV0gPSAwOworCWJ5dGVzWzJdID0gUlZfTUVNX1JEX0NNRDsKKwloMmxlMzIgKGJ5dGVzICsgMywgYWRkcik7CisJaDJsZTMyIChieXRlcyArIDcsIG5ieXRlcyk7CisJc2VuZF9vdXRwdXQgKGZkLCBieXRlcywgMTEpOworCWJ5dGVzWzBdID0gKG5ieXRlcyArIDExKSAmIDI1NTsKKwlieXRlc1sxXSA9ICgobmJ5dGVzICsgMTEpID4+IDgpICYgMjU1OworCWV4cGVjdF9pbnB1dCAoZmQsIGJ5dGVzLCBuYnl0ZXMgKyAxMSwgbmJ5dGVzICsgMTEpOworCWlmICh2ZXJib3NlKQorCSAgeworCSAgICBwcmludGYgKCJsLCV4LCIsIGFkZHIpOworCSAgICBmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspCisJICAgICAgcHJpbnRmICgiJTAyeCIsIGJ5dGVzW2ldKTsKKwkgICAgcHJpbnRmICgiXG4iKTsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgc3ludGF4X2Vycm9yOgorICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogaW52YWxpZCBjb21tYW5kIGxpbmUgaW4gJXM6JWQ6XG4gJXMiLAorCSAgICAgICBwcm9nbmFtZSwgZm5hbWUsIGxpbmVubywgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgyKTsKKyAgICB9Cit9CisKKy8qIExvb3Agb3ZlciB0aGUgY29udGVudHMgb2YgRk5BTUUsIHVzaW5nIGhhbmRsZV9pbnB1dCB0byBwYXJzZSBlYWNoIGxpbmUuCisgICBFcnJvcnMgdG8gc3RkZXJyLCBleGl0ICgyKS4gICovCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfaW5wdXRfZmlsZSAoaW50IGZkLCBjaGFyICpmbmFtZSkKK3sKKyAgc3RhdGljIGNoYXIgYnVmWzIwNDhdID0gezB9OworICBpbnQgbGluZW5vID0gMDsKKyAgRklMRSAqZiA9IGZvcGVuIChmbmFtZSwgInIiKTsKKworICBpZiAoZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBwcm9ibGVtIG9wZW5pbmcgJXM6ICVzXG4iLAorCSAgICAgICBwcm9nbmFtZSwgZm5hbWUsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMik7CisgICAgfQorCisgIC8qIExldCdzIGN1dCB0aGUgYnVmZmVyIHNob3J0LCBzbyB3ZSBhbHdheXMgZ2V0IGEgbmV3bGluZS4gICovCisgIHdoaWxlIChmZ2V0cyAoYnVmLCBzaXplb2YgKGJ1ZikgLSAxLCBmKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGJ1ZltzdHJsZW4gKGJ1ZikgLSAxXSA9IDA7CisgICAgICBsaW5lbm8rKzsKKyAgICAgIGhhbmRsZV9pbnB1dCAoZmQsIGJ1ZiwgZm5hbWUsIGxpbmVubyk7CisgICAgfQorCisgIGZjbG9zZSAoZik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IG9wdGM7CisgIGludCBmZDsKKyAgRklMRSAqZjsKKyAgaW50IGk7CisKKyAgcHJvZ25hbWUgPSBhcmd2WzBdOworICB3aGlsZSAoKG9wdGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIiIsIGxvbmdvcHRzLCBOVUxMKSkgIT0gLTEpCisgICAgc3dpdGNoIChvcHRjKQorICAgICAgeworICAgICAgY2FzZSBPUFRfUE9SVDoKKwlwb3J0ID0gYXRvaSAob3B0YXJnKTsKKwlicmVhazsKKworICAgICAgY2FzZSBPUFRfVElNRU9VVDoKKwl0aW1lb3V0ID0gKHRpbWVfdCkgYXRvaSAob3B0YXJnKTsKKwlicmVhazsKKworICAgICAgY2FzZSBPUFRfVkVSQk9TRToKKwl2ZXJib3NlID0gMTsKKwlicmVhazsKKyAgICAgIH0KKworICBmZCA9IHNldHVwc29ja2V0ICgpOworICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBwcm9ibGVtIHNldHRpbmcgdXAgdGhlIGNvbm5lY3Rpb246ICVzXG4iLAorCSAgICAgICBwcm9nbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgyKTsKKyAgICB9CisKKyAgZm9yIChpID0gb3B0aW5kOyBpIDwgYXJnYzsgaSsrKQorICAgIGhhbmRsZV9pbnB1dF9maWxlIChmZCwgYXJndltpXSk7CisKKyAgLyogRklYTUU6IG9wdGlvbi1jb250cm9sbGVkIHRlc3QgZm9yIHJlbWFpbmluZyBpbnB1dD8gICovCisgIGNsb3NlIChmZCk7CisgIHJldHVybiAxOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY3Jpcy9zaW0taWYuYyBiL3NpbS9jcmlzL3NpbS1pZi5jCmluZGV4IDUwN2JhNTcuLjg2ZDE5YjIgMTAwNjQ0Ci0tLSBhL3NpbS9jcmlzL3NpbS1pZi5jCisrKyBiL3NpbS9jcmlzL3NpbS1pZi5jCkBAIC0xLDUgKzEsNSBAQAogLyogTWFpbiBzaW11bGF0b3IgZW50cnkgcG9pbnRzIHNwZWNpZmljIHRvIHRoZSBDUklTLgotICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICAgQ29udHJpYnV0ZWQgYnkgQXhpcyBDb21tdW5pY2F0aW9ucy4KIAogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBzaW11bGF0b3JzLgpAQCAtNzgsNyArNzgsNyBAQAogc3RhdGljIGNoYXIgY3Jpc19iYXJlX2lyb24gPSAwOwogCiAvKiBXaGV0aGVyIDB4OTAwMDAwMHh4IGhhdmUgc2ltdWxhdG9yLXNwZWNpZmljIG1lYW5pbmdzLiAgKi8KLXN0YXRpYyBjaGFyIGNyaXNfaGF2ZV85MDAwMDB4eGlmID0gMDsKK2NoYXIgY3Jpc19oYXZlXzkwMDAwMHh4aWYgPSAwOwogCiAvKiBSZWNvcmRzIHNpbXVsYXRvciBkZXNjcmlwdG9yIHNvIHV0aWxpdGllcyBsaWtlIGNyaXNfZHVtcF9yZWdzIGNhbiBiZQogICAgY2FsbGVkIGZyb20gZ2RiLiAgKi8KQEAgLTUwNiw3ICs1MDYsMTUgQEAKIAltZW1zZXQgKGNwdS0+c2lnaGFuZGxlciwgMCwgc2l6ZW9mIChjcHUtPnNpZ2hhbmRsZXIpKTsKIAljcHUtPm1ha2VfdGhyZWFkX2NwdV9kYXRhID0gTlVMTDsKIAljcHUtPnRocmVhZF9jcHVfZGF0YV9zaXplID0gMDsKKyNpZiBXSVRIX0hXCisJY3B1LT5kZWxpdmVyX2ludGVycnVwdCA9IE5VTEw7CisjZW5kaWYKICAgICAgIH0KKyNpZiBXSVRIX0hXCisgICAgLyogQWx3YXlzIGJlIGN5Y2xlLWFjY3VyYXRlIGFuZCBjYWxsIGJlZm9yZS9hZnRlciBmdW5jdGlvbnMgaWYKKyAgICAgICB3aXRoLWhhcmR3YXJlLiAgKi8KKyAgICBzaW1fcHJvZmlsZV9zZXRfb3B0aW9uIChzZCwgIi1tb2RlbCIsIFBST0ZJTEVfTU9ERUxfSURYLCAib24iKTsKKyNlbmRpZgogICB9CiAKICAgLyogSW5pdGlhbGl6ZSB2YXJpb3VzIGNnZW4gdGhpbmdzIG5vdCBkb25lIGJ5IGNvbW1vbiBmcmFtZXdvcmsuCmRpZmYgLS1naXQgYS9zaW0vY3Jpcy9zaW0tbWFpbi5oIGIvc2ltL2NyaXMvc2ltLW1haW4uaAppbmRleCBiMzViOTI3Li40ODMwNDZkIDEwMDY0NAotLS0gYS9zaW0vY3Jpcy9zaW0tbWFpbi5oCisrKyBiL3NpbS9jcmlzL3NpbS1tYWluLmgKQEAgLTEsNSArMSw1IEBACiAvKiBNYWluIGhlYWRlciBmb3IgdGhlIENSSVMgc2ltdWxhdG9yLCBiYXNlZCBvbiB0aGUgbTMyciBoZWFkZXIuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICBDb250cmlidXRlZCBieSBBeGlzIENvbW11bmljYXRpb25zLgogCiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIHNpbXVsYXRvcnMuCkBAIC0xMTcsNiArMTE3LDEwIEBACiAgIGNoYXIgc2lnc3VzcGVuZGVkOwogfTsKIAordHlwZWRlZiBpbnQgKCpjcmlzX2ludGVycnVwdF9kZWxpdmVyeV9mbikgKFNJTV9DUFUgKiwKKwkJCQkJICAgZW51bSBjcmlzX2ludGVycnVwdF90eXBlLAorCQkJCQkgICB1bnNpZ25lZCBpbnQpOworCiBzdHJ1Y3QgX3NpbV9jcHUgewogICAvKiBzaW0vY29tbW9uIGNwdSBiYXNlLiAgKi8KICAgc2ltX2NwdV9iYXNlIGJhc2U7CkBAIC0xMzIsNiArMTM2LDExIEBACiAgIENSSVNfTUlTQ19QUk9GSUxFIGNyaXNfcHJldl9taXNjX3Byb2ZpbGU7CiAjZGVmaW5lIENQVV9DUklTX1BSRVZfTUlTQ19QUk9GSUxFKGNwdSkgKCYgKGNwdSktPmNyaXNfcHJldl9taXNjX3Byb2ZpbGUpCiAKKyNpZiBXSVRIX0hXCisgIGNyaXNfaW50ZXJydXB0X2RlbGl2ZXJ5X2ZuIGRlbGl2ZXJfaW50ZXJydXB0OworI2RlZmluZSBDUFVfQ1JJU19ERUxJVkVSX0lOVEVSUlVQVChjcHUpIChjcHUtPmRlbGl2ZXJfaW50ZXJydXB0KQorI2VuZGlmCisKICAgLyogU2ltdWxhdG9yIGVudmlyb25tZW50IGRhdGEuICAqLwogICBVU0kgZW5kbWVtOwogICBVU0kgZW5kYnJrOwpkaWZmIC0tZ2l0IGEvc2ltL2QxMHYvQ2hhbmdlTG9nIGIvc2ltL2QxMHYvQ2hhbmdlTG9nCmluZGV4IGIxYTViNTQuLmUyYThiYTUgMTAwNjQ0Ci0tLSBhL3NpbS9kMTB2L0NoYW5nZUxvZworKysgYi9zaW0vZDEwdi9DaGFuZ2VMb2cKQEAgLTEsMyArMSw3IEBACisyMDA2LTA0LTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0ByZWRoYXQuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX3N0b3BfcmVhc29uKTogRml4IHR5cG8uCisKIDIwMDUtMTEtMjggIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+CiAKIAkqIGludGVycC5jIChnZGIvc2lnbmFscy5oKTogSW5jbHVkZSBpdC4KZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2ludGVycC5jIGIvc2ltL2QxMHYvaW50ZXJwLmMKaW5kZXggMjZmMzZlYy4uOWNhZWM0MSAxMDA2NDQKLS0tIGEvc2ltL2QxMHYvaW50ZXJwLmMKKysrIGIvc2ltL2QxMHYvaW50ZXJwLmMKQEAgLTEyNzgsNyArMTI3OCw3IEBACiAKICAgICBjYXNlIFNJR19EMTBWX0JVUzoKICAgICAgICpyZWFzb24gPSBzaW1fc3RvcHBlZDsKLSAgICAgICpyZXNvbiA9IFRBUkdFVF9TSUdOQUxfQlVTOworICAgICAgKnNpZ3JjID0gVEFSR0VUX1NJR05BTF9CVVM7CiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6CQkJCS8qIHNvbWUgc2lnbmFsICovCmRpZmYgLS1naXQgYS9zaW0vbWlwcy9DaGFuZ2VMb2cgYi9zaW0vbWlwcy9DaGFuZ2VMb2cKaW5kZXggNjViOGZhZS4uZTNjMjI4MyAxMDA2NDQKLS0tIGEvc2ltL21pcHMvQ2hhbmdlTG9nCisrKyBiL3NpbS9taXBzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDggQEAKKzIwMDYtMDQtMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQHJlZGhhdC5jb20+CisKKwkqIGR2LXR4MzkwNHRtci5jIChkZWxpdmVyX3R4MzkwNHRtcl90aWNrKTogQWRkIG1pc3NpbmcgYnJlYWsKKwlzdGF0ZW1lbnQuCisKIDIwMDYtMDMtMjkgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuY29tPgogCiAJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCmRpZmYgLS1naXQgYS9zaW0vbWlwcy9kdi10eDM5MDR0bXIuYyBiL3NpbS9taXBzL2R2LXR4MzkwNHRtci5jCmluZGV4IGMxYzdiOGMuLjg5ZTA2MjUgMTAwNjQ0Ci0tLSBhL3NpbS9taXBzL2R2LXR4MzkwNHRtci5jCisrKyBiL3NpbS9taXBzL2R2LXR4MzkwNHRtci5jCkBAIC02NzUsNiArNjc1LDcgQEAKIAogCWNhc2UgMzogLyogZGlzYWJsZWQgKi8KIAlkZWZhdWx0OgorCSAgYnJlYWs7CiAJfQogCiAgICAgICAvKiB1cGRhdGUgY291bnRlciBhbmQgcmVwb3J0ICovCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL0NoYW5nZUxvZyBiL3NpbS90ZXN0c3VpdGUvQ2hhbmdlTG9nCmluZGV4IDA2YzI3YzIuLjA2MWI0NWQgMTAwNjQ0Ci0tLSBhL3NpbS90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyBiL3NpbS90ZXN0c3VpdGUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMDYtMDQtMDggIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuY29tPgorCisJKiBzaW0vY3Jpcy9ody9ydi1uLWNyaXMvaXJxNi5tczogTmV3IHRlc3QuCisKKzIwMDYtMDQtMDMgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuY29tPgorCisJKiBzaW0vY3Jpcy9odzogTmV3IGRpcmVjdG9yeSBmb3Igc3ViZGlyZWN0b3JpZXMgd2l0aCB0ZXN0cy4KKwkqIHNpbS9jcmlzL2h3L3J2LW4tY3JpczogTmV3IGRpcmVjdG9yeSB3aXRoIHRlc3RzLgorCisyMDA2LTA0LTAyICBIYW5zLVBldGVyIE5pbHNzb24gIDxocEBheGlzLmNvbT4KKworCSogc2ltL2NyaXMvYXNtL3Rlc3R1dGlscy5pbmMgKHRlc3RfaF9tZW0pOiBVc2UgcmVnaXN0ZXIgcHJlZml4LgorCSh0ZXN0cl9oX2RyLCB0ZXN0X2hfZHIsIGxkbWVtX2hfZ3IsIG12cl9oX21lbSk6IERpdHRvLiAgQ29ycmVjdAorCXN5bnRheC4KKworCSogc2ltL2NyaXMvYXNtL3gwLXYxMC5tcywgc2ltL2NyaXMvYXNtL3gwLXYzMi5tczogV2lkZW4gcmVnZXhwIGZvcgorCXN0YWNrIHBvaW50ZXIgdmFsdWVzLgorCiAyMDA2LTAyLTIzICBIYW5zLVBldGVyIE5pbHNzb24gIDxocEBheGlzLmNvbT4KIAogCSogc2ltL2NyaXMvYy90aW1lMi5jOiBOZXcgdGVzdC4KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvYXNtL3Rlc3R1dGlscy5pbmMgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2FzbS90ZXN0dXRpbHMuaW5jCmluZGV4IDA2ZTYzYzUuLjQ1N2Q1ODEgMTAwNjQ0Ci0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvYXNtL3Rlc3R1dGlscy5pbmMKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9hc20vdGVzdHV0aWxzLmluYwpAQCAtODksNyArODksOCBAQAogCiA7IFN0b3JlIGEgcmVnaXN0ZXIgaW50byBhIHdvcmQgaW4gbWVtb3J5CiAJLm1hY3JvIG12cl9oX21lbSByZWcgYWRkcgotCW1vdmUuZCBccmVnLEBcYWRkcgorCW1vdmUuZCBcYWRkciwkcjEzCisJbW92ZS5kIFxyZWcsWyRyMTNdCiAJLmVuZG0KIAogOyBTdG9yZSB0aGUgY3VycmVudCBwcyBvbiB0aGUgc3RhY2sKQEAgLTEwNCw3ICsxMDUsOCBAQAogCiA7IExvYWQgYSB3b3JkIHZhbHVlIGZyb20gbWVtb3J5CiAJLm1hY3JvIGxkbWVtX2hfZ3IgYWRkciByZWcKLQltb3ZlLmQgQFxhZGRyLFxyZWcKKwltb3ZlLmQgXGFkZHIsJHIxMworCW1vdmUuZCBbJHIxM10sXHJlZwogCS5lbmRtCiAKIDsgQWRkIDIgZ2VuZXJhbCByZWdpc3RlcnMKQEAgLTEzNywyMCArMTM5LDIwIEBACiAKIDsgVGVzdCB0aGUgdmFsdWUgb2YgYW4gaW1tZWRpYXRlIGFnYWluc3QgYSBkZWRpY2F0ZWQgcmVnaXN0ZXIKIAkubWFjcm8gdGVzdF9oX2RyIHZhbCByZWcKLQltb3ZlLmQgXHJlZyxyMTIKLQl0ZXN0X2hfZ3IgXHZhbCByMTIKKwltb3ZlIFxyZWcsJHIxMgorCXRlc3RfaF9nciBcdmFsICRyMTIKIAkuZW5kbQogCiA7IFRlc3QgdGhlIHZhbHVlIG9mIGFuIGdlbmVyYWwgcmVnaXN0ZXIgYWdhaW5zdCBhIGRlZGljYXRlZCByZWdpc3RlcgogCS5tYWNybyB0ZXN0cl9oX2RyIGdyIGRyCi0JbW92ZS5kIFxkcixyMTIKLQl0ZXN0cl9oX2dyIFxnciByMTIKKwltb3ZlIFxkciwkcjEyCisJdGVzdHJfaF9nciBcZ3IgJHIxMgogCS5lbmRtCiAKIDsgQ29tcGFyZSBhbiBpbW1lZGlhdGUgd2l0aCB3b3JkIGluIG1lbW9yeQogCS5tYWNybyB0ZXN0X2hfbWVtIHZhbCBhZGRyCi0JbGRtZW1faF9nciBcYWRkciByMTIKLQl0ZXN0X2hfZ3IgXHZhbCByMTIKKwlsZG1lbV9oX2dyIFxhZGRyICRyMTIKKwl0ZXN0X2hfZ3IgXHZhbCAkcjEyCiAJLmVuZG0KIAogOyBDb21wYXJlIGEgZ2VuZXJhbCByZWdpc3RlciB3aXRoIHdvcmQgaW4gbWVtb3J5CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2FzbS94MC12MTAubXMgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2FzbS94MC12MTAubXMKaW5kZXggNGVhZDczZS4uZDhmYTEwOSAxMDA2NDQKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9hc20veDAtdjEwLm1zCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvYXNtL3gwLXYxMC5tcwpAQCAtMSw3ICsxLDcgQEAKICNtYWNoOiBjcmlzdjEwCiAjbGQ6IC0tc2VjdGlvbi1zdGFydD0udGV4dD0wCi0jb3V0cHV0OiAyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzZGZmZltjZGVdWzAtOWEtZl1bMC05YS1mXSBpeG56dmMgMFxuCi0jb3V0cHV0OiA0IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzZGZmZltjZGVdWzAtOWEtZl1bMC05YS1mXSBpeG56dmMgMVxuCisjb3V0cHV0OiAyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzZGZmZltjLWZdWzAtOWEtZl1bMC05YS1mXSBpeG56dmMgMFxuCisjb3V0cHV0OiA0IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzZGZmZltjLWZdWzAtOWEtZl1bMC05YS1mXSBpeG56dmMgMVxuCiAjc2ltOiAtLWNyaXMtdHJhY2U9YmFzaWMKIAogIC5pbmNsdWRlICJicmVhay5tcyIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvYXNtL3gwLXYzMi5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvYXNtL3gwLXYzMi5tcwppbmRleCBhNzA3ZjZkLi43YWFmYTYyIDEwMDY0NAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2FzbS94MC12MzIubXMKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9hc20veDAtdjMyLm1zCkBAIC0xLDcgKzEsNyBAQAogI21hY2g6IGNyaXN2MzIKICNsZDogLS1zZWN0aW9uLXN0YXJ0PS50ZXh0PTAKLSNvdXRwdXQ6IDIgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDNkZmZmW2NkZV1bMC05YS1mXVswLTlhLWZdIGl4bnp2YyAwIDBcbgotI291dHB1dDogNCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgM2RmZmZbY2RlXVswLTlhLWZdWzAtOWEtZl0gaXhuenZjIDEgMFxuCisjb3V0cHV0OiAyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzZGZmZltjLWZdWzAtOWEtZl1bMC05YS1mXSBpeG56dmMgMCAwXG4KKyNvdXRwdXQ6IDQgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDNkZmZmW2MtZl1bMC05YS1mXVswLTlhLWZdIGl4bnp2YyAxIDBcbgogI3NpbTogLS1jcmlzLXRyYWNlPWJhc2ljCiAKICAuaW5jbHVkZSAiYnJlYWsubXMiCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9ob3N0MS5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL2hvc3QxLm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWY1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9ob3N0MS5tcwpAQCAtMCwwICsxLDggQEAKKyNtYWNoOiBjcmlzdjMyCisjc2ltKGNyaXN2MzIpOiAtLWh3LWRldmljZSAiL3J2L2hvc3QgbG9jYWxob3N0IgorCisjIENoZWNrIHRoYXQgd2UgdHJpdmlhbGx5IHJlc29sdmUgYSBob3N0bmFtZS4KKworI3IgQCxAc3JjZGlyQC90cml2aWFsNC5yCisKKyAuaW5jbHVkZSAidHJpdmlhbDQubXMiCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9pcnExLm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvaXJxMS5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2U2ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvaXJxMS5tcwpAQCAtMCwwICsxLDY5IEBACisjbWFjaDogY3Jpc3YxMCBjcmlzdjMyCisjc2ltKGNyaXN2MTApOiAtLWh3LWRldmljZSAiL3J2L3RyYWNlPyB0cnVlIgorI3NpbShjcmlzdjMyKTogLS1ody1kZXZpY2UgIi9ydi90cmFjZT8gdHJ1ZSIKKyNvdXRwdXQ6IC9ydjogV0RcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDMyXG4KKyNvdXRwdXQ6IC9ydjogOj0gMHhhYmNkZWYwMVxuCisjb3V0cHV0OiAvcnY6IElSUSAweDRcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDM2XG4KKyNvdXRwdXQ6IC9ydjogOj0gMHg3NjU0MzIxMFxuCisjb3V0cHV0OiAvcnY6IFJFRyBSIDB4ZDAwMDAwMzZcbgorI291dHB1dDogL3J2OiA6PSAweDc2NTQzMjExXG4KKyNvdXRwdXQ6IC9ydjogUkVHIFIgMHhkMDAwMDAzMFxuCisjb3V0cHV0OiAvcnY6IElSUSAweDBcbgorI291dHB1dDogL3J2OiA6PSAweGVlZmY0NDU1XG4KKyNvdXRwdXQ6IHBhc3NcbgorCisjIFRyaXZpYWwgdGVzdCBvZiBpbnRlcnJ1cHRzLgorIyBMb2NhdGlvbnMgb2YgSVJRIG5vdGlmaWVycyBhYm92ZSBkZXBlbmQgb24gd2hlbiB0aGUgc2ltdWxhdG9yIGlzCisjIHBvbGxlZDsgYWRqdXN0bWVudHMgbWF5IGJlIG5lZWRlZCAoYWZ0ZXIgY2hlY2tpbmcgdGhhdCBubyBwb2xsIGlzCisjIGdvbmUgZHVlIHRvIGEgYnVnISkKKworI3IgVywKKyNyIHIsYTg4MzIsYWJjZGVmMDEKKyNyIEksNAorI3IgcixhODgzNiw3NjU0MzIxMAorI3IgcixhODgzNiw3NjU0MzIxMQorI3IgSSwwCisjciByLGE4ODMwLGVlZmY0NDU1CisKKyAubGNvbW0gZHVtbXksNAorCisgLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisgc3RhcnQKKyAuaWYgLi5hc20uYXJjaC5jcmlzLnYzMgorIG1vdmUgaXJxdmVjMSwkZWJwCisgLmVsc2UKKyBtb3ZlIGlycXZlYzEsJGlicgorIC5lbmRpZgorIHRlc3RfaF9tZW0gMHhhYmNkZWYwMSAweGQwMDAwMDMyCisgbm9wCisgbm9wCisgdGVzdF9oX21lbSAweDc2NTQzMjEwIDB4ZDAwMDAwMzYKKyBlaQorIHRlc3RfaF9tZW0gMCxkdW1teQord291bGRyZXR1cm5oZXJlOgorIG5vcAora2lsbG1lOgorIGZhaWwKKworcmV0dXJuaGVyZToKKyB0ZXN0X2hfbWVtIDB4NzY1NDMyMTEgMHhkMDAwMDAzNgorIHRlc3RfaF9tZW0gMHhlZWZmNDQ1NSAweGQwMDAwMDMwCisgcGFzcworCitpcnEweDMzOgorIC5pZiAuLmFzbS5hcmNoLmNyaXMudjMyCisgdGVzdF9oX2RyIHdvdWxkcmV0dXJuaGVyZSwkZXJwCisgbW92ZSByZXR1cm5oZXJlLCRlcnAKKyByZXRlCisgcmZlCisgLmVsc2UKKyBtb3ZlICRkY2NyLCRyMAorIHRlc3RfaF9kciB3b3VsZHJldHVybmhlcmUsJGlycAorIG1vdmUgcmV0dXJuaGVyZSwkaXJwCisgcmV0aQorIG1vdmUgJHIwLCRkY2NyCisgLmVuZGlmCisKKyBzaW5nbGV2ZWMgaXJxdmVjMSwweDMzLGlycTB4MzMKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL2lycTIubXMgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9pcnEyLm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NzA5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9pcnEyLm1zCkBAIC0wLDAgKzEsNDQgQEAKKyNtYWNoOiBjcmlzdjEwIGNyaXN2MzIKKyNzaW0oY3Jpc3YxMCk6IC0taHctZGV2aWNlICIvcnYvdHJhY2U/IHRydWUiIC0taHctZGV2aWNlICIvcnYvaW50bXVsdGlwbGUgMHhhYSIKKyNzaW0oY3Jpc3YzMik6IC0taHctZGV2aWNlICIvcnYvdHJhY2U/IHRydWUiIC0taHctZGV2aWNlICIvcnYvaW50bXVsdGlwbGUgMHhhYSIKKyNvdXRwdXQ6IC9ydjogV0RcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDMyXG4KKyNvdXRwdXQ6IC9ydjogOj0gMHhhYmNkZWYwMVxuCisjb3V0cHV0OiAvcnY6IElSUSAweGFhXG4KKyNvdXRwdXQ6IC9ydjogUkVHIFIgMHhkMDAwMDAzNlxuCisjb3V0cHV0OiAvcnY6IDo9IDB4NzY1NDMyMTBcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDMwXG4KKyNvdXRwdXQ6IC9ydjogSVJRIDB4MFxuCisjb3V0cHV0OiAvcnY6IDo9IDB4ZWVmZjQ0NTVcbgorI291dHB1dDogcGFzc1xuCisKKyMgUHJpbWFyaWx5IHRvIHRlc3QgbXVsdGlwbGUtaW50LWJpdHMgc2V0IGluIGR2LXJ2LmMuCisKKyNyIFcsCisjciByLGE4ODMyLGFiY2RlZjAxCisjciBJLDYKKyNyIHIsYTg4MzYsNzY1NDMyMTAKKyNyIEksMAorI3IgcixhODgzMCxlZWZmNDQ1NQorCisgLmxjb21tIGR1bW15LDQKKworIC5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorIHN0YXJ0CisgdGVzdF9oX21lbSAweGFiY2RlZjAxIDB4ZDAwMDAwMzIKKyAuaWYgLi5hc20uYXJjaC5jcmlzLnYzMgorIG1vdmUgaXJxdmVjMSwkZWJwCisgLmVsc2UKKyBtb3ZlIGlycXZlYzEsJGlicgorIC5lbmRpZgorIGVpCisgdGVzdF9oX21lbSAwLGR1bW15CitraWxsbWU6CisgZmFpbAorCitpcnEweGVhOgorIHRlc3RfaF9tZW0gMHg3NjU0MzIxMCAweGQwMDAwMDM2CisgdGVzdF9oX21lbSAweGVlZmY0NDU1IDB4ZDAwMDAwMzAKKyBwYXNzCisKKyBzaW5nbGV2ZWMgaXJxdmVjMSwweGVhLGlycTB4ZWEKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL2lycTMubXMgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9pcnEzLm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NmI2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9pcnEzLm1zCkBAIC0wLDAgKzEsNDYgQEAKKyNtYWNoOiBjcmlzdjEwIGNyaXN2MzIKKyNzaW0oY3Jpc3YxMCk6IC0taHctZGV2aWNlICIvcnYvdHJhY2U/IHRydWUiIC0taHctZGV2aWNlICIvcnYvaW50bXVsdGlwbGUgMHhhYSIKKyNzaW0oY3Jpc3YzMik6IC0taHctZGV2aWNlICIvcnYvdHJhY2U/IHRydWUiIC0taHctZGV2aWNlICIvcnYvaW50bXVsdGlwbGUgMHhhYSIKKyNvdXRwdXQ6IC9ydjogV0RcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDMyXG4KKyNvdXRwdXQ6IC9ydjogOj0gMHhhYmNkZWYwMVxuCisjb3V0cHV0OiAvcnY6IElSUSAweGFhXG4KKyNvdXRwdXQ6IC9ydjogSVJRIDB4YWFcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDM2XG4KKyNvdXRwdXQ6IC9ydjogOj0gMHg3NjU0MzIxMFxuCisjb3V0cHV0OiAvcnY6IFJFRyBSIDB4ZDAwMDAwMzBcbgorI291dHB1dDogL3J2OiBJUlEgMHgwXG4KKyNvdXRwdXQ6IC9ydjogOj0gMHhlZWZmNDQ1NVxuCisjb3V0cHV0OiBwYXNzXG4KKworIyBNdWNoIGxpa2UgaXJxMi5tcywgYnV0IG1vZGlmaWVkIHRvIGNoZWNrIHNhbWUtaW50LXBvcnQtdmFsdWUtdHdpY2UuCisKKyNyIFcsCisjciByLGE4ODMyLGFiY2RlZjAxCisjciBJLDYKKyNyIEksNgorI3IgcixhODgzNiw3NjU0MzIxMAorI3IgSSwwCisjciByLGE4ODMwLGVlZmY0NDU1CisKKyAubGNvbW0gZHVtbXksNAorCisgLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisgc3RhcnQKKyB0ZXN0X2hfbWVtIDB4YWJjZGVmMDEgMHhkMDAwMDAzMgorIC5pZiAuLmFzbS5hcmNoLmNyaXMudjMyCisgbW92ZSBpcnF2ZWMxLCRlYnAKKyAuZWxzZQorIG1vdmUgaXJxdmVjMSwkaWJyCisgLmVuZGlmCisgZWkKKyB0ZXN0X2hfbWVtIDAsZHVtbXkKK2tpbGxtZToKKyBmYWlsCisKK2lycTB4ZWE6CisgdGVzdF9oX21lbSAweDc2NTQzMjEwIDB4ZDAwMDAwMzYKKyB0ZXN0X2hfbWVtIDB4ZWVmZjQ0NTUgMHhkMDAwMDAzMAorIHBhc3MKKworIHNpbmdsZXZlYyBpcnF2ZWMxLDB4ZWEsaXJxMHhlYQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvaXJxNC5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL2lycTQubXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxNmI1YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL2lycTQubXMKQEAgLTAsMCArMSw0NiBAQAorI21hY2g6IGNyaXN2MTAgY3Jpc3YzMgorI3NpbShjcmlzdjEwKTogLS1ody1kZXZpY2UgIi9ydi90cmFjZT8gdHJ1ZSIgLS1ody1kZXZpY2UgIi9jcmlzL211bHRpcGxlLWludCBpZ25vcmVfcHJldmlvdXMiCisjc2ltKGNyaXN2MzIpOiAtLWh3LWRldmljZSAiL3J2L3RyYWNlPyB0cnVlIiAtLWh3LWRldmljZSAiL2NyaXMvbXVsdGlwbGUtaW50IGlnbm9yZV9wcmV2aW91cyIKKyNvdXRwdXQ6IC9ydjogV0RcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDMyXG4KKyNvdXRwdXQ6IC9ydjogOj0gMHhhYmNkZWYwMVxuCisjb3V0cHV0OiAvcnY6IElSUSAweDRcbgorI291dHB1dDogL3J2OiBJUlEgMHg4XG4KKyNvdXRwdXQ6IC9ydjogUkVHIFIgMHhkMDAwMDAzNlxuCisjb3V0cHV0OiAvcnY6IDo9IDB4NzY1NDMyMTBcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDMwXG4KKyNvdXRwdXQ6IC9ydjogSVJRIDB4MFxuCisjb3V0cHV0OiAvcnY6IDo9IDB4ZWVmZjQ0NTVcbgorI291dHB1dDogcGFzc1xuCisKKyMgTXVjaCBsaWtlIGlycTMubXMsIGJ1dCBtb2RpZmllZCB0byB0ZXN0IG11bHRpcGxlLWludCBpZ25vcmVfcHJldmlvdXMuCisKKyNyIFcsCisjciByLGE4ODMyLGFiY2RlZjAxCisjciBJLDQKKyNyIEksOAorI3IgcixhODgzNiw3NjU0MzIxMAorI3IgSSwwCisjciByLGE4ODMwLGVlZmY0NDU1CisKKyAubGNvbW0gZHVtbXksNAorCisgLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisgc3RhcnQKKyB0ZXN0X2hfbWVtIDB4YWJjZGVmMDEgMHhkMDAwMDAzMgorIC5pZiAuLmFzbS5hcmNoLmNyaXMudjMyCisgbW92ZSBpcnF2ZWMxLCRlYnAKKyAuZWxzZQorIG1vdmUgaXJxdmVjMSwkaWJyCisgLmVuZGlmCisgZWkKKyB0ZXN0X2hfbWVtIDAsZHVtbXkKK2tpbGxtZToKKyBmYWlsCisKK2lycTB4MzQ6CisgdGVzdF9oX21lbSAweDc2NTQzMjEwIDB4ZDAwMDAwMzYKKyB0ZXN0X2hfbWVtIDB4ZWVmZjQ0NTUgMHhkMDAwMDAzMAorIHBhc3MKKworIHNpbmdsZXZlYyBpcnF2ZWMxLDB4MzQsaXJxMHgzNApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvaXJxNS5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL2lycTUubXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjYzVhNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL2lycTUubXMKQEAgLTAsMCArMSw0NiBAQAorI21hY2g6IGNyaXN2MTAgY3Jpc3YzMgorI3NpbShjcmlzdjEwKTogLS1ody1kZXZpY2UgIi9ydi90cmFjZT8gdHJ1ZSIgLS1ody1kZXZpY2UgIi9jcmlzL211bHRpcGxlLWludCAweGFlIgorI3NpbShjcmlzdjMyKTogLS1ody1kZXZpY2UgIi9ydi90cmFjZT8gdHJ1ZSIgLS1ody1kZXZpY2UgIi9jcmlzL211bHRpcGxlLWludCAweGFlIgorI291dHB1dDogL3J2OiBXRFxuCisjb3V0cHV0OiAvcnY6IFJFRyBSIDB4ZDAwMDAwMzJcbgorI291dHB1dDogL3J2OiA6PSAweGFiY2RlZjAxXG4KKyNvdXRwdXQ6IC9ydjogSVJRIDB4NFxuCisjb3V0cHV0OiAvcnY6IElSUSAweDhcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDM2XG4KKyNvdXRwdXQ6IC9ydjogOj0gMHg3NjU0MzIxMFxuCisjb3V0cHV0OiAvcnY6IFJFRyBSIDB4ZDAwMDAwMzBcbgorI291dHB1dDogL3J2OiBJUlEgMHgwXG4KKyNvdXRwdXQ6IC9ydjogOj0gMHhlZWZmNDQ1NVxuCisjb3V0cHV0OiBwYXNzXG4KKworIyBNdWNoIGxpa2UgaXJxNC5tcywgYnV0IG1vZGlmaWVkIHRvIHRlc3QgdmVjdG9yIGNhc2UgZm9yIG11bHRpcGxlLWludC4KKworI3IgVywKKyNyIHIsYTg4MzIsYWJjZGVmMDEKKyNyIEksNAorI3IgSSw4CisjciByLGE4ODM2LDc2NTQzMjEwCisjciBJLDAKKyNyIHIsYTg4MzAsZWVmZjQ0NTUKKworIC5sY29tbSBkdW1teSw0CisKKyAuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKyBzdGFydAorIHRlc3RfaF9tZW0gMHhhYmNkZWYwMSAweGQwMDAwMDMyCisgLmlmIC4uYXNtLmFyY2guY3Jpcy52MzIKKyBtb3ZlIGlycXZlYzEsJGVicAorIC5lbHNlCisgbW92ZSBpcnF2ZWMxLCRpYnIKKyAuZW5kaWYKKyBlaQorIHRlc3RfaF9tZW0gMCxkdW1teQora2lsbG1lOgorIGZhaWwKKworaXJxMHhhZToKKyB0ZXN0X2hfbWVtIDB4NzY1NDMyMTAgMHhkMDAwMDAzNgorIHRlc3RfaF9tZW0gMHhlZWZmNDQ1NSAweGQwMDAwMDMwCisgcGFzcworCisgc2luZ2xldmVjIGlycXZlYzEsMHhhZSxpcnEweGFlCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9pcnE2Lm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvaXJxNi5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTQwZjRhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvaXJxNi5tcwpAQCAtMCwwICsxLDk5IEBACisjbWFjaDogY3Jpc3YxMCBjcmlzdjMyCisjc2ltKGNyaXN2MTApOiAtLWh3LWRldmljZSAiL3J2L3RyYWNlPyB0cnVlIgorI3NpbShjcmlzdjMyKTogLS1ody1kZXZpY2UgIi9ydi90cmFjZT8gdHJ1ZSIKKyNvdXRwdXQ6IC9ydjogV0RcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDMyXG4KKyNvdXRwdXQ6IC9ydjogOj0gMHhhYmNkZWYwMVxuCisjb3V0cHV0OiAvcnY6IElSUSAweDRcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDM2XG4KKyNvdXRwdXQ6IC9ydjogOj0gMHg3NjU0MzIxMFxuCisjb3V0cHV0OiAvcnY6IFJFRyBSIDB4ZDAwMDAwMzBcbgorI291dHB1dDogL3J2OiBJUlEgMHgwXG4KKyNvdXRwdXQ6IC9ydjogSVJRIDB4OFxuCisjb3V0cHV0OiAvcnY6IDo9IDB4ZWVmZjQ0NTVcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDM0XG4KKyNvdXRwdXQ6IC9ydjogOj0gMHhkZDAwMTEyMlxuCisjb3V0cHV0OiAvcnY6IFJFRyBSIDB4ZDAwMDAwMzhcbgorI291dHB1dDogL3J2OiA6PSAweGFhZWVmZjQ0XG4KKyNvdXRwdXQ6IC9ydjogUkVHIFIgMHhkMDAwMDAzY1xuCisjb3V0cHV0OiAvcnY6IDo9IDB4ZmY0NDU1MTFcbgorI291dHB1dDogcGFzc1xuCisKKyMgVGVzdCB0d28gc3VjY2Vzc2l2ZSBpbnRzOyB0aGF0IGZsYWdzIGFyZSBkaXNhYmxlZCB3aGVuIGFuIGludGVycnVwdAorIyBpcyB0YWtlbiwgYW5kIHRoZW4gYXV0b21hdGljYWxseSAob3IgYnkgcmVnaXN0ZXIgcmVzdG9yZSkgZW5hYmxlZCBhdAorIyByZXR1cm4uCisKKyNyIFcsCisjciByLGE4ODMyLGFiY2RlZjAxCisjciBJLDQKKyNyIHIsYTg4MzYsNzY1NDMyMTAKKyNyIEksMAorI3IgSSw4CisjciByLGE4ODMwLGVlZmY0NDU1CisjciByLGE4ODM0LGRkMDAxMTIyCisjciByLGE4ODM4LGFhZWVmZjQ0CisjciByLGE4ODNjLGZmNDQ1NTExCisKKyAubGNvbW0gZHVtbXksNAorCisgLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisgc3RhcnQKKyB0ZXN0X2hfbWVtIDB4YWJjZGVmMDEgMHhkMDAwMDAzMgorIG1vdmVxIC0xLCRyNAorCisgLmlmIC4uYXNtLmFyY2guY3Jpcy52MzIKKyBtb3ZlIGlycXZlYzEsJGVicAorIC5lbHNlCisgbW92ZSBpcnF2ZWMxLCRpYnIKKyAuZW5kaWYKKworIGVpCisgdGVzdF9oX21lbSAwLGR1bW15CisKKyA7IEhlcmUgYWZ0ZXIgdGhlIGZpcnN0IGludGVycnVwdCwgb3IgcGVyaGFwcyB0aGUgc2Vjb25kIGludGVycnVwdCBpcworIDsgdGFrZW4gZGlyZWN0bHk7IGxlYXZlIGl0IG9wdGlvbmFsLiAgQW55d2F5LCB0aGUgc2Vjb25kIGludGVycnVwdAorIDsgc2hvdWxkIGJlIHRha2VuIG5vIGxhdGVyIHRoYW4gdGhpcyBicmFuY2guCisgdGVzdF9oX21lbSAwLGR1bW15CisKK2tpbGxtZToKKyBmYWlsCisKK2lycTB4MzM6CisgLmlmIC4uYXNtLmFyY2guY3Jpcy52MzIKKyA7IE5vdGhpbmcgbmVlZGVkIHRvIHNhdmUgZmxhZ3MgLSAic2hpZnQiIHNob3VsZCBoYXBwZW4sIGFuZCBiYWNrIGF0IHJmZS4KKyAuZWxzZQorIDsgVGhlIG1pc3Npbmcgc2ltIHN1cHBvcnQgZm9yIGludGVycnVwdC1leGNsdWRpbmcgaW5zdHJ1Y3Rpb25zIGlzIG1hdGNoZWQKKyA7IGJ5IHRoZSBmbGF3IHRoYXQgc2ltIGRvZXNuJ3Qgc2VydmljZSBpbnRlcnJ1cHRzIGluIHN0cmFpZ2h0IGNvZGUuCisgOyBTbywgd2UgY2FuIHVzZSBhIHNlcXVlbmNlIHRoYXQgd291bGQgd29yayBvbiBhY3R1YWwgaGFyZHdhcmUuCisgbW92ZSAkZGNjciwkcjUKKyBkaQorIC5lbmRpZgorCisgdGVzdF9oX21lbSAweDc2NTQzMjEwIDB4ZDAwMDAwMzYKKyB0ZXN0X2hfbWVtIDB4ZWVmZjQ0NTUgMHhkMDAwMDAzMAorIHRlc3RfaF9tZW0gMHhkZDAwMTEyMiAweGQwMDAwMDM0CisgbW92ZXEgLTIyLCRyNAorCisgLmlmIC4uYXNtLmFyY2guY3Jpcy52MzIKKyBtb3ZlIGlycXZlYzIsJGVicAorIHJldGUKKyByZmUKKyAuZWxzZQorIG1vdmUgaXJxdmVjMiwkaWJyCisgcmV0aQorIG1vdmUgJHI1LCRkY2NyCisgLmVuZGlmCisKKyBwYXNzCisKK2lycTB4MzQ6CisgdGVzdF9oX21lbSAweGFhZWVmZjQ0IDB4ZDAwMDAwMzgKKyB0ZXN0X2hfbWVtIDB4ZmY0NDU1MTEgMHhkMDAwMDAzYworIGNtcHEgLTIyLCRyNAorIGJuZSBraWxsbWUKKyBub3AKKyBwYXNzCisKKyBzaW5nbGV2ZWMgaXJxdmVjMSwweDMzLGlycTB4MzMKKworIHNpbmdsZXZlYyBpcnF2ZWMyLDB4MzQsaXJxMHgzNApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvbWJveDEubXMgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9tYm94MS5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTBmNTRjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvbWJveDEubXMKQEAgLTAsMCArMSw4OCBAQAorI21hY2g6IGNyaXN2MTAgY3Jpc3YzMgorI3NpbShjcmlzdjEwKTogLS1ody1kZXZpY2UgIi9ydi90cmFjZT8gdHJ1ZSIKKyNzaW0oY3Jpc3YzMik6IC0taHctZGV2aWNlICIvcnYvdHJhY2U/IHRydWUiCisjb3V0cHV0OiAvcnY6IFdEXG4KKyNvdXRwdXQ6IC9ydjogTUJPWCBIIDB4MTAwMWQuLjB4MTAwMzdcbgorI291dHB1dDogL3J2OiAweDEwMDIwOiAxMiAyMyAzNCA1NiA3OSA4YSBiZCBkZVxuCisjb3V0cHV0OiAvcnY6IDB4MTAwMjg6IGZiIGFkIGJhIGRiIGFkIDU2IDc4IDlhXG4KKyNvdXRwdXQ6IC9ydjogMHgxMDAzMDogZmQgZTEgMjMgNDUgNjYgNTQgMzIgMWFcbgorI291dHB1dDogL3J2OiAtPiAweDEwMDFkLi4weDEwMDI3XG4KKyNvdXRwdXQ6IC9ydjogMHgxMDAyMDogYWEgNTUgNzcgODggMzIgMTAgZWUgY2NcbgorI291dHB1dDogL3J2OiBNQk9YIFAgMHhmZmZkLi4weDEwMDFmXG4KKyNvdXRwdXQ6IC9ydjogMHgxMDAwMDogYWEgNTUgMTIgMjMgMzQgNTYgNzkgOGFcbgorI291dHB1dDogL3J2OiAweDEwMDA4OiBiZCBkZSBmYiBhZCBiYSBkYiBhZCA1NlxuCisjb3V0cHV0OiAvcnY6IDB4MTAwMTA6IDc4IDlhIGZkIGUxIDIzIDQ1IDY2IDU0XG4KKyNvdXRwdXQ6IC9ydjogMHgxMDAxODogMzIgMWEgYWMgY2IgYmUgZWQgZGIgZWRcbgorI291dHB1dDogL3J2OiAtPiAweGZmZmQuLjB4MTAwMTdcbgorI291dHB1dDogL3J2OiAweDEwMDAwOiAxMSAyMiA1NiA3OCBlZSBkZCAxMiBhYlxuCisjb3V0cHV0OiAvcnY6IDB4MTAwMDg6IDU1IGFhIGVlIDAwIDQyIDEyIDI3IDk4XG4KKyNvdXRwdXQ6IC9ydjogMHgxMDAxMDogODggNTUgMjIgMzMgNjYgNzcgMjIgNDVcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDM4XG4KKyNvdXRwdXQ6IC9ydjogOj0gMHg3NjU0MzIxMVxuCisjb3V0cHV0OiBwYXNzXG4KKworIyBUcml2aWFsIHRlc3Qgb2YgbWFpbGJveCBjb21tYW5kcy4KKworI3IgVywKKyNyIGksMWIwMDA1MTIyMzM0NTY3OThhYmRkZWZiYWRiYWRiYWQ1Njc4OWFmZGUxMjM0NTY2NTQzMjFhCisjciBvLDBiMDAwNWFhNTU3Nzg4MzIxMGVlY2MKKyNyIGksMjMwMDA2YWE1NTEyMjMzNDU2Nzk4YWJkZGVmYmFkYmFkYmFkNTY3ODlhZmRlMTIzNDU2NjU0MzIxYWFjY2JiZWVkZGJlZAorI3IgbywxYjAwMDUxMTIyNTY3OGVlZGQxMmFiNTVhYWVlMDA0MjEyMjc5ODg4NTUyMjMzNjY3NzIyNDUKKyNyIHIsYTg4MzgsNzY1NDMyMTEKKworIC5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorIHN0YXJ0CisgbW92ZS53IDB4MWIsJHIwCisgbW92ZS5kIDB4MTAwMWQsJHIxCisgbW92ZS53ICRyMCxbJHIxK10KKyBtb3ZlcSA1LCRyMAorIG1vdmUuYiAkcjAsWyRyMV0KKyBtdmlfaF9tZW0gMHg1NjM0MjMxMiAweDEwMDIwCisgbXZpX2hfbWVtIDB4ZGViZDhhNzkgMHgxMDAyNAorIG12aV9oX21lbSAweGRiYmFhZGZiIDB4MTAwMjgKKyBtdmlfaF9tZW0gMHg5YTc4NTZhZCAweDEwMDJjCisgbXZpX2hfbWVtIDB4NDUyM2UxZmQgMHgxMDAzMAorIG12aV9oX21lbSAweDFhMzI1NDY2IDB4MTAwMzQKKworIG12aV9oX21lbSAweDEwMDFkIDB4YzAwMGYwMDAKKworIG1vdmUuZCAweDEwMDFkLCRyMAorIG1vdnUudyBbJHIwK10sJHIxCisgdGVzdF9oX2dyIDB4YiAkcjEKKyBtb3Z1LmIgWyRyMF0sJHIxCisgdGVzdF9oX2dyIDB4NSAkcjEKKyB0ZXN0X2hfbWVtIDB4ODg3NzU1YWEgMHgxMDAyMAorIHRlc3RfaF9tZW0gMHhjY2VlMTAzMiAweDEwMDI0CisKKyBtb3ZlLncgMHgyMywkcjAKKyBtb3ZlLmQgMHhmZmZkLCRyMQorIG1vdmUudyAkcjAsWyRyMStdCisgbW92ZXEgNiwkcjAKKyBtb3ZlLmIgJHIwLFskcjFdCisgbXZpX2hfbWVtIDB4MjMxMjU1YWEgMHgxMDAwMAorIG12aV9oX21lbSAweDhhNzk1NjM0IDB4MTAwMDQKKyBtdmlfaF9tZW0gMHhhZGZiZGViZCAweDEwMDA4CisgbXZpX2hfbWVtIDB4NTZhZGRiYmEgMHgxMDAwYworIG12aV9oX21lbSAweGUxZmQ5YTc4IDB4MTAwMTAKKyBtdmlfaF9tZW0gMHg1NDY2NDUyMyAweDEwMDE0CisgbXZpX2hfbWVtIDB4Y2JhYzFhMzIgMHgxMDAxOAorIG12aV9oX21lbSAweGVkZGJlZGJlIDB4MTAwMWMKKworIG12aV9oX21lbSAweGZmZmQgMHhjMDAwZjAwMAorCisgbW92ZS5kIDB4ZmZmZCwkcjAKKyBtb3Z1LncgWyRyMCtdLCRyMQorIHRlc3RfaF9nciAweDFiICRyMQorIG1vdnUuYiBbJHIwXSwkcjEKKyB0ZXN0X2hfZ3IgMHg2ICRyMQorIHRlc3RfaF9tZW0gMHg3ODU2MjIxMSAweDEwMDAwCisgdGVzdF9oX21lbSAweGFiMTJkZGVlIDB4MTAwMDQKKyB0ZXN0X2hfbWVtIDB4MDBlZWFhNTUgMHgxMDAwOAorIHRlc3RfaF9tZW0gMHg5ODI3MTI0MiAweDEwMDBjCisgdGVzdF9oX21lbSAweDMzMjI1NTg4IDB4MTAwMTAKKyB0ZXN0X2hfbWVtIDB4NDUyMjc3NjYgMHgxMDAxNAorCisgdGVzdF9oX21lbSAweDc2NTQzMjExIDB4ZDAwMDAwMzgKKyBwYXNzCisKKyAuZmlsbCA2NTUzNioyKzEyOCwxLDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL21lbTEubXMgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9tZW0xLm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWM0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9tZW0xLm1zCkBAIC0wLDAgKzEsMTAwIEBACisjbWFjaDogY3Jpc3YxMCBjcmlzdjMyCisjc2ltKGNyaXN2MTApOiAtLWh3LWRldmljZSAiL3J2L3RyYWNlPyB0cnVlIgorI3NpbShjcmlzdjMyKTogLS1ody1kZXZpY2UgIi9ydi90cmFjZT8gdHJ1ZSIKKyNvdXRwdXQ6IC9ydjogV0RcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDM2XG4KKyNvdXRwdXQ6IC9ydjogOj0gMHg3NjU0MzIxMFxuCisjb3V0cHV0OiAvcnY6IERNQSBXIDB4MjAwMjAuLjB4MjAwM2ZcbgorI291dHB1dDogL3J2OiAweDIwMDIwOiAxMiAyMyAzNCA1NlxuCisjb3V0cHV0OiAvcnY6IDB4MjAwMjQ6IDc5IDhhIGJkIGRlXG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAyODogZmIgYWQgYmEgZGJcbgorI291dHB1dDogL3J2OiAweDIwMDJjOiBhZCA1NiA3OCA5YVxuCisjb3V0cHV0OiAvcnY6IDB4MjAwMzA6IGZkIGUxIDIzIDQ1XG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAzNDogNjYgNTQgMzIgMWFcbgorI291dHB1dDogL3J2OiAweDIwMDM4OiBhYyBjYiBiZSBlZFxuCisjb3V0cHV0OiAvcnY6IDB4MjAwM2M6IGRiIGVkIGFhIGRhXG4KKyNvdXRwdXQ6IC9ydjogUkVHIFIgMHhkMDAwMDAzOFxuCisjb3V0cHV0OiAvcnY6IDo9IDB4NzY1NDMyMTFcbgorI291dHB1dDogL3J2OiBETUEgUiAweDIwMDAwLi4weDIwMDFmXG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAwMDogYWEgNTUgMTIgMjNcbgorI291dHB1dDogL3J2OiAweDIwMDA0OiAzNCA1NiA3OSA4YVxuCisjb3V0cHV0OiAvcnY6IDB4MjAwMDg6IGJkIGRlIGZiIGFkXG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAwYzogYmEgZGIgYWQgNTZcbgorI291dHB1dDogL3J2OiAweDIwMDEwOiA3OCA5YSBmZCBlMVxuCisjb3V0cHV0OiAvcnY6IDB4MjAwMTQ6IDIzIDQ1IDY2IDU0XG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAxODogMzIgMWEgYWMgY2JcbgorI291dHB1dDogL3J2OiAweDIwMDFjOiBiZSBlZCBkYiBlZFxuCisjb3V0cHV0OiAvcnY6IElSUSAweDhcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDM4XG4KKyNvdXRwdXQ6IC9ydjogOj0gMHg3NjU0MzIxMlxuCisjb3V0cHV0OiBwYXNzXG4KKworIyBUcml2aWFsIHRlc3Qgb2YgRE1BLgorCisjIExvY2F0aW9ucyBvZiBJUlEgbm90aWZpZXJzIGFib3ZlIGRlcGVuZCBvbiB3aGVuIHRoZSBzaW11bGF0b3IgaXMKKyMgcG9sbGVkOyBhZGp1c3RtZW50cyBtYXkgYmUgbmVlZGVkIChhZnRlciBjaGVja2luZyB0aGF0IG5vIHBvbGwgaXMKKyMgZ29uZSBkdWUgdG8gYSBidWchKQorCisjciBXLAorI3IgcixhODgzNiw3NjU0MzIxMAorI3IgcyxlMDIwLDEyMjMzNDU2Nzk4YWJkZGVmYmFkYmFkYmFkNTY3ODlhZmRlMTIzNDU2NjU0MzIxYWFjY2JiZWVkZGJlZGFhZGEKKyNyIHIsYTg4MzgsNzY1NDMyMTEKKyNyIGwsZTAwMCxhYTU1MTIyMzM0NTY3OThhYmRkZWZiYWRiYWRiYWQ1Njc4OWFmZGUxMjM0NTY2NTQzMjFhYWNjYmJlZWRkYmVkCisjciBJLDgKKyNyIHIsYTg4MzgsNzY1NDMyMTIKKworIC5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorIHN0YXJ0CisgdGVzdF9oX21lbSAweDc2NTQzMjEwIDB4ZDAwMDAwMzYKKworIG1vdmUuZCAweDIwMDNmLCRyMQorIG1vdmUuZCAweDEwMDAwLCRyMworMDoKKyB0ZXN0LmIgWyRyMV0KKyBibmUgMWYKKyBzdWJxIDEsJHIzCisgYm5lIDBiCisgbm9wCisKKzE6CisgdGVzdF9oX21lbSAweDU2MzQyMzEyIDB4MjAwMjAKKyB0ZXN0X2hfbWVtIDB4ZGViZDhhNzkgMHgyMDAyNAorIHRlc3RfaF9tZW0gMHhkYmJhYWRmYiAweDIwMDI4CisgdGVzdF9oX21lbSAweDlhNzg1NmFkIDB4MjAwMmMKKyB0ZXN0X2hfbWVtIDB4NDUyM2UxZmQgMHgyMDAzMAorIHRlc3RfaF9tZW0gMHgxYTMyNTQ2NiAweDIwMDM0CisgdGVzdF9oX21lbSAweGVkYmVjYmFjIDB4MjAwMzgKKyB0ZXN0X2hfbWVtIDB4ZGFhYWVkZGIgMHgyMDAzYworCisgbW92ZS5kIDB4MjAwMjAsJHIwCisgbW92ZS5kIDB4MjAwMDAsJHIxCisgbW92ZS53IDB4NTVhYSwkcjIKKyBtb3ZlLncgJHIyLFtyMStdCisgLnJlcHQgOAorIG1vdmUuZCBbJHIwK10sJHIyCisgbW92ZS5kICRyMixbJHIxK10KKyAuZW5kcgorCisgdGVzdF9oX21lbSAweDc2NTQzMjExIDB4ZDAwMDAwMzgKKworIC5pZiAuLmFzbS5hcmNoLmNyaXMudjMyCisgbW92ZSBpcnF2ZWMxLCRlYnAKKyAuZWxzZQorIG1vdmUgaXJxdmVjMSwkaWJyCisgLmVuZGlmCisgZWkKKyBtb3ZlLmQgMHgxMDAwMDAsJHI5CiswOgorIHN1YnEgMSwkcjkKKyBibmUgMGIKKyBub3AKK2tpbGxtZToKKyBmYWlsCisKK2lycTB4MzQ6CisgdGVzdF9oX21lbSAweDc2NTQzMjEyIDB4ZDAwMDAwMzgKKyBwYXNzCisKKyAuZmlsbCA2NTUzNioyKzEyOCwxLDAKKworIHNpbmdsZXZlYyBpcnF2ZWMxLDB4MzQsaXJxMHgzNApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvbWVtMi5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL21lbTIubXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3NjI0OQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL21lbTIubXMKQEAgLTAsMCArMSwxMDQgQEAKKyNtYWNoOiBjcmlzdjEwIGNyaXN2MzIKKyNzaW0oY3Jpc3YxMCk6IC0taHctZGV2aWNlICIvcnYvdHJhY2U/IHRydWUiCisjc2ltKGNyaXN2MzIpOiAtLWh3LWRldmljZSAiL3J2L3RyYWNlPyB0cnVlIgorI291dHB1dDogL3J2OiBXRFxuCisjb3V0cHV0OiAvcnY6IFJFRyBSIDB4ZDAwMDAwMzZcbgorI291dHB1dDogL3J2OiA6PSAweDc2NTQzMjEwXG4KKyNvdXRwdXQ6IC9ydjogRE1BIFcgMHgyMDAyMC4uMHgyMDA0M1xuCisjb3V0cHV0OiAvcnY6IDB4MjAwMjA6IDEyIDIzIDM0IDU2XG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAyNDogNzkgOGEgYmQgZGVcbgorI291dHB1dDogL3J2OiAweDIwMDI4OiBmYiBhZCBiYSBkYlxuCisjb3V0cHV0OiAvcnY6IDB4MjAwMmM6IGFkIDU2IDc4IDlhXG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAzMDogZmQgZTEgMjMgNDVcbgorI291dHB1dDogL3J2OiAweDIwMDM0OiA2NiA1NCAzMiAxYVxuCisjb3V0cHV0OiAvcnY6IDB4MjAwMzg6IGFjIGNiIGJlIGVkXG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAzYzogZGIgZWQgYWEgZGFcbgorI291dHB1dDogL3J2OiAweDIwMDQwOiAwMCBhYSBiYiBjY1xuCisjb3V0cHV0OiAvcnY6IFJFRyBSIDB4ZDAwMDAwMzhcbgorI291dHB1dDogL3J2OiA6PSAweDc2NTQzMjExXG4KKyNvdXRwdXQ6IC9ydjogRE1BIFIgMHgyMDAwMC4uMHgyMDAyM1xuCisjb3V0cHV0OiAvcnY6IDB4MjAwMDA6IGFhIDU1IDEyIDIzXG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAwNDogMzQgNTYgNzkgOGFcbgorI291dHB1dDogL3J2OiAweDIwMDA4OiBiZCBkZSBmYiBhZFxuCisjb3V0cHV0OiAvcnY6IDB4MjAwMGM6IGJhIGRiIGFkIDU2XG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAxMDogNzggOWEgZmQgZTFcbgorI291dHB1dDogL3J2OiAweDIwMDE0OiAyMyA0NSA2NiA1NFxuCisjb3V0cHV0OiAvcnY6IDB4MjAwMTg6IDMyIDFhIGFjIGNiXG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAxYzogYmUgZWQgZGIgZWRcbgorI291dHB1dDogL3J2OiAweDIwMDIwOiBhYSBkYSAwMCBhYVxuCisjb3V0cHV0OiAvcnY6IElSUSAweDhcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDM4XG4KKyNvdXRwdXQ6IC9ydjogOj0gMHg3NjU0MzIxMlxuCisjb3V0cHV0OiBwYXNzXG4KKworIyBUaGlzIGlzIGEgc2xpZ2h0IHZhcmlhdGlvbiBvZiBtZW0xLm1zIGp1c3QgdG8gdHJpZyB0aGUgImJ1ZmZlciBuZWVkcworIyB0byBiZSBtYWxsb2NlZCBmb3IgbGFyZ2UgcmVxdWVzdCBzaXplIiBmb3IgdGhlIERNQSByZXF1ZXN0LgorCisjIExvY2F0aW9ucyBvZiBJUlEgbm90aWZpZXJzIGFib3ZlIGRlcGVuZCBvbiB3aGVuIHRoZSBzaW11bGF0b3IgaXMKKyMgcG9sbGVkOyBhZGp1c3RtZW50cyBtYXkgYmUgbmVlZGVkIChhZnRlciBjaGVja2luZyB0aGF0IG5vIHBvbGwgaXMKKyMgZ29uZSBkdWUgdG8gYSBidWchKQorCisjciBXLAorI3IgcixhODgzNiw3NjU0MzIxMAorI3IgcyxlMDIwLDEyMjMzNDU2Nzk4YWJkZGVmYmFkYmFkYmFkNTY3ODlhZmRlMTIzNDU2NjU0MzIxYWFjY2JiZWVkZGJlZGFhZGEwMGFhYmJjYworI3IgcixhODgzOCw3NjU0MzIxMQorI3IgbCxlMDAwLGFhNTUxMjIzMzQ1Njc5OGFiZGRlZmJhZGJhZGJhZDU2Nzg5YWZkZTEyMzQ1NjY1NDMyMWFhY2NiYmVlZGRiZWRhYWRhMDBhYQorI3IgSSw4CisjciByLGE4ODM4LDc2NTQzMjEyCisKKyAuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKyBzdGFydAorIHRlc3RfaF9tZW0gMHg3NjU0MzIxMCAweGQwMDAwMDM2CisKKyBtb3ZlLmQgMHgyMDAzZiwkcjEKKyBtb3ZlLmQgMHgxMDAwMCwkcjMKKzA6CisgdGVzdC5iIFskcjFdCisgYm5lIDFmCisgc3VicSAxLCRyMworIGJuZSAwYgorIG5vcAorCisxOgorIHRlc3RfaF9tZW0gMHg1NjM0MjMxMiAweDIwMDIwCisgdGVzdF9oX21lbSAweGRlYmQ4YTc5IDB4MjAwMjQKKyB0ZXN0X2hfbWVtIDB4ZGJiYWFkZmIgMHgyMDAyOAorIHRlc3RfaF9tZW0gMHg5YTc4NTZhZCAweDIwMDJjCisgdGVzdF9oX21lbSAweDQ1MjNlMWZkIDB4MjAwMzAKKyB0ZXN0X2hfbWVtIDB4MWEzMjU0NjYgMHgyMDAzNAorIHRlc3RfaF9tZW0gMHhlZGJlY2JhYyAweDIwMDM4CisgdGVzdF9oX21lbSAweGRhYWFlZGRiIDB4MjAwM2MKKyB0ZXN0X2hfbWVtIDB4Y2NiYmFhMDAgMHgyMDA0MAorCisgbW92ZS5kIDB4MjAwMjAsJHIwCisgbW92ZS5kIDB4MjAwMDAsJHIxCisgbW92ZS53IDB4NTVhYSwkcjIKKyBtb3ZlLncgJHIyLFtyMStdCisgLnJlcHQgOQorIG1vdmUuZCBbJHIwK10sJHIyCisgbW92ZS5kICRyMixbJHIxK10KKyAuZW5kcgorCisgdGVzdF9oX21lbSAweDc2NTQzMjExIDB4ZDAwMDAwMzgKKworIC5pZiAuLmFzbS5hcmNoLmNyaXMudjMyCisgbW92ZSBpcnF2ZWMxLCRlYnAKKyAuZWxzZQorIG1vdmUgaXJxdmVjMSwkaWJyCisgLmVuZGlmCisgZWkKKyBtb3ZlLmQgMHgxMDAwMDAsJHI5CiswOgorIHN1YnEgMSwkcjkKKyBibmUgMGIKKyBub3AKK2tpbGxtZToKKyBmYWlsCisKK2lycTB4MzQ6CisgdGVzdF9oX21lbSAweDc2NTQzMjEyIDB4ZDAwMDAwMzgKKyBwYXNzCisKKyAuZmlsbCA2NTUzNioyKzEyOCwxLDAKKworIHNpbmdsZXZlYyBpcnF2ZWMxLDB4MzQsaXJxMHgzNApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvcG9sbDEubXMgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9wb2xsMS5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWYxZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvcG9sbDEubXMKQEAgLTAsMCArMSwyMiBAQAorI21hY2g6IGNyaXN2MzIKKyNzaW0oY3Jpc3YzMik6IC0taHctZGV2aWNlICIvcnYvZHVtbXkgMHgxMiIKKworIyBBIHZhcmlhbnQgb2YgdHJpdmlhbDIubXMgdG8gY2hlY2sgdGhhdCB0aGUgcmlnaHQgdGhpbmcgaGFwcGVucyB3aGVuCisjIHdlIHJlYWNoIHRoZSBwb2xsIGZ1bmN0aW9uIHdpdGggYSBkdW1teSBkZXZpY2UuCisKKyAuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKyBzdGFydAorIG1vdmUuZCAweGQwMDAwMDAwLCRyMAorIG1vdmUuZCBbJHIwK10sJHIzCisgY21wLmQgMHgxMjEyMTIxMiwkcjMKKyBiZXEgb2sKKyBub3AKK2JhZDoKKyBmYWlsCitvazoKKyBtb3ZlLmQgMHgxMDAwMCwkcjEwCiswOgorIGJuZSAwYgorIHN1YnEgMSwkcjEwCisKKyBwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9xdWl0LnMgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9xdWl0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxZDIzOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3F1aXQucwpAQCAtMCwwICsxLDQgQEAKKzsgVHJpdmlhbCB0YXJnZXQgc2ltdWxhdG9yIHByb2dyYW0gdGhhdCBqdXN0IGV4aXRzLgorIC5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorIHN0YXJ0bm9zdGFjaworIHF1aXQKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3J2Yy5leHAgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9ydmMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmM2M4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9ydmMuZXhwCkBAIC0wLDAgKzEsMjQxIEBACisjIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyMgTWlzY2VsbGFuZW91cyBDUklTIHNpbXVsYXRvciB0ZXN0Y2FzZXMgaW4gYXNzZW1ibHkgY29kZSwgdGVzdGluZworIyBkdi1ydi5jIGFuZCBkdi1jcmlzLmMgZnVuY3Rpb25zLgorCisjIENoZWNrIHdoZXRoZXIgZHYtcnYgYW5kIGR2LWNyaXMgYXJlIHByZXNlbnQuCisKK3Byb2Mgc2ltX2hhc19ydl9hbmRfY3JpcyB7fSB7CisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzdWJkaXIKKyAgICBnbG9iYWwgU0lNRkxBR1MKKyAgICBnbG9iYWwgZ2xvYmFsX2FzX29wdGlvbnMKKyAgICBnbG9iYWwgZ2xvYmFsX2xkX29wdGlvbnMKKyAgICBnbG9iYWwgZ2xvYmFsX3NpbV9vcHRpb25zCisKKyAgICAjIFdlIG5lZWQgdG8gYXNzZW1ibGUgYW5kIGxpbmsgYSB0cml2aWFsIHByb2dyYW0gYW5kIHBhc3MgdGhhdCwgaW4KKyAgICAjIG9yZGVyIHRvIHRlc3Qgc3VjY2Vzc2Z1bCBleGl0LgorCisgICAgIyBBIGJpdCBvZiBkdXBsaWNhdGlvbiBoZXJlIGZvciB0aGUgYXNzZW1ibGluZyBhbmQgbGlua2luZyBwYXJ0OworICAgICMgd2hhdCB3ZSB3YW50IHRvIGRvIGl0IHRvIHJ1biB0aGUgc2ltdWxhdG9yIHdpdGhvdXQgYWZmZWN0aW5nIHRoZQorICAgICMgUEFTUy9GQUlMIGNvdW50ZXJzLCBhbmQgd2UgY2FuIHVzZSBlLmcuIHJ1bl9zaW1fdGVzdCBmb3IgdGhhdC4KKworICAgIGlmICFbaW5mbyBleGlzdHMgZ2xvYmFsX2FzX29wdGlvbnNdIHsKKyAgICAgICAgc2V0IGdsb2JhbF9hc19vcHRpb25zICIiCisgICAgfQorICAgIGlmICFbaW5mbyBleGlzdHMgZ2xvYmFsX2xkX29wdGlvbnNdIHsKKyAgICAgICAgc2V0IGdsb2JhbF9sZF9vcHRpb25zICIiCisgICAgfQorICAgIGlmICFbaW5mbyBleGlzdHMgZ2xvYmFsX3NpbV9vcHRpb25zXSB7CisgICAgICAgIHNldCBnbG9iYWxfc2ltX29wdGlvbnMgIiIKKyAgICB9CisKKyAgICBzZXQgY29tcF9vdXRwdXQgW3RhcmdldF9hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvcXVpdC5zIHF1aXQubyBcCisJCQkgIi1JJHNyY2Rpci8kc3ViZGlyICRnbG9iYWxfYXNfb3B0aW9ucyJdCisKKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHsKKwl2ZXJib3NlIC1sb2cgIiRjb21wX291dHB1dCIgMworCWZhaWwgInJ2IHNpbSB0ZXN0IHNldHVwIChhc3NlbWJsaW5nKSIKKwlyZXR1cm4gMAorICAgIH0KKworICAgIHNldCBjb21wX291dHB1dCBbdGFyZ2V0X2xpbmsgcXVpdC5vIHF1aXQueCAiJGdsb2JhbF9sZF9vcHRpb25zIl0KKworICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0geworCXZlcmJvc2UgLWxvZyAiJGNvbXBfb3V0cHV0IiAzCisJZmFpbCAicnYgc2ltIHRlc3Qgc2V0dXAgKGxpbmtpbmcpIgorCXJldHVybiAwCisgICAgfQorCisgICAgc2V0IHJlc3VsdCBcCisJW3NpbV9ydW4gcXVpdC54IFwKKwkgICAgICIkZ2xvYmFsX3NpbV9vcHRpb25zIC0taHctZGV2aWNlIHJ2IC0taHctZGV2aWNlIGNyaXMgLS1ody1pbmZvIiBcCisJICAgICAiIiAiIiAiIl0KKyAgICBzZXQgcmV0dXJuX2NvZGUgW2xpbmRleCAkcmVzdWx0IDBdCisgICAgc2V0IG91dHB1dCBbbGluZGV4ICRyZXN1bHQgMV0KKworICAgIGlmIHsgIiRyZXR1cm5fY29kZSIgPT0gInBhc3MiIH0geworCXJldHVybiAxCisgICAgfQorCisgICAgcmV0dXJuIDAKK30KKworIyBTaW1pbGFyIHRvIHNsdXJwX29wdGlvbnMsIGJ1dCBsaW5lcyBhcmUgZml4ZWQgZm9ybWF0ICJeI3IgLi4uIiAobm90CisjICJeI3t3c30qcjp7d3N9KyIgdG8gYXZvaWQgaW50cnVkaW5nIG9uIHNsdXJwX29wdGlvbnMgc3ludGF4KS4gIE9ubHkKKyMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvZiB0aGUgIi4uLiIgaXMgdHJpbW1lZC4gIEJld2FyZSB0aGF0IGxpbmVzCisjIGluY2x1ZGluZyBwYXJhbWV0ZXJzIG1heSBub3QgY29udGFpbiAiOiIuCisKK3Byb2Mgc2x1cnBfcnYgeyBmaWxlIH0geworICAgIGlmIFtjYXRjaCB7IHNldCBmIFtvcGVuICRmaWxlIHJdIH0geF0geworCSNwZXJyb3IgImNvdWxkbid0IG9wZW4gYCRmaWxlJzogJHgiCisJcGVycm9yICIkeCIKKwlyZXR1cm4gLTEKKyAgICB9CisgICAgc2V0IHJ2X2FycmF5IHt9CisgICAgIyB3aGl0ZXNwYWNlIGV4cHJlc3Npb24KKyAgICBzZXQgd3MgIHtbIAldKn0KKyAgICAjIHdoaXRlc3BhY2UgaXMgaWdub3JlZCBhdCB0aGUgZW5kIG9mIGEgbGluZS4KKyAgICBzZXQgcGF0ICJeI3IgKC4qKSR3c1wkIgorICAgICMgQWxsb3cgYXJiaXRyYXJ5IGxpbmVzIHVudGlsIHRoZSBmaXJzdCBvcHRpb24gaXMgc2Vlbi4KKyAgICBzZXQgc2Vlbl9vcHQgMAorICAgIHdoaWxlIHsgW2dldHMgJGYgbGluZV0gIT0gLTEgfSB7CisJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQorCSMgV2hpdGVzcGFjZSBoZXJlIGlzIHNwYWNlLXRhYi4KKwlpZiBbcmVnZXhwICRwYXQgJGxpbmUgeHh4IGNtZF0geworCSAgICAjIG1hdGNoIQorCSAgICBsYXBwZW5kIHJ2X2FycmF5ICRjbWQKKwkgICAgc2V0IHNlZW5fb3B0IDEKKwl9IGVsc2UgeworCSAgICBpZiB7ICRzZWVuX29wdCB9IHsKKwkJYnJlYWsKKwkgICAgfQorCX0KKyAgICB9CisgICAgY2xvc2UgJGYKKyAgICByZXR1cm4gJHJ2X2FycmF5Cit9CisKKyMgVGhlIG1haW4gdGVzdCBsb29wLgorCitpZiBbaXN0YXJnZXQgY3JpcyotKi0qXSB7CisgICAgZ2xvYmFsIEFTRkxBR1NfRk9SX1RBUkdFVAorICAgIHNldCBoYXNfcnZfYW5kX2NyaXMgW3NpbV9oYXNfcnZfYW5kX2NyaXNdCisgICAgZ2xvYmFsIGdsb2JhbF9hc19vcHRpb25zCisgICAgZ2xvYmFsIGdsb2JhbF9sZF9vcHRpb25zCisgICAgZ2xvYmFsIGdsb2JhbF9zaW1fb3B0aW9ucworCisgICAgc2V0IHNhdmVkX2dsb2JhbF9zaW1fb3B0aW9ucyAkZ2xvYmFsX3NpbV9vcHRpb25zCisgICAgc2V0IHNhdmVkX2dsb2JhbF9sZF9vcHRpb25zICRnbG9iYWxfbGRfb3B0aW9ucworICAgIHNldCBydmR1bW15ICJbZmlsZSBkaXJuYW1lIFtib2FyZF9pbmZvIHRhcmdldCBzaW1dXS9ydmR1bW15IgorCisgICAgIyBBbGwgbWFjaGluZXMgd2UgdGVzdCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYXNzZW1ibGVyIG9wdGlvbi4KKyAgICAjIFdlJ2xsIG9ubHkgZXZlciB0ZXN0IHYxMCBhbmQgaGlnaGVyIGhlcmUuCisKKyAgICBzZXQgY29tYm9zIHt7ImNyaXN2MTAiICItLW1hcmNoPXYxMCAtLW5vLW11bC1idWctYWJvcnQifQorICAgICAgICAgICAgICAgIHsiY3Jpc3YzMiIgIi0tbWFyY2g9djMyIn19CisKKyAgICAjIFdlIG5lZWQgdG8gcGFzcyBkaWZmZXJlbnQgYXNzZW1ibGVyIGZsYWdzIGZvciBlYWNoIG1hY2hpbmUuCisgICAgIyBTcGVjaWZ5aW5nIGl0IGhlcmUgcmF0aGVyIHRoYW4gYWRkaW5nIGEgc3BlY2lmaWVyIHRvIGVhY2ggYW5kIGV2ZXJ5CisgICAgIyB0ZXN0LWZpbGUgaXMgcHJlZmVycmFibGUuCisKKyAgICBmb3JlYWNoIGNvbWJvICRjb21ib3MgeworCXNldCBtYWNoIFtsaW5kZXggJGNvbWJvIDBdCisJc2V0IEFTRkxBR1NfRk9SX1RBUkdFVCAiW2xpbmRleCAkY29tYm8gMV0iCisKKwkjIFRoZSAubXMgc3VmZml4IGlzIGZvciAibWlzY2VsbGFuZW91cyAucyIuCisJZm9yZWFjaCBzcmMgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLm1zXV0geworCisJICAgICMgSWYgd2UncmUgb25seSB0ZXN0aW5nIHNwZWNpZmljIGZpbGVzIGFuZCB0aGlzIGlzbid0IG9uZSBvZiB0aGVtLAorCSAgICAjIHNraXAgaXQuCisJICAgIGlmICFbcnVudGVzdF9maWxlX3AgJHJ1bnRlc3RzICRzcmNdIHsKKwkJY29udGludWUKKwkgICAgfQorCisJICAgICMgV2hvZXZlciBydW5zIHRoZSB0ZXN0IHNob3VsZCBiZSBhbGVydGVkIHRoYXQgbm90IGFsbAorCSAgICAjIHRlc3RjYXNlcyBoYXZlIGJlZW4gY2hlY2tlZDsgdGhhdCdzIHdoeSB3ZSBkbyB0aGUgbG9vcAorCSAgICAjIGFuZCBkb24ndCBqdXN0IHJldHVybiBhdCB0aGUgdG9wLgorCSAgICBpZiAhJGhhc19ydl9hbmRfY3JpcyB7CisJCXVudGVzdGVkICRzcmMKKwkJY29udGludWUKKwkgICAgfQorCisJICAgIHNldCBzaW1fZGVmYXVsdHMgIi0taHctZmlsZSAkc3JjZGlyLyRzdWJkaXIvc3RkLmRldiIKKwkgICAgc2V0IGxkX2RlZmF1bHRzICItLXNlY3Rpb24tc3RhcnQ9LnRleHQ9MCIKKworCSAgICAjIFdlIHBhcnNlIG9wdGlvbnMgYW4gZXh0cmEgdGltZSBiZXNpZGVzIGluIHJ1bl9zaW1fdGVzdCwKKwkgICAgIyB0byBkZXRlcm1pbmUgaWYgb3VyIGRlZmF1bHRzIHNob3VsZCBiZSBvdmVycmlkZGVuLgorCisJICAgIHNldCBvcHRfYXJyYXkgW3NsdXJwX29wdGlvbnMgJHNyY10KKwkgICAgZm9yZWFjaCBpICRvcHRfYXJyYXkgeworCQlzZXQgb3B0X25hbWUgW2xpbmRleCAkaSAwXQorCQlzZXQgb3B0X21hY2hzIFtsaW5kZXggJGkgMV0KKwkJc2V0IG9wdF92YWwgW2xpbmRleCAkaSAyXQorCisJCSMgQWxsb3cgY29uY2F0ZW5hdGluZyB0byB0aGUgZGVmYXVsdCBvcHRpb25zIGJ5CisJCSMgc3BlY2lmeWluZyBhIG1hY2guCisJCWlmIHsgJG9wdF9uYW1lID09ICJzaW0iICYmICRvcHRfbWFjaHMgPT0gIiIgfSB7CisJCSAgICBzZXQgc2ltX2RlZmF1bHRzICIiCisJCX0KKworCQlpZiB7ICRvcHRfbmFtZSA9PSAibGQiICYmICRvcHRfbWFjaHMgPT0gIiIgfSB7CisJCSAgICBzZXQgbGRfZGVmYXVsdHMgIiIKKwkJfQorCSAgICB9CisKKwkgICAgc2V0IHJ2ZHVtbXlfaWQgLTEKKwkgICAgc2V0IGhvc3RjbWRzIFtzbHVycF9ydiAkc3JjXQorCisJICAgIGlmIHsgJGhvc3RjbWRzICE9ICIiIH0geworCQkjIEkgZ3Vlc3Mgd2UgY291bGQgYXNrIHRvIGhhdmUgcnZkdW1teSBleGVjdXRlZCBvbiBhCisJCSMgcmVtb3RlIGhvc3QsIGJ1dCBpdCBsb29rcyBsaWtlIHRvbyBtdWNoIHRyb3VibGUgZm9yCisJCSMgYSBmZWF0dXJlIHJhcmVseSB1c2VkLgorCQlpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwkJICAgIHVudGVzdGVkICRzcmMKKwkJICAgIGNvbnRpbnVlCisJCX0KKworCQlzZXQgc3JjX2NvbXBvbmVudHMgW2ZpbGUgc3BsaXQgJHNyY10KKwkJc2V0IHJ2ZmlsZSAiW2xpbmRleCAkc3JjX2NvbXBvbmVudHMgXAorCQkJICAgIFtleHByIFtsbGVuZ3RoICRzcmNfY29tcG9uZW50c10gLSAxXV0uciIKKworCQlpZiBbY2F0Y2ggeyBzZXQgZiBbb3BlbiAkcnZmaWxlIHddIH0geF0geworCQkgICAgZXJyb3IgIiR4IgorCQl9IHsKKwkJICAgIHNldCBjb250ZW50cyBbam9pbiAkaG9zdGNtZHMgIlxuIl0KKworCQkgICAgIyBNYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSBmaWxlcyBmcm9tIHRoZSB0ZXN0CisJCSAgICAjIHNvdXJjZSBkaXJlY3Rvcnk7IGV4cGVjdGVkIHdpdGggdGhlIEAtY29tbWFuZC4KKwkJICAgIHJlZ3N1YiAtYWxsICJAc3JjZGlyQCIgJGNvbnRlbnRzICIkc3JjZGlyLyRzdWJkaXIiIGNvbnRlbnRzCisKKwkJICAgIHZlcmJvc2UgInJ2OiAkY29udGVudHMiIDIKKwkJICAgIHB1dHMgJGYgJGNvbnRlbnRzCisJCSAgICBjbG9zZSAkZgorCQl9CisKKwkJc3Bhd24gLW5vZWNobyAkcnZkdW1teSAiJHJ2ZmlsZSIKKwkJaWYgeyAkc3Bhd25faWQgPCAwIH0geworCQkgICAgZXJyb3IgIkNvdWxkbid0IHNwYXduICRydmR1bW15IgorCQkgICAgY29udGludWUKKwkJfQorCQlzZXQgcnZkdW1teV9pZCAkc3Bhd25faWQKKwkgICAgfQorCisJICAgICMgVW5mb3J0dW5hdGVseSB0aGlzIHNlZW1zIGxpa2UgdGhlIG9ubHkgd2F5IHRvIHBhc3MKKwkgICAgIyBhZGRpdGlvbmFsIHNpbSwgbGQgZXRjLiBvcHRpb25zIHRvIHJ1bl9zaW1fdGVzdC4KKwkgICAgc2V0IGdsb2JhbF9zaW1fb3B0aW9ucyAiJHNhdmVkX2dsb2JhbF9zaW1fb3B0aW9ucyAkc2ltX2RlZmF1bHRzIgorCSAgICBzZXQgZ2xvYmFsX2xkX29wdGlvbnMgIiRzYXZlZF9nbG9iYWxfbGRfb3B0aW9ucyAkbGRfZGVmYXVsdHMiCisJICAgIHJ1bl9zaW1fdGVzdCAkc3JjICRtYWNoCisJICAgIHNldCBnbG9iYWxfc2ltX29wdGlvbnMgJHNhdmVkX2dsb2JhbF9zaW1fb3B0aW9ucworCSAgICBzZXQgZ2xvYmFsX2xkX29wdGlvbnMgJHNhdmVkX2dsb2JhbF9sZF9vcHRpb25zCisKKwkgICAgIyBTdG9wIHRoZSBydmR1bW15LCBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcuICBXZSBuZWVkIHRvCisJICAgICMgd2FpdCBvbiBpdCBhbnl3YXkgdG8gYXZvaWQgaXQgdHVybmluZyBpbnRvIGEgem9tYmllLgorCSAgICBpZiB7ICRydmR1bW15X2lkICE9IC0xIH0geworCQljbG9zZSAtaSAkcnZkdW1teV9pZAorCQl3YWl0IC1pICRydmR1bW15X2lkCisKKwkJIyBHbGVhbmVkIGZyb20gZnJhbWV3b3JrLmV4cCwgdGhpcyBzZWVtcyBhbiBpbmRpY2F0b3IKKwkJIyB0byB3aGV0aGVyIHRoZSB0ZXN0IGhhZCBleHBlY3RlZCBvdXRjb21lLiAgSWYgc28sIHdlCisJCSMgd2FudCB0byByZW1vdmUgdGhlIHJ2LWZpbGUuCisJCWlmIHsgJGV4aXRfc3RhdHVzID09IDAgfSB7CisJCSAgICBmaWxlIGRlbGV0ZSAkcnZmaWxlCisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy9zdGQuZGV2IGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvc3RkLmRldgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmVmY2JiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvc3RkLmRldgpAQCAtMCwwICsxLDggQEAKKy9ydi9yZWcgMHhkMDAwMDAwMCA2NAorL3J2L3JlbW90ZS1yZWcgMHhhODgwMAorL3J2L2ludG51bSA0IDIKKy9jcmlzL3ZlYy1mb3ItaW50IDQgMHgzMyA4IDB4MzQgMHhhYSAweGVhCisvcnYvbWVtIDB4MjAwMDAgMHg0MDAKKy9ydi9yZW1vdGUtbWVtIDB4ZTAwMAorL3J2L21ib3ggMHhjMDAwZjAwMAorL3J2ID4gaW50IGludCAvY3JpcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvdGVzdHV0aWxzLmluYyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3Rlc3R1dGlscy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwN2FiZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3Rlc3R1dGlscy5pbmMKQEAgLTAsMCArMSwyMiBAQAorIC5pbmNsdWRlICIuLi8uLi9hc20vdGVzdHV0aWxzLmluYyIKKworIyBEZWZpbmUgYW4gZXhjZXB0aW9uIHZlY3RvciB0YWJsZSAidmVjbmFtZSIgd2l0aCBhIHNpbmdsZQorIyB2ZWN0b3IgbnVtYmVyICJuIiBhcyAiZW50cnkiLCBhbGwgb3RoZXJzICJvdGhlciIuCisjIFYzMiBvbmx5IG5lZWRzIDE8PDEwIGFsaWdubWVudCwgZWFybGllciB2ZXJzaW9ucyBuZWVkIDE8PDE2LgorIC5tYWNybyBzaW5nbGV2ZWMgdmVjbmFtZSB2ZWNubyBlbnRyeSBvdGhlcj1raWxsbWUKKyAuc2VjdGlvbiAudGV4dC5leHZlYworIC5wMmFsaWduIDE2CitcdmVjbmFtZToKKyAuaWYgKFx2ZWNubykKKyAucmVwdCBcdmVjbm8KKyAuZHdvcmQgXG90aGVyCisgLmVuZHIKKyAuZW5kaWYKKyAuZHdvcmQgXGVudHJ5CisgLmlmIChcdmVjbm8pLTI1NQorIC5yZXB0IDI1Ni0oXHZlY25vKS0xCisgLmR3b3JkIFxvdGhlcgorIC5lbmRyCisgLmVuZGlmCisgLnByZXZpb3VzCisgLmVuZG0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3RyaXZpYWwxLm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvdHJpdmlhbDEubXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxOWIwNAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3RyaXZpYWwxLm1zCkBAIC0wLDAgKzEsMTcgQEAKKyNtYWNoOiBjcmlzdjMyCisjc2ltKGNyaXN2MzIpOiAtLWh3LWluZm8KKyNvdXRwdXQ6IC9cbgorI291dHB1dDogL3J2XG4KKyNvdXRwdXQ6IC9ydi9yZWcgMHhkMDAwMDAwMCAweDQwXG4KKyNvdXRwdXQ6IC9ydi9yZW1vdGUtcmVnIDB4YTg4MDBcbgorI291dHB1dDogL3J2L2ludG51bSAweDQgMHgyXG4KKyNvdXRwdXQ6IC9ydi9tZW0gMHgyMDAwMCAweDQwMFxuCisjb3V0cHV0OiAvcnYvcmVtb3RlLW1lbSAweGUwMDBcbgorI291dHB1dDogL3J2L21ib3ggMHhjMDAwZjAwMFxuCisjb3V0cHV0OiAvcnYgPiBpbnQgaW50IC9jcmlzXG4KKyNvdXRwdXQ6IC9jcmlzXG4KKyNvdXRwdXQ6IC9jcmlzL3ZlYy1mb3ItaW50IDB4NCAweDMzIDB4OCAweDM0IDB4YWEgMHhlYVxuCisKKyMgVGVzdCBleHBlY3RlZCAtLWh3LWluZm8gb3V0cHV0IGFuZCBzdGFydHVwIHBhdGhzIG9mIGNvbXBvbmVudHMuCisKKyAuaW5jbHVkZSAicXVpdC5zIgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvdHJpdmlhbDIubXMgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy90cml2aWFsMi5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjMzNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvdHJpdmlhbDIubXMKQEAgLTAsMCArMSwyMSBAQAorI21hY2g6IGNyaXN2MzIKKyNzaW0oY3Jpc3YzMik6IC0taHctZGV2aWNlICIvcnYvZHVtbXkgMHgxMiIKKworIyBUZXN0IGR1bW15IHNldHRpbmdzOiBzZXQgZnJvbSB2YWx1ZS4KKworIC5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorIHN0YXJ0CisgbW92ZS5kIDB4ZDAwMDAwMDAsJHIwCisgbW92ZS5kIFskcjArXSwkcjMKKyBjbXAuZCAweDEyMTIxMjEyLCRyMworIGJlcSBvaworIG5vcAorYmFkOgorIGZhaWwKK29rOgorIG1vdmVxIC0xLCRyMworIG1vdmUuZCAkcjMsWyRyMF0KKyBjbXAuZCBbJHIwXSwkcjMKKyBibmUgYmFkCisgbm9wCisgcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvdHJpdmlhbDMubXMgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy90cml2aWFsMy5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjIzYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvdHJpdmlhbDMubXMKQEAgLTAsMCArMSwyMCBAQAorI21hY2g6IGNyaXN2MzIKKyNzaW0oY3Jpc3YzMik6IC0taHctZGV2aWNlICIvcnYvZHVtbXkgL2Rldi96ZXJvIgorCisjIFRlc3QgZHVtbXkgc2V0dGluZ3M6IHNldCBmcm9tIGZpbGUuCisKKyAuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKyBzdGFydAorIG1vdmUuZCAweGQwMDAwMDAwLCRyMAorIG1vdmUuZCBbJHIwK10sJHIzCisgYmVxIG9rCisgbm9wCitiYWQ6CisgZmFpbAorb2s6CisgbW92ZXEgLTEsJHIzCisgbW92ZS5kICRyMyxbJHIwXQorIGNtcC5kIFskcjBdLCRyMworIGJuZSBiYWQKKyBub3AKKyBwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy90cml2aWFsNC5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3RyaXZpYWw0Lm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDgxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy90cml2aWFsNC5tcwpAQCAtMCwwICsxLDIyIEBACisjbWFjaDogY3Jpc3YzMgorI3IgQCxAc3JjZGlyQC90cml2aWFsNC5yCisKKyMgVGVzdCByZWFkIGFuZCB3cml0ZXMuCisKKyAuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKyBzdGFydAorIG1vdmUuZCAweGQwMDAwMDMyLCRyMAorIG1vdmUuZCBbJHIwK10sJHIzCisgY21wLmQgMHhhYmNkZWYwMSwkcjMKKyBiZXEgb2sKKyBub3AKK2JhZDoKKyBmYWlsCitvazoKKyBtb3ZlLmQgMHhhYWJiY2NkZCwkcjMKKyBtb3ZlLmQgJHIzLFskcjBdCisgbW92ZS5kIFskcjBdLCRyMworIGNtcC5kIDB4NzY1NDMyMTAsJHIzCisgYm5lIGJhZAorIG5vcAorIHBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3RyaXZpYWw0LnIgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy90cml2aWFsNC5yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODk2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9jcmlzL2h3L3J2LW4tY3Jpcy90cml2aWFsNC5yCkBAIC0wLDAgKzEsNCBAQAorVywKK3IsYTg4MzIsYWJjZGVmMDEKK3csYTg4MzYsYWFiYmNjZGQKK3IsYTg4MzYsNzY1NDMyMTAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3RyaXZpYWw1Lm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvdHJpdmlhbDUubXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5ZjE3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3RyaXZpYWw1Lm1zCkBAIC0wLDAgKzEsMTYgQEAKKyNtYWNoOiBjcmlzdjEwIGNyaXN2MzIKKyNzaW0oY3Jpc3YxMCk6IC0taHctZGV2aWNlICIvcnYvdHJhY2U/IHRydWUiCisjc2ltKGNyaXN2MzIpOiAtLWh3LWRldmljZSAiL3J2L3RyYWNlPyB0cnVlIgorI291dHB1dDogL3J2OiBXRFxuCisjb3V0cHV0OiAvcnY6IFJFRyBSIDB4ZDAwMDAwMzJcbgorI291dHB1dDogL3J2OiA6PSAweGFiY2RlZjAxXG4KKyNvdXRwdXQ6IC9ydjogUkVHIFcgMHhkMDAwMDAzNiA6PSAweGFhYmJjY2RkXG4KKyNvdXRwdXQ6IC9ydjogUkVHIFIgMHhkMDAwMDAzNlxuCisjb3V0cHV0OiAvcnY6IDo9IDB4NzY1NDMyMTBcbgorI291dHB1dDogcGFzc1xuCisKKyMgVGVzdCB0cmFjZSBvdXRwdXQgZm9yIHJlYWQgYW5kIHdyaXRlLgorCisjciBALEBzcmNkaXJAL3RyaXZpYWw0LnIKKworIC5pbmNsdWRlICJ0cml2aWFsNC5tcyIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3dkMS5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL2NyaXMvaHcvcnYtbi1jcmlzL3dkMS5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWFmN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vY3Jpcy9ody9ydi1uLWNyaXMvd2QxLm1zCkBAIC0wLDAgKzEsMzMgQEAKKyNtYWNoOiBjcmlzdjEwIGNyaXN2MzIKKyNzaW0oY3Jpc3YxMCk6IC0taHctZGV2aWNlICIvcnYvdHJhY2U/IHRydWUiIC0taHctZGV2aWNlICIvcnYvd2F0Y2hkb2ctaW50ZXJ2YWwgMSIKKyNzaW0oY3Jpc3YzMik6IC0taHctZGV2aWNlICIvcnYvdHJhY2U/IHRydWUiIC0taHctZGV2aWNlICIvcnYvd2F0Y2hkb2ctaW50ZXJ2YWwgMSIgLS1ody1kZXZpY2UgIi9ydi9tYXgtcG9sbC10aWNrcyAxMDAwIgorI291dHB1dDogL3J2OiBXRFxuCisjb3V0cHV0OiAvcnY6IFJFRyBSIDB4ZDAwMDAwMzZcbgorI291dHB1dDogL3J2OiA6PSAweDc2NTQzMjEwXG4KKyNvdXRwdXQ6IC9ydjogV0RcbgorI291dHB1dDogL3J2OiBETUEgVyAweDIwMDAwLi4weDIwMDAzXG4KKyNvdXRwdXQ6IC9ydjogMHgyMDAwMDogMDEgMDIgMDMgMDRcbgorI291dHB1dDogL3J2OiBSRUcgUiAweGQwMDAwMDM4XG4KKyNvdXRwdXQ6IC9ydjogOj0gMHg3NjU0MzIxMVxuCisjb3V0cHV0OiBwYXNzXG4KKworI3IgVywKKyNyIHIsYTg4MzYsNzY1NDMyMTAKKyNyIFcsCisjciBzLGUwMDAsMDEwMjAzMDQKKyNyIHIsYTg4MzgsNzY1NDMyMTEKKworIC5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorIHN0YXJ0CisgbXZpX2hfbWVtIDAgMHgyMDAwMAorIHRlc3RfaF9tZW0gMHg3NjU0MzIxMCAweGQwMDAwMDM2CisKKyBtb3ZlLmQgMHgyMDAwMCwkcjEKKzA6CisgdGVzdC5iIFskcjFdCisgYmVxIDBiCisgbm9wCisgdGVzdF9oX21lbSAweDc2NTQzMjExIDB4ZDAwMDAwMzgKKyBwYXNzCisKKyAuZmlsbCA2NTUzNioyKzEyOCwxLDAK