Ly8gLSotIG1vZGU6IGMrKyAtKi0KLy8gJElkCi8vIGh0dHA6Ly93d3cuYmFnbGV5Lm9yZy9+ZG91Zy9zaG9vdG91dC8KLy8gQ2FsY3VsYXRlIHN0YXRpc3RpY2FsIG1vbWVudHMgb2YgYSByZWdpb24sIGZyb20gQmlsbCBMZWFyCi8vIE1vZGlmaWVkIGJ5IFRhbeFzIEJlbmv1Ci8vIEZ1cnRoZXIgbW9kaWZpZWQgYnkgVG9tIEh5ZXIKCiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8Y21hdGg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCBtb21lbnRzIHsKcHVibGljOgogICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CiAgICBtb21lbnRzKElucHV0SXRlcmF0b3IgYmVnaW4sIElucHV0SXRlcmF0b3IgZW5kKQogICAgICAgIDogbWVkaWFuKDAuMCksIG1lYW4oMC4wKSwgYXZlcmFnZV9kZXZpYXRpb24oMC4wKSwKICAgICAgICAgIHN0YW5kYXJkX2RldmlhdGlvbigwLjApLCB2YXJpYW5jZSgwLjApLAogICAgICAgICAgc2tldygwLjApLCBrdXJ0b3NpcygwLjApCiAgICAgICAgewogICAgICAgICAgICBUIHN1bSA9IGFjY3VtdWxhdGUoYmVnaW4sIGVuZCwgMC4wKTsKICAgICAgICAgICAgc2l6ZV90IE4gPSBlbmQgLSBiZWdpbjsKICAgICAgICAgICAgbWVhbiA9IHN1bSAvIE47CiAgICAgICAgICAgIGZvciAoSW5wdXRJdGVyYXRvciBpID0gYmVnaW47IGkgIT0gZW5kOyArK2kpIHsKICAgICAgICAgICAgICAgIFQgZGV2aWF0aW9uID0gKmkgLSBtZWFuOwogICAgICAgICAgICAgICAgYXZlcmFnZV9kZXZpYXRpb24gKz0gZmFicyhkZXZpYXRpb24pOwoJCQkJVCB0ZW1wID0gZGV2aWF0aW9uICogZGV2aWF0aW9uOwogICAgICAgICAgICAgICAgdmFyaWFuY2UgKz0gdGVtcDsKCQkJCXRlbXAgKj0gZGV2aWF0aW9uOwogICAgICAgICAgICAgICAgc2tldyArPSB0ZW1wOwogICAgICAgICAgICAgICAga3VydG9zaXMgKz0gdGVtcCAqIGRldmlhdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhdmVyYWdlX2RldmlhdGlvbiAvPSBOOwogICAgICAgICAgICB2YXJpYW5jZSAvPSAoTiAtIDEpOwogICAgICAgICAgICBzdGFuZGFyZF9kZXZpYXRpb24gPSBzcXJ0KHZhcmlhbmNlKTsKCiAgICAgICAgICAgIGlmICh2YXJpYW5jZSkgewogICAgICAgICAgICAgICAgc2tldyAvPSAoTiAqIHZhcmlhbmNlICogc3RhbmRhcmRfZGV2aWF0aW9uKTsKICAgICAgICAgICAgICAgIGt1cnRvc2lzID0ga3VydG9zaXMvKE4gKiB2YXJpYW5jZSAqIHZhcmlhbmNlKSAtIDMuMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBtaWQgPSBiZWdpbitOLzI7CiAgICAgICAgICAgIG50aF9lbGVtZW50KGJlZ2luLCBtaWQsIGVuZCk7CiAgICAgICAgICAgIGlmIChOICUgMiA9PSAwKSB7CgkJCQlJbnB1dEl0ZXJhdG9yIG5leHRfYmlnZ2VzdCA9IG1heF9lbGVtZW50KGJlZ2luLCAKbWlkKTsKICAgICAgICAgICAgICAgIG1lZGlhbiA9ICgqbWlkKypuZXh0X2JpZ2dlc3QpLzI7CiAgICAgICAgICAgIH0KCQkJZWxzZQoJCQkJbWVkaWFuID0gKm1pZDsKICAgICAgICB9CgogICAgVCBtZWRpYW47CiAgICBUIG1lYW47CiAgICBUIGF2ZXJhZ2VfZGV2aWF0aW9uOwogICAgVCBzdGFuZGFyZF9kZXZpYXRpb247CiAgICBUIHZhcmlhbmNlOwogICAgVCBza2V3OwogICAgVCBrdXJ0b3NpczsKfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiphcmd2KSB7CiNpZmRlZiBTTUFMTF9QUk9CTEVNX1NJWkUKI2RlZmluZSBMRU5HVEggNTAwMDAwCiNlbHNlCiNkZWZpbmUgTEVOR1RIIDUwMDAwMDAKI2VuZGlmCiAgICBpbnQgbiA9ICgoYXJnYyA9PSAyKSA/IGF0b2koYXJndlsxXSkgOiBMRU5HVEgpOwogICAgdmVjdG9yPGRvdWJsZT4gdjsKICAgIGRvdWJsZSBkOwoKICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gbjsgKytpKSB2LnB1c2hfYmFjayhpKTsKICAgIG1vbWVudHM8ZG91YmxlPiBtKHYuYmVnaW4oKSwgdi5lbmQoKSk7CgogICAgcHJpbnRmKCJuOiAgICAgICAgICAgICAgICAgICVkXG4iLCB2LmVuZCgpIC0gdi5iZWdpbigpKTsKICAgIHByaW50ZigibWVkaWFuOiAgICAgICAgICAgICAlZlxuIiwgbS5tZWRpYW4pOwogICAgcHJpbnRmKCJtZWFuOiAgICAgICAgICAgICAgICVmXG4iLCBtLm1lYW4pOwogICAgcHJpbnRmKCJhdmVyYWdlX2RldmlhdGlvbjogICVmXG4iLCBtLmF2ZXJhZ2VfZGV2aWF0aW9uKTsKICAgIHByaW50Zigic3RhbmRhcmRfZGV2aWF0aW9uOiAlZlxuIiwgbS5zdGFuZGFyZF9kZXZpYXRpb24pOwogICAgcHJpbnRmKCJ2YXJpYW5jZTogICAgICAgICAgICVmXG4iLCBtLnZhcmlhbmNlKTsKICAgIHByaW50Zigic2tldzogICAgICAgICAgICAgICAlZlxuIiwgbS5za2V3KTsKICAgIHByaW50Zigia3VydG9zaXM6ICAgICAgICAgICAlZlxuIiwgbS5rdXJ0b3Npcyk7CgogICAgcmV0dXJuIDA7Cn0K