IyBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5ODksIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIE1ha2UuCiMKIyBWTVMgZXh0ZW5zaW9ucyBmcm9tIEdOVSBNYWtlIDMuNjAgaW1wb3J0ZWQgYnkKIyAgS2xhdXMgS+RtcGYgKGtrYWVtcGZAcm1pLmRlKQojIE1vZGlmaWVkIGZvciB2ZXJzaW9uIDMuNzguMSBieSBIYXJ0bXV0LkJlY2tlckBjb21wYXEuY29tLgojCiMgR05VIE1ha2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQojIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgR05VIE1ha2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIEdOVSBNYWtlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCiMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCgpDQyA9IGNjCkNQID0gY29weQoKJS5vYmo6ICUuYwoJJChDQykgJChDRkxBR1MpL29iaj0kQCAkPAojCiMJTWFrZWZpbGUgZm9yIEdOVSBNYWtlCiMKCmlmZXEgKCQoQ0MpLGNjKQpDRkxBR1MgPSAkKGRlZmluZXMpIC9pbmNsdWRlPShbXSxbLmdsb2JdKS9wcmVmaXg9YWxsL3N0YW5kYXJkPXJlbGF4ZWQKZWxzZQpDRkxBR1MgPSAkKGRlZmluZXMpIC9pbmNsdWRlPShbXSxbLmdsb2JdKQplbmRpZgojTERGTEFHUyA9IC9kZWIKTERGTEFHUyA9CgppZmVxICgkKENDKSxjYykKZGVmaW5lcyA9IC9kZWZpbmU9KCJ1bmxpbms9cmVtb3ZlIiwiSEFWRV9DT05GSUdfSCIsIlZNUyIsImFsbG9jYXRlZF92YXJpYWJsZV9leHBhbmRfZm9yX2ZpbGU9YWxsb2NfdmFyX2V4cGFuZF9mb3JfZmlsZSIpCmVsc2UKaWZlcSAoJChBUkNIKSxWQVgpCmRlZmluZXMgPSAvZGVmaW5lPSgiSEFWRV9DT05GSUdfSCIsIkdDQ19JU19OQVRJVkUiLCJWQVgiKQplbHNlCmRlZmluZXMgPSAvZGVmaW5lPSgiSEFWRV9DT05GSUdfSCIsIkdDQ19JU19OQVRJVkUiKQplbmRpZgplbmRpZgoKTE9BRF9BVkcgPSAvZGVmaW5lPSJOT19MREFWIgoKIyBJZiB5b3UgZG9uJ3Qgd2FudCBhcmNoaXZlIHN1cHBvcnQsIGNvbW1lbnQgdGhlc2Ugb3V0LgpBUkNISVZFUyA9ICxhci5vYmosYXJzY2FuLm9iagpBUkNISVZFU19TUkMgPSBhci5jIGFyc2Nhbi5jCgojIElmIHlvdXIgc3lzdGVtIG5lZWRzIGV4dHJhIGxpYnJhcmllcyBsb2FkZWQgaW4sIGRlZmluZSB0aGVtIGhlcmUuCiMgU3lzdGVtIFYgcHJvYmFibHkgbmVlZCAtbFBXIGZvciBhbGxvY2EuCiMgaWYgb24gdmF4LCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lCiNMT0FETElCRVMgPSAsYy5vcHQvb3B0CmlmZXEgKCQoQ0MpLGNjKQojTE9BRExJQkVTID0sc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgpDUlQwID0KZWxzZQpMT0FETElCRVMgPSxnbnVfY2NfbGlicmFyeTpsaWJnY2Mub2xiL2xpYgplbmRpZgoKIyBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgYWxsb2NhLCBvciB0aGUgb25lIHByb3ZpZGVkIGlzIGJhZCwKIyBnZXQgaXQgZnJvbSB0aGUgRW1hY3MgZGlzdHJpYnV0aW9uIGFuZCBkZWZpbmUgdGhlc2UuCiNBTExPQ0EgPSAsYWxsb2NhLm9iagojQUxMT0NBU1JDID0gYWxsb2NhLmMKCiMgSWYgdGhlcmUgYXJlIHJlbW90ZSBleGVjdXRpb24gZmFjaWxpdGllcyBkZWZpbmVkLAojIGVuYWJsZSB0aGVtIHdpdGggc3dpdGNoZXMgaGVyZSAoc2VlIHJlbW90ZS0qLmMpLgpSRU1PVEUgPQoKIyBBbnkgZXh0cmEgb2JqZWN0IGZpbGVzIHlvdXIgc3lzdGVtIG5lZWRzLgpleHRyYXMgPSAsc2lnbmFtZS5vYmoscmVtb3RlLXN0dWIub2JqLHZtc2Z1bmN0aW9ucy5vYmosdm1zaWZ5Lm9iagojLGRpcmVjdG9yeS5vYmoKIyBhcyBhbiBhbHRlcm5hdGl2ZToKZ2xvYiA9ICxbLmdsb2JdZ2xvYi5vYmosWy5nbG9iXWZubWF0Y2gub2JqCmdldG9wdCA9ICxnZXRvcHQub2JqLGdldG9wdDEub2JqCiMgRGlyZWN0b3J5IHRvIGluc3RhbGwgYG1ha2UnIGluLgpiaW5kaXIgPSBbXQojIERpcmVjdG9yeSB0byBpbnN0YWxsIHRoZSBtYW4gcGFnZSBpbi4KbWFuZGlyID0gW10KIyBOdW1iZXIgdG8gcHV0IG9uIHRoZSBtYW4gcGFnZSBmaWxlbmFtZS4KbWFuZXh0ID0gMQoKb2JqcyA9IGNvbW1hbmRzLm9iaixqb2Iub2JqLGRpci5vYmosZmlsZS5vYmosbWlzYy5vYmosXAogICAgICAgbWFpbi5vYmoscmVhZC5vYmoscmVtYWtlLm9iaixydWxlLm9iaixpbXBsaWNpdC5vYmosXAogICAgICAgZGVmYXVsdC5vYmosdmFyaWFibGUub2JqLGV4cGFuZC5vYmosZnVuY3Rpb24ub2JqLFwKICAgICAgIHZwYXRoLm9iaix2ZXJzaW9uLm9iaiQoQVJDSElWRVMpJChBTExPQ0EpJChleHRyYXMpJChnZXRvcHQpJChnbG9iKQpzcmNzID0gY29tbWFuZHMuYyBqb2IuYyBkaXIuYyBmaWxlLmMgbWlzYy5jIFwKCW1haW4uYyByZWFkLmMgcmVtYWtlLmMgcnVsZS5jIGltcGxpY2l0LmMgXAoJZGVmYXVsdC5jIHZhcmlhYmxlLmMgZXhwYW5kLmMgZnVuY3Rpb24uYyBcCgl2cGF0aC5jIHZlcnNpb24uYyB2bXNmdW5jdGlvbnMuYyB2bXNpZnkuYyAkKEFSQ0hJVkVTX1NSQykgJChBTExPQ0FTUkMpIFwKCWNvbW1hbmRzLmggZGVwLmggZmlsZWRlZi5oIGpvYi5oIG1ha2UuaCBydWxlLmggdmFyaWFibGUuaAoKCi5QSE9OWTogYWxsIGRvYwphbGw6IGNvbmZpZy5oIG1ha2UuZXhlCgpkb2M6IG1ha2UuaW5mbyBtYWtlLmR2aQoKCm1ha2UuZXhlOiAkKG9ianMpCgkkKExEKSQoTERGTEFHUykvZXhlPSRAICReJChMT0FETElCRVMpJChDUlQwKQoKLlBIT05ZOiBjbGVhbiByZWFsY2xlYW4KY2xlYW46CgkkJCBwdXJnZSBbLi4uXQoJLSQoUk0pIG1ha2UuZXhlOywqLm9iajsKCS0kKFJNKSAqLm9wdDsKCS0kKFJNKSBbLmdsb2JdKi5vYmo7CgojIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGRlcGVuZGVuY2llcy4KY29tbWFuZHMub2JqOiBjb21tYW5kcy5jIG1ha2UuaCBkZXAuaCBjb21tYW5kcy5oIGZpbGVkZWYuaCB2YXJpYWJsZS5oIGpvYi5oCmpvYi5vYmo6IGpvYi5jIG1ha2UuaCBjb21tYW5kcy5oIGpvYi5oIGZpbGVkZWYuaCB2YXJpYWJsZS5oCmRpci5vYmo6IGRpci5jIG1ha2UuaApmaWxlLm9iajogZmlsZS5jIG1ha2UuaCBjb21tYW5kcy5oIGRlcC5oIGZpbGVkZWYuaCB2YXJpYWJsZS5oCm1pc2Mub2JqOiBtaXNjLmMgbWFrZS5oIGRlcC5oCm1haW4ub2JqOiBtYWluLmMgbWFrZS5oIGNvbW1hbmRzLmggZGVwLmggZmlsZWRlZi5oIHZhcmlhYmxlLmggam9iLmgKcmVhZC5vYmo6IHJlYWQuYyBtYWtlLmggY29tbWFuZHMuaCBkZXAuaCBmaWxlZGVmLmggdmFyaWFibGUuaApyZW1ha2Uub2JqOiByZW1ha2UuYyBtYWtlLmggY29tbWFuZHMuaCBqb2IuaCBkZXAuaCBmaWxlZGVmLmgKcnVsZS5vYmo6IHJ1bGUuYyBtYWtlLmggY29tbWFuZHMuaCBkZXAuaCBmaWxlZGVmLmggdmFyaWFibGUuaCBydWxlLmgKaW1wbGljaXQub2JqOiBpbXBsaWNpdC5jIG1ha2UuaCBydWxlLmggZGVwLmggZmlsZWRlZi5oCmRlZmF1bHQub2JqOiBkZWZhdWx0LmMgbWFrZS5oIHJ1bGUuaCBkZXAuaCBmaWxlZGVmLmggY29tbWFuZHMuaCB2YXJpYWJsZS5oCnZhcmlhYmxlLm9iajogdmFyaWFibGUuYyBtYWtlLmggY29tbWFuZHMuaCB2YXJpYWJsZS5oIGRlcC5oIGZpbGVkZWYuaApleHBhbmQub2JqOiBleHBhbmQuYyBtYWtlLmggY29tbWFuZHMuaCBmaWxlZGVmLmggdmFyaWFibGUuaApmdW5jdGlvbi5vYmo6IGZ1bmN0aW9uLmMgbWFrZS5oIHZhcmlhYmxlLmggZGVwLmggY29tbWFuZHMuaCBqb2IuaAp2cGF0aC5vYmo6IHZwYXRoLmMgbWFrZS5oIGZpbGVkZWYuaCB2YXJpYWJsZS5oCnZlcnNpb24ub2JqOiB2ZXJzaW9uLmMgY29uZmlnLmgKYXJzY2FuLm9iajogYXJzY2FuLmMKYXIub2JqOiBhci5jIG1ha2UuaCBmaWxlZGVmLmgKc2lnbmFtZS5vYmo6IHNpZ25hbWUuYwpyZW1vdGUtc3R1Yi5vYmo6IHJlbW90ZS1zdHViLmMKWy5nbG9iXWdsb2Iub2JqOiBbLmdsb2JdZ2xvYi5jClsuZ2xvYl1mbm1hdGNoLm9iajogWy5nbG9iXWZubWF0Y2guYwpnZXRvcHQub2JqOiBnZXRvcHQuYwpnZXRvcHQxLm9iajogZ2V0b3B0MS5jCnZtc2Z1bmN0aW9ucy5vYmo6IHZtc2Z1bmN0aW9ucy5jIG1ha2UuaCB2bXNkaXIuaAp2bXNpZnkub2JqOiB2bXNpZnkuYyBtYWtlLmgKCmNvbmZpZy5oOiBjb25maWcuaC12bXMKCSQoQ1ApICQ8ICRACg==