Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IFN5bnRhY29yZSBMTEMgqSAyMDE2LTIwMjEKLy8gCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAovLyBTUERYLUZpbGVDb250cmlidXRvcjogU3ludGFjb3JlIExMQwovLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8gQGZpbGUgICAgICAgPHNjcjFfcGlwZV9oZHUuc3Y+Ci8vLyBAYnJpZWYgICAgICBIQVJUIERlYnVnIFVuaXQgKEhEVSkKLy8vCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vCiAvLyBGdW5jdGlvbmFsaXR5OgogLy8gLSBDb250cm9scyBIQVJUIHN0YXRlIChSVU4sIERlYnVnIFJVTiwgRGVidWcgSEFMVEVEKQogLy8gLSBTZXR1cHMgRGVidWcgTW9kZSBleGVjdXRpb24KIC8vIC0gUHJvdmlkZXMgc3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IERlYnVnIE1vZGUgZXhlY3V0aW9uCiAvLyAtIFByb3ZpZGVzIFByb2dyYW0gQnVmZmVyIGZ1bmN0aW9uYWxpdHkgKGEgZmV3IGluc3RydWN0aW9ucyBleGVjdXRpb24gd2hpbGUKIC8vICAgaW4gRGVidWcgTW9kZSkKIC8vIC0gUHJvdmlkZXMgYWNjZXNzIHRvIERlYnVnIENTUnMKIC8vCiAvLyBTdHJ1Y3R1cmU6CiAvLyAtIERlYnVnIHN0YXRlIEZTTQogLy8gLSBIQVJUIENvbnRyb2wgbG9naWMKIC8vIC0gSEFSVCBTdGF0dXMgbG9naWMKIC8vIC0gUHJvZ3JhbSBCdWZmZXIKIC8vIC0gRGVidWcgQ1NScwogLy8gLSBIRFUgPC0+IERNIGludGVyZmFjZQogLy8gLSBIRFUgPC0+IEVYVSBpbnRlcmZhY2UKIC8vIC0gSERVIDwtPiBJRlUgaW50ZXJmYWNlCiAvLyAtIEhEVSA8LT4gQ1NSIGludGVyZmFjZQogLy8gLSBIRFUgPC0+IFREVSBpbnRlcmZhY2UKIC8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgaW5jbHVkZSAic2NyMV9hcmNoX2Rlc2NyaXB0aW9uLnN2aCIKCmBpZmRlZiBTQ1IxX0RCR19FTgpgaW5jbHVkZSAic2NyMV9hcmNoX3R5cGVzLnN2aCIKYGluY2x1ZGUgInNjcjFfcmlzY3ZfaXNhX2RlY29kaW5nLnN2aCIKYGluY2x1ZGUgInNjcjFfaGR1LnN2aCIKCm1vZHVsZSBzY3IxX3BpcGVfaGR1ICMocGFyYW1ldGVyIEhBUlRfUEJVRl9JTlNUUl9SRUdPVVRfRU4gPSAxJ2IxKSAoCiAgICAvLyBDb21tb24gc2lnbmFscwogICAgaW5wdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzdF9uLCAgICAgICAgICAgICAgICAgICAgICAvLyBIRFUgcmVzZXQKICAgIGlucHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGssICAgICAgICAgICAgICAgICAgICAgICAgLy8gSERVIGNsb2NrCiAgICBpbnB1dCAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xrX2VuLCAgICAgICAgICAgICAgICAgICAgIC8vIEhEVSBjbG9jayBlbmFibGUKYGlmZGVmIFNDUjFfQ0xLQ1RSTF9FTgogICAgaW5wdXQgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsa19waXBlX2VuLCAgICAgICAgICAgICAgICAvLyBQaXBlbGluZSBjbG9jayBlbmFibGUKYGVuZGlmIC8vIFNDUjFfQ0xLQ1RSTF9FTgogICAgaW5wdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUyaGR1X3JkY19xbGZ5X2ksICAgICAgICAvLyBQaXBlbGluZSBSREMgcXVhbGlmaWVyCgogICAgLy8gSERVIDwtPiBDU1IgaS9mCiAgICBpbnB1dCAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyMmhkdV9yZXFfaSwgICAgICAgICAgICAgIC8vIENTUiBpL2YgcmVxdWVzdAogICAgaW5wdXQgIHR5cGVfc2NyMV9jc3JfY21kX3NlbF9lICAgICAgICAgICAgICAgICAgICAgIGNzcjJoZHVfY21kX2ksICAgICAgICAgICAgICAvLyBDU1IgaS9mIGNvbW1hbmQKICAgIGlucHV0ICBsb2dpYyBbU0NSMV9IRFVfREVCVUdDU1JfQUREUl9XSURUSC0xOjBdICAgICBjc3IyaGR1X2FkZHJfaSwgICAgICAgICAgICAgLy8gQ1NSIGkvZiBhZGRyZXNzCiAgICBpbnB1dCAgbG9naWMgW2BTQ1IxX1hMRU4tMTowXSAgICAgICAgICAgICAgICAgICAgICAgY3NyMmhkdV93ZGF0YV9pLCAgICAgICAgICAgIC8vIENTUiBpL2Ygd3JpdGUgZGF0YQogICAgb3V0cHV0IHR5cGVfc2NyMV9jc3JfcmVzcF9lICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJjc3JfcmVzcF9vLCAgICAgICAgICAgICAvLyBDU1IgaS9mIHJlc3BvbnNlCiAgICBvdXRwdXQgbG9naWMgW2BTQ1IxX1hMRU4tMTowXSAgICAgICAgICAgICAgICAgICAgICAgaGR1MmNzcl9yZGF0YV9vLCAgICAgICAgICAgIC8vIENTUiBpL2YgcmVhZCBkYXRhCgogICAgLy8gSERVIDwtPiBETSBpL2YKICAgIC8vIEhBUlQgUnVuIENvbnRyb2wgaS9mCiAgICBpbnB1dCAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG0yaGR1X2NtZF9yZXFfaSwgICAgICAgICAgIC8vIERNLUhBUlQgQ29tbWFuZCByZXF1ZXN0CiAgICBpbnB1dCAgdHlwZV9zY3IxX2hkdV9kYmdzdGF0ZXNfZSAgICAgICAgICAgICAgICAgICAgZG0yaGR1X2NtZF9pLCAgICAgICAgICAgICAgIC8vIERNLUhBUlQgQ29tbWFuZAogICAgb3V0cHV0IGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJkbV9jbWRfcmVzcF9vLCAgICAgICAgICAvLyBETS1IQVJUIENvbW1hbmQgcmVzcG9uc2UKICAgIG91dHB1dCBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHUyZG1fY21kX3Jjb2RlX28sICAgICAgICAgLy8gRE0tSEFSVCBDb21tYW5kIHJldHVybiBjb2RlOiAwIC0gT2s7IDEgLSBFcnJvcgogICAgb3V0cHV0IGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJkbV9oYXJ0X2V2ZW50X28sICAgICAgICAvLyBETS1IQVJUIEV2ZW50OiAxIGlmIEhBUlQgZGVidWcgc3RhdGUgY2hhbmdlZAogICAgb3V0cHV0IHR5cGVfc2NyMV9oZHVfaGFydHN0YXR1c19zICAgICAgICAgICAgICAgICAgIGhkdTJkbV9oYXJ0X3N0YXR1c19vLCAgICAgICAvLyBETS1IQVJUIFN0YXR1cwoKICAgIC8vIFByb2dyYW0gQnVmZmVyIGkvZgogICAgb3V0cHV0IGxvZ2ljIFtTQ1IxX0hEVV9QQlVGX0FERFJfV0lEVEgtMTowXSAgICAgICAgIGhkdTJkbV9wYnVmX2FkZHJfbywgICAgICAgICAvLyBQcm9ncmFtIEJ1ZmZlciBhZGRyZXNzIC0gc28gZmFyIHJlcXVlc3Qgb25seSBmb3IgMSBpbnN0cnVjdGlvbgogICAgaW5wdXQgIGxvZ2ljIFtTQ1IxX0hEVV9DT1JFX0lOU1RSX1dJRFRILTE6MF0gICAgICAgIGRtMmhkdV9wYnVmX2luc3RyX2ksICAgICAgICAvLyBQcm9ncmFtIEJ1ZmZlciBpbnN0cnVjdGlvbgoKICAgIC8vIEhBUlQgQWJzdHJhY3QgRGF0YSByZWdzIGkvZgogICAgb3V0cHV0IGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJkbV9kcmVnX3JlcV9vLCAgICAgICAgICAvLyBBYnN0cmFjdCBEYXRhIFJlZ2lzdGVyIHJlcXVlc3QKICAgIG91dHB1dCBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHUyZG1fZHJlZ193cl9vLCAgICAgICAgICAgLy8gQWJzdHJhY3QgRGF0YSBSZWdpc3RlciB3cml0ZQogICAgb3V0cHV0IGxvZ2ljIFtgU0NSMV9YTEVOLTE6MF0gICAgICAgICAgICAgICAgICAgICAgIGhkdTJkbV9kcmVnX3dkYXRhX28sICAgICAgICAvLyBBYnN0cmFjdCBEYXRhIFJlZ2lzdGVyIHdyaXRlIGRhdGEKICAgIGlucHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbTJoZHVfZHJlZ19yZXNwX2ksICAgICAgICAgLy8gQWJzdHJhY3QgRGF0YSBSZWdpc3RlciByZXNwb25zZQogICAgaW5wdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtMmhkdV9kcmVnX2ZhaWxfaSwgICAgICAgICAvLyBBYnN0cmFjdCBEYXRhIFJlZ2lzdGVyIGZhaWwKICAgIGlucHV0ICBsb2dpYyBbYFNDUjFfWExFTi0xOjBdICAgICAgICAgICAgICAgICAgICAgICBkbTJoZHVfZHJlZ19yZGF0YV9pLCAgICAgICAgLy8gQWJzdHJhY3QgRGF0YSBSZWdpc3RlciByZWFkIGRhdGEKCmBpZmRlZiBTQ1IxX1REVV9FTgogICAgLy8gSERVIDwtPiBURFUgaW50ZXJmYWNlCiAgICBvdXRwdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGR1MnRkdV9od2Jya19kc2JsX28sICAgICAgIC8vIERpc2FibGVzIEJSS00KICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZHUyaGR1X2Rtb2RlX3JlcV9pLCAgICAgICAgLy8gVHJpZ2dlciBNb2R1bGUgcmVxdWVzdHMgdHJhbnNpdGlvbiB0byBkZWJ1ZyBtb2RlCiAgICBpbnB1dCAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh1MmhkdV9pYnJrcHRfaHdfaSwgICAgICAgIC8vIEhhcmR3YXJlIGJyZWFrcG9pbnQgb24gY3VycmVudCBpbnN0cnVjdGlvbgpgZW5kaWYgLy8gU0NSMV9URFVfRU4KCiAgICAvLyBIQVJUIFJ1biBTdGF0dXMKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlMmhkdV9leHVfYnVzeV9pLCAgICAgICAgLy8gRVhVIGJ1c3kKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlMmhkdV9pbnN0cmV0X2ksICAgICAgICAgLy8gSW5zdHJ1Y3Rpb24gcmV0aXJlZCAod2l0aCBvciB3aXRob3V0IGV4Y2VwdGlvbikKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlMmhkdV9pbml0X3BjX2ksICAgICAgICAgLy8gUmVzZXQgZXhpdAoKICAgIC8vIEhBUlQgSGFsdCBTdGF0dXMKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlMmhkdV9leHVfZXhjX3JlcV9pLCAgICAgLy8gRXhjZXB0aW9uIHJlcXVlc3QKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlMmhkdV9icmtwdF9pLCAgICAgICAgICAgLy8gU29mdHdhcmUgQnJlYWtwb2ludCAoRUJSRUFLKQoKICAgIC8vIEhEVSA8LT4gRVhVIGkvZgogICAgLy8gSEFSVCBSdW4gQ29udHJvbAogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJleHVfcGJ1Zl9mZXRjaF9vLCAgICAgICAvLyBGZXRjaCBpbnN0cnVjdGlvbiBmcm9tIFByb2dyYW0gQnVmZmVyCiAgICBvdXRwdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGR1MmV4dV9ub19jb21taXRfbywgICAgICAgIC8vIEZvcmJpZCBpbnN0cnVjdGlvbiBjb21taXRtZW50CiAgICBvdXRwdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGR1MmV4dV9pcnFfZHNibF9vLCAgICAgICAgIC8vIERpc2FibGUgSVJRCiAgICBvdXRwdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGR1MmV4dV9wY19hZHZtdF9kc2JsX28sICAgIC8vIEZvcmJpZCBQQyBhZHZhbmNlbWVudAogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJleHVfZG1vZGVfc3N0ZXBfZW5fbywgICAvLyBFbmFibGUgc2luZ2xlLXN0ZXAKCiAgICAvLyBIQVJUIHN0YXRlCiAgICBvdXRwdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGR1MmV4dV9kYmdfaGFsdGVkX28sICAgICAgIC8vIERlYnVnIGhhbHRlZCBzdGF0ZQogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJleHVfZGJnX3J1bjJoYWx0X28sICAgICAvLyBUcmFuc2l0aW9uIHRvIGRlYnVnIGhhbHRlZCBzdGF0ZQogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJleHVfZGJnX2hhbHQycnVuX28sICAgICAvLyBUcmFuc2l0aW9uIHRvIHJ1biBzdGF0ZQogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJleHVfZGJnX3J1bl9zdGFydF9vLCAgICAvLyBGaXJzdCBjeWNsZSBvZiBydW4gc3RhdGUKCiAgICAvLyBQQyBpbnRlcmZhY2UKICAgIGlucHV0ICBsb2dpYyBbYFNDUjFfWExFTi0xOjBdICAgICAgICAgICAgICAgICAgICAgICBwaXBlMmhkdV9wY19jdXJyX2ksICAgICAgICAgLy8gQ3VycmVudCBQQwogICAgb3V0cHV0IGxvZ2ljIFtgU0NSMV9YTEVOLTE6MF0gICAgICAgICAgICAgICAgICAgICAgIGhkdTJleHVfZGJnX25ld19wY19vLCAgICAgICAvLyBOZXcgUEMgZm9yIHJlc3VtZQoKICAgIC8vIEhEVSA8LT4gSUZVIGkvZgogICAgLy8gUHJvZ3JhbSBCdWZmZXIgSW5zdHJ1Y3Rpb24gaW50ZXJmYWNlCiAgICBpbnB1dCAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZ1MmhkdV9wYnVmX2luc3RyX3JkeV9pLCAgIC8vIFByb2dyYW0gQnVmZmVyIEluc3RydWN0aW9uIGkvZiByZWFkeQogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJpZnVfcGJ1Zl9pbnN0cl92ZF9vLCAgICAvLyBQcm9ncmFtIEJ1ZmZlciBJbnN0cnVjdGlvbiB2YWxpZAogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdTJpZnVfcGJ1Zl9pbnN0cl9lcnJfbywgICAvLyBQcm9ncmFtIEJ1ZmZlciBJbnN0cnVjdGlvbiBpL2YgZXJyb3IKICAgIG91dHB1dCAgbG9naWMgW1NDUjFfSERVX0NPUkVfSU5TVFJfV0lEVEgtMTowXSAgICAgICBoZHUyaWZ1X3BidWZfaW5zdHJfbyAgICAgICAgLy8gUHJvZ3JhbSBCdWZmZXIgSW5zdHJ1Y3Rpb24gaXRzZWxmCik7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBMb2NhbCBQYXJhbWV0ZXJzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbHBhcmFtIGludCB1bnNpZ25lZCBTQ1IxX0hEVV9USU1FT1VUICAgICAgID0gNjQ7ICAgICAgIC8vIG11c3QgYmUgcG93ZXIgb2YgMgpsb2NhbHBhcmFtIGludCB1bnNpZ25lZCBTQ1IxX0hEVV9USU1FT1VUX1dJRFRIID0gJGNsb2cyKFNDUjFfSERVX1RJTUVPVVQpOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTG9jYWwgU2lnbmFscwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gRGVidWcgRlNNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBGU00gY29udHJvbCBzaWduYWxzCmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbV9kaGFsdF9yZXE7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbV9ydW5fcmVxOwoKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtX2NtZF9ydW47CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbV9jbWRfZGhhbHRlZDsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtX2NtZF9kcnVuOwoKLy8gRGVidWcgc3RhdGUgRlNNIHNpZ25hbHMKdHlwZV9zY3IxX2hkdV9kYmdzdGF0ZXNfZSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiZ19zdGF0ZTsKdHlwZV9zY3IxX2hkdV9kYmdzdGF0ZXNfZSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiZ19zdGF0ZV9uZXh0Owpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJnX3N0YXRlX2RoYWx0ZWQ7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmdfc3RhdGVfZHJ1bjsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiZ19zdGF0ZV9ydW47CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmdfc3RhdGVfcmVzZXQ7CgovLyBGU00gdHJhbnNpdGlvbiwgdXBkYXRlIGFuZCBldmVudCByZWdpc3RlcnMKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmc21fdHJhbnM7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZnNtX3RyYW5zX25leHQ7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZnNtX3VwZGF0ZTsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmc21fdXBkYXRlX25leHQ7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZnNtX2V2ZW50Owpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZzbV9ldmVudF9uZXh0OwoKLy8gSEFSVCBDb250cm9sIHNpZ25hbHMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJ0X3Jlc3VtZV9yZXE7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJ0X2hhbHRfcmVxOwpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFydF9jbWRfcmVxOwoKLy8gSEFSVCBSdW4gQ29udHJvbCByZWdpc3Rlcgpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFydF9ydW5jdHJsX3VwZDsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcnRfcnVuY3RybF9jbHI7CnR5cGVfc2NyMV9oZHVfcnVuY3RybF9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJ0X3J1bmN0cmw7CgovLyBIQVJUIGhhbHQgcmVxdWVzdCB0aW1lb3V0IGNvdW50ZXIgc2lnbmFscwpsb2dpYyBbU0NSMV9IRFVfVElNRU9VVF9XSURUSC0xOjBdICAgICAgICAgICAgICAgICAgaGFsdF9yZXFfdGltZW91dF9jbnQ7CmxvZ2ljIFtTQ1IxX0hEVV9USU1FT1VUX1dJRFRILTE6MF0gICAgICAgICAgICAgICAgICBoYWx0X3JlcV90aW1lb3V0X2NudF9uZXh0Owpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsdF9yZXFfdGltZW91dF9jbnRfZW47CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWx0X3JlcV90aW1lb3V0X2ZsYWc7CgovLyBIQVJUIFN0YXR1cyBzaWduYWxzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0eXBlX3NjcjFfaGR1X2hhbHRzdGF0dXNfcyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFydF9oYWx0c3RhdHVzOwp0eXBlX3NjcjFfaGR1X2hhbHRjYXVzZV9lICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFydF9oYWx0Y2F1c2U7Cgpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFydF9oYWx0X3BuZDsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcnRfaGFsdF9hY2s7CgovLyBEZWJ1ZyBtb2RlIGNhdXNlIGRlY29kZXIgc2lnbmFscwpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1vZGVfY2F1c2Vfc3N0ZXA7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbW9kZV9jYXVzZV9leGNlcHQ7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbW9kZV9jYXVzZV9lYnJlYWs7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbW9kZV9jYXVzZV9hbnk7CmBpZmRlZiBTQ1IxX1REVV9FTgpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1vZGVfY2F1c2VfdG1yZXE7CmBlbmRpZiAvLyBTQ1IxX1REVV9FTgoKLy8gUHJvZ3JhbSBCdWZmZXIgRlNNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBQQlVGIEZTTSBjb250cm9sIHNpZ25hbHMKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmdV9oYW5kc2hha2VfZG9uZTsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBidWZfZXhjX2lual9yZXE7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYnVmX2V4Y19pbmpfZW5kOwpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ1Zl9zdGFydF9mZXRjaDsKCi8vIFBCVUYgRlNNIHNpZ25hbHMKdHlwZV9zY3IxX2hkdV9wYnVmc3RhdGVzX2UgICAgICAgICAgICAgICAgICAgICAgICAgIHBidWZfZnNtX2N1cnI7CnR5cGVfc2NyMV9oZHVfcGJ1ZnN0YXRlc19lICAgICAgICAgICAgICAgICAgICAgICAgICBwYnVmX2ZzbV9uZXh0Owpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ1Zl9mc21faWRsZTsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBidWZfZnNtX2ZldGNoOwpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ1Zl9mc21fZXhjaW5qOwoKLy8gUEJVRiBhZGRyZXNzIHNpZ25hbHMKbG9naWMgW1NDUjFfSERVX1BCVUZfQUREUl9XSURUSC0xOjBdICAgICAgICAgICAgICAgIHBidWZfYWRkcl9mZjsKbG9naWMgW1NDUjFfSERVX1BCVUZfQUREUl9XSURUSC0xOjBdICAgICAgICAgICAgICAgIHBidWZfYWRkcl9uZXh0Owpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ1Zl9hZGRyX2VuZDsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBidWZfYWRkcl9uZXh0X3ZkOwoKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBidWZfaW5zdHJfd2FpdF9sYXRjaGluZzsKCi8vIERlYnVncyBDU1JzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBDU1JzIHdyaXRlL3JlYWQgaW50ZXJmYWNlIHNpZ25hbHMKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcl91cGRfb25faGFsdDsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcl93cjsKbG9naWMgW2BTQ1IxX1hMRU4tMTowXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcl93cl9kYXRhOwpsb2dpYyBbYFNDUjFfWExFTi0xOjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyX3JkX2RhdGE7CgovLyBEZWJ1ZyBDb250cm9sIGFuZCBTdGF0dXMgcmVnaXN0ZXIgKERDU1IpCmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JfZGNzcl9zZWw7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JfZGNzcl93cjsKdHlwZV9zY3IxX2hkdV9kY3NyX3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9kY3NyX2luOwp0eXBlX3NjcjFfaGR1X2Rjc3JfcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyX2Rjc3Jfb3V0Owpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyX2Rjc3JfZWJyZWFrbTsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9kY3NyX3N0ZXBpZTsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9kY3NyX3N0ZXA7CmxvZ2ljIFtTQ1IxX0hEVV9EQ1NSX0NBVVNFX0JJVF9MLQogICAgICAgU0NSMV9IRFVfRENTUl9DQVVTRV9CSVRfUjowXSAgICAgICAgICAgICAgICAgY3NyX2Rjc3JfY2F1c2U7CgovLyBEZWJ1ZyBQcm9ncmFtIENvdW50ZXIgcmVnaXN0ZXIgKERQQykKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9kcGNfc2VsOwpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyX2RwY193cjsKbG9naWMgW2BTQ1IxX1hMRU4tMTowXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9kcGNfZmY7CmxvZ2ljIFtgU0NSMV9YTEVOLTE6MF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JfZHBjX25leHQ7CmxvZ2ljIFtgU0NSMV9YTEVOLTE6MF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JfZHBjX291dDsKCi8vIERlYnVnIFNjcmF0Y2ggcmVnaXN0ZXIgMCAoRFNDUkFUQ0gwKQpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyX2FkZHJfZHNjcmF0Y2gwOwpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyX2RzY3JhdGNoMF9zZWw7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JfZHNjcmF0Y2gwX3dyOwpsb2dpYyBbYFNDUjFfWExFTi0xOjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyX2RzY3JhdGNoMF9vdXQ7CnR5cGVfc2NyMV9jc3JfcmVzcF9lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JfZHNjcmF0Y2gwX3Jlc3A7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBEZWJ1ZyBzdGF0ZSBGU00gbG9naWMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KIC8vIERlYnVnIHN0YXRlIEZTTSBsb2dpYyBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uYWwgdW5pdHM6CiAvLyAtIEZTTSBjb250cm9sIGxvZ2ljCiAvLyAtIERlYnVnIHN0YXRlIEZTTQogLy8gLSBGU00gdHJhbnNpdGlvbiwgdXBkYXRlIGFuZCBldmVudCByZWdpc3RlcnMKLy8KCi8vIEZTTSBjb250cm9sIGxvZ2ljCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphc3NpZ24gZG1fY21kX2RoYWx0ZWQgPSAoZG0yaGR1X2NtZF9pID09IFNDUjFfSERVX0RCR1NUQVRFX0RIQUxURUQpOwphc3NpZ24gZG1fY21kX3J1biAgICAgPSAoZG0yaGR1X2NtZF9pID09IFNDUjFfSERVX0RCR1NUQVRFX1JVTik7CmFzc2lnbiBkbV9jbWRfZHJ1biAgICA9IChkbTJoZHVfY21kX2kgPT0gU0NSMV9IRFVfREJHU1RBVEVfRFJVTik7Cgphc3NpZ24gZG1fZGhhbHRfcmVxICAgPSBkbTJoZHVfY21kX3JlcV9pICYgZG1fY21kX2RoYWx0ZWQ7CmFzc2lnbiBkbV9ydW5fcmVxICAgICA9IGRtMmhkdV9jbWRfcmVxX2kgJiAoZG1fY21kX3J1biB8IGRtX2NtZF9kcnVuKTsKCi8vIERlYnVnIHN0YXRlIEZTTQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYWx3YXlzX2ZmIEAobmVnZWRnZSByc3RfbiwgcG9zZWRnZSBjbGspIGJlZ2luCiAgICBpZiAofnJzdF9uKSBiZWdpbgogICAgICAgIGRiZ19zdGF0ZSA8PSBTQ1IxX0hEVV9EQkdTVEFURV9SRVNFVDsKICAgIGVuZCBlbHNlIGJlZ2luCiAgICAgICAgZGJnX3N0YXRlIDw9IGRiZ19zdGF0ZV9uZXh0OwogICAgZW5kCmVuZAoKYWx3YXlzX2NvbWIgYmVnaW4KICAgIGlmICh+cGlwZTJoZHVfcmRjX3FsZnlfaSkgYmVnaW4KICAgICAgICBkYmdfc3RhdGVfbmV4dCA9IFNDUjFfSERVX0RCR1NUQVRFX1JFU0VUOwogICAgZW5kIGVsc2UgYmVnaW4KICAgICAgICBjYXNlIChkYmdfc3RhdGUpCiAgICAgICAgICAgIFNDUjFfSERVX0RCR1NUQVRFX1JFU0VUOiBiZWdpbgogICAgICAgICAgICAgICAgZGJnX3N0YXRlX25leHQgPSB+cGlwZTJoZHVfaW5pdF9wY19pID8gU0NSMV9IRFVfREJHU1RBVEVfUkVTRVQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZG1fZGhhbHRfcmVxICAgICAgICA/IFNDUjFfSERVX0RCR1NUQVRFX0RIQUxURUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNDUjFfSERVX0RCR1NUQVRFX1JVTjsKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIFNDUjFfSERVX0RCR1NUQVRFX1JVTjogYmVnaW4KICAgICAgICAgICAgICAgIGRiZ19zdGF0ZV9uZXh0ID0gZGZzbV91cGRhdGUgICAgICAgICA/IFNDUjFfSERVX0RCR1NUQVRFX0RIQUxURUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNDUjFfSERVX0RCR1NUQVRFX1JVTjsKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIFNDUjFfSERVX0RCR1NUQVRFX0RIQUxURUQ6IGJlZ2luCiAgICAgICAgICAgICAgICBkYmdfc3RhdGVfbmV4dCA9IH5kZnNtX3VwZGF0ZSAgICAgICAgPyBTQ1IxX0hEVV9EQkdTVEFURV9ESEFMVEVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRtX2NtZF9kcnVuICAgICAgICAgPyBTQ1IxX0hEVV9EQkdTVEFURV9EUlVOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTQ1IxX0hEVV9EQkdTVEFURV9SVU47CiAgICAgICAgICAgIGVuZAogICAgICAgICAgICBTQ1IxX0hEVV9EQkdTVEFURV9EUlVOOiBiZWdpbgogICAgICAgICAgICAgICAgZGJnX3N0YXRlX25leHQgPSBkZnNtX3VwZGF0ZSAgICAgICAgID8gU0NSMV9IRFVfREJHU1RBVEVfREhBTFRFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU0NSMV9IRFVfREJHU1RBVEVfRFJVTjsKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGRlZmF1bHQ6IGJlZ2luCmBpZmRlZiBTQ1IxX1hQUk9QX0VOCiAgICAgICAgICAgICAgICBkYmdfc3RhdGVfbmV4dCA9IFNDUjFfSERVX0RCR1NUQVRFX1hYWDsKYGVsc2UgLy8gU0NSMV9YUFJPUF9FTgogICAgICAgICAgICAgICAgZGJnX3N0YXRlX25leHQgPSBkYmdfc3RhdGU7CmBlbmRpZiAvLyBTQ1IxX1hQUk9QX0VOCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZGNhc2UKICAgIGVuZAplbmQKCmFzc2lnbiBkYmdfc3RhdGVfZGhhbHRlZCA9IChkYmdfc3RhdGUgPT0gU0NSMV9IRFVfREJHU1RBVEVfREhBTFRFRCk7CmFzc2lnbiBkYmdfc3RhdGVfZHJ1biAgICA9IChkYmdfc3RhdGUgPT0gU0NSMV9IRFVfREJHU1RBVEVfRFJVTik7CmFzc2lnbiBkYmdfc3RhdGVfcnVuICAgICA9IChkYmdfc3RhdGUgPT0gU0NSMV9IRFVfREJHU1RBVEVfUlVOKTsKYXNzaWduIGRiZ19zdGF0ZV9yZXNldCAgID0gKGRiZ19zdGF0ZSA9PSBTQ1IxX0hEVV9EQkdTVEFURV9SRVNFVCk7CgovLyBGU00gdHJhbnNpdGlvbiwgdXBkYXRlIGFuZCBldmVudCByZWdpc3RlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFsd2F5c19mZiBAKG5lZ2VkZ2UgcnN0X24sIHBvc2VkZ2UgY2xrKSBiZWdpbgogICAgaWYgKH5yc3RfbikgYmVnaW4KICAgICAgICBkZnNtX3RyYW5zICA8PSAxJ2IwOwogICAgICAgIGRmc21fdXBkYXRlIDw9IDEnYjA7CiAgICAgICAgZGZzbV9ldmVudCAgPD0gMSdiMDsKICAgIGVuZCBlbHNlIGJlZ2luCiAgICAgICAgZGZzbV90cmFucyAgPD0gZGZzbV90cmFuc19uZXh0OwogICAgICAgIGRmc21fdXBkYXRlIDw9IGRmc21fdXBkYXRlX25leHQ7CiAgICAgICAgZGZzbV9ldmVudCAgPD0gZGZzbV9ldmVudF9uZXh0OwogICAgZW5kCmVuZAoKYWx3YXlzX2NvbWIgYmVnaW4KICAgIGRmc21fdHJhbnNfbmV4dCAgPSAxJ2IwOwogICAgZGZzbV91cGRhdGVfbmV4dCA9IDEnYjA7CiAgICBkZnNtX2V2ZW50X25leHQgID0gMSdiMDsKCiAgICBpZiAofnBpcGUyaGR1X3JkY19xbGZ5X2kpIGJlZ2luCiAgICAgICAgZGZzbV90cmFuc19uZXh0ICA9IDEnYjA7CiAgICAgICAgZGZzbV91cGRhdGVfbmV4dCA9IDEnYjA7CiAgICAgICAgZGZzbV9ldmVudF9uZXh0ICA9IDEnYjE7CiAgICBlbmQgZWxzZSBiZWdpbgogICAgICAgIGNhc2UgKGRiZ19zdGF0ZSkKICAgICAgICAgICAgU0NSMV9IRFVfREJHU1RBVEVfUkVTRVQ6IGJlZ2luCiAgICAgICAgICAgICAgICBkZnNtX3RyYW5zX25leHQgID0gMSdiMDsKICAgICAgICAgICAgICAgIGRmc21fdXBkYXRlX25leHQgPSAxJ2IwOwogICAgICAgICAgICAgICAgZGZzbV9ldmVudF9uZXh0ICA9IHBpcGUyaGR1X2luaXRfcGNfaSAmIH5kbTJoZHVfY21kX3JlcV9pOwogICAgICAgICAgICBlbmQKCiAgICAgICAgICAgIFNDUjFfSERVX0RCR1NUQVRFX1JVTiwKICAgICAgICAgICAgU0NSMV9IRFVfREJHU1RBVEVfRFJVTjogYmVnaW4KICAgICAgICAgICAgICAgIGRmc21fdHJhbnNfbmV4dCAgPSB+ZGZzbV91cGRhdGUgPyBoYXJ0X2hhbHRfcG5kIDogZGZzbV90cmFuczsKICAgICAgICAgICAgICAgIGRmc21fdXBkYXRlX25leHQgPSB+ZGZzbV91cGRhdGUgJiBoYXJ0X2hhbHRfYWNrOwogICAgICAgICAgICAgICAgZGZzbV9ldmVudF9uZXh0ICA9IGRmc21fdXBkYXRlOwogICAgICAgICAgICBlbmQKCiAgICAgICAgICAgIFNDUjFfSERVX0RCR1NUQVRFX0RIQUxURUQ6IGJlZ2luCiAgICAgICAgICAgICAgICBkZnNtX3RyYW5zX25leHQgID0gfmRmc21fdXBkYXRlID8gfmRmc21fdHJhbnMgJiBkbV9ydW5fcmVxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGZzbV90cmFuczsKICAgICAgICAgICAgICAgIGRmc21fdXBkYXRlX25leHQgPSB+ZGZzbV91cGRhdGUgJiBkZnNtX3RyYW5zOwogICAgICAgICAgICAgICAgZGZzbV9ldmVudF9uZXh0ICA9IGRmc21fdXBkYXRlOwogICAgICAgICAgICBlbmQKCiAgICAgICAgICAgIGRlZmF1bHQgOiBiZWdpbgogICAgICAgICAgICAgICAgZGZzbV90cmFuc19uZXh0ICA9ICdYOwogICAgICAgICAgICAgICAgZGZzbV91cGRhdGVfbmV4dCA9ICdYOwogICAgICAgICAgICAgICAgZGZzbV9ldmVudF9uZXh0ICA9ICdYOwogICAgICAgICAgICBlbmQKICAgICAgICBlbmRjYXNlCiAgICBlbmQKZW5kCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBIQVJUIENvbnRyb2wgbG9naWMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KIC8vIEhBUlQgQ29udHJvbCBsb2dpYyBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uYWwgdW5pdHM6CiAvLyAtIENvbnRyb2wgc2lnbmFscwogLy8gLSBIQVJUIFJ1biBDb250cm9sIHJlZ2lzdGVyCiAvLyAtIEhBUlQgSGFsdCBSZXF1ZXN0IFRpbWUtT3V0IGNvdW50ZXIKLy8KCi8vIENvbnRyb2wgbG9naWMKYWx3YXlzX2NvbWIgYmVnaW4KICAgIGhhcnRfY21kX3JlcSA9IDEnYjA7CgogICAgaWYgKH5waXBlMmhkdV9yZGNfcWxmeV9pKSBiZWdpbgogICAgICAgIGhhcnRfY21kX3JlcSA9IDEnYjA7CiAgICBlbmQgZWxzZSBiZWdpbgogICAgICAgIGNhc2UgKGRiZ19zdGF0ZSkKICAgICAgICAgICAgU0NSMV9IRFVfREJHU1RBVEVfUkVTRVQgIDogaGFydF9jbWRfcmVxID0gZG0yaGR1X2NtZF9yZXFfaTsKICAgICAgICAgICAgU0NSMV9IRFVfREJHU1RBVEVfREhBTFRFRDogaGFydF9jbWRfcmVxID0gKGRmc21fdXBkYXRlIHwgZGZzbV90cmFucyk7CiAgICAgICAgICAgIFNDUjFfSERVX0RCR1NUQVRFX1JVTiwKICAgICAgICAgICAgU0NSMV9IRFVfREJHU1RBVEVfRFJVTiAgIDogaGFydF9jbWRfcmVxID0gfmRmc21fdXBkYXRlICYgZGZzbV90cmFuczsKICAgICAgICAgICAgZGVmYXVsdCAgICAgICAgICAgICAgICAgIDogaGFydF9jbWRfcmVxID0gJ1g7CiAgICAgICAgZW5kY2FzZQogICAgZW5kCmVuZAoKYXNzaWduIGhhcnRfaGFsdF9yZXEgICA9IGRtX2NtZF9kaGFsdGVkICYgaGFydF9jbWRfcmVxOwphc3NpZ24gaGFydF9yZXN1bWVfcmVxID0gKGRtX2NtZF9ydW4gfCBkbV9jbWRfZHJ1bikgJiBoYXJ0X2NtZF9yZXE7CgovLyBIQVJUIFJ1biBDb250cm9sIHJlZ2lzdGVyCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphc3NpZ24gaGFydF9ydW5jdHJsX2NsciA9IChkYmdfc3RhdGVfcnVuIHwgZGJnX3N0YXRlX2RydW4pCiAgICAgICAgICAgICAgICAgICAgICAgICYgKGRiZ19zdGF0ZV9uZXh0ID09IFNDUjFfSERVX0RCR1NUQVRFX0RIQUxURUQpOwphc3NpZ24gaGFydF9ydW5jdHJsX3VwZCA9IGRiZ19zdGF0ZV9kaGFsdGVkICYgZGZzbV90cmFuc19uZXh0OwoKYWx3YXlzX2ZmIEAobmVnZWRnZSByc3RfbiwgcG9zZWRnZSBjbGspIGJlZ2luCiAgICBpZiAofnJzdF9uKSBiZWdpbgogICAgICAgIGhhcnRfcnVuY3RybC5pcnFfZHNibCAgICAgIDw9IDEnYjA7CiAgICAgICAgaGFydF9ydW5jdHJsLmZldGNoX3NyYyAgICAgPD0gU0NSMV9IRFVfRkVUQ0hfU1JDX05PUk1BTDsKICAgICAgICBoYXJ0X3J1bmN0cmwucGNfYWR2bXRfZHNibCA8PSAxJ2IwOwogICAgICAgIGhhcnRfcnVuY3RybC5od2Jya3B0X2RzYmwgIDw9IDEnYjA7CiAgICAgICAgaGFydF9ydW5jdHJsLnJlZGlyZWN0ICAgICAgPD0gJzA7CiAgICBlbmQgZWxzZSBpZihjbGtfZW4pIGJlZ2luCiAgICAgICAgaWYgKGhhcnRfcnVuY3RybF9jbHIpIGJlZ2luCiAgICAgICAgICAgIGhhcnRfcnVuY3RybCAgICAgICAgICAgPD0gJzA7CiAgICAgICAgZW5kIGVsc2UgYmVnaW4KICAgICAgICAgICAgaWYgKGhhcnRfcnVuY3RybF91cGQpIGJlZ2luCiAgICAgICAgICAgICAgICBpZiAofmRtX2NtZF9kcnVuKSBiZWdpbgogICAgICAgICAgICAgICAgICAgIC8vIENhc2UgOiByZXN1bWUgdG8gUlVOIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgaGFydF9ydW5jdHJsLmlycV9kc2JsICAgICAgICA8PSBjc3JfZGNzcl9zdGVwID8gfmNzcl9kY3NyX3N0ZXBpZSA6IDEnYjA7CiAgICAgICAgICAgICAgICAgICAgaGFydF9ydW5jdHJsLmZldGNoX3NyYyAgICAgICA8PSBTQ1IxX0hEVV9GRVRDSF9TUkNfTk9STUFMOwogICAgICAgICAgICAgICAgICAgIGhhcnRfcnVuY3RybC5wY19hZHZtdF9kc2JsICAgPD0gMSdiMDsKICAgICAgICAgICAgICAgICAgICBoYXJ0X3J1bmN0cmwuaHdicmtwdF9kc2JsICAgIDw9IDEnYjA7CiAgICAgICAgICAgICAgICAgICAgaGFydF9ydW5jdHJsLnJlZGlyZWN0LnNzdGVwICA8PSBjc3JfZGNzcl9zdGVwOwogICAgICAgICAgICAgICAgICAgIGhhcnRfcnVuY3RybC5yZWRpcmVjdC5lYnJlYWsgPD0gY3NyX2Rjc3JfZWJyZWFrbTsKICAgICAgICAgICAgICAgIGVuZCBlbHNlIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgLy8gQ2FzZSA6IHJlc3VtZSB0byBEUlVOIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgaGFydF9ydW5jdHJsLmlycV9kc2JsICAgICAgICA8PSAxJ2IxOwogICAgICAgICAgICAgICAgICAgIGhhcnRfcnVuY3RybC5mZXRjaF9zcmMgICAgICAgPD0gU0NSMV9IRFVfRkVUQ0hfU1JDX1BCVUY7CiAgICAgICAgICAgICAgICAgICAgaGFydF9ydW5jdHJsLnBjX2Fkdm10X2RzYmwgICA8PSAxJ2IxOwogICAgICAgICAgICAgICAgICAgIGhhcnRfcnVuY3RybC5od2Jya3B0X2RzYmwgICAgPD0gMSdiMTsKICAgICAgICAgICAgICAgICAgICBoYXJ0X3J1bmN0cmwucmVkaXJlY3Quc3N0ZXAgIDw9IDEnYjA7CiAgICAgICAgICAgICAgICAgICAgaGFydF9ydW5jdHJsLnJlZGlyZWN0LmVicmVhayA8PSAxJ2IxOwogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgZW5kCmVuZAoKLy8gSEFSVCBIYWx0IFJlcXVlc3QgVGltZS1PdXQgY291bnRlcgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBIQVJUIGdvZXMgaW50byBoYWx0IHN0YXRlIG9ubHkgaWYgdGhlIGhhbHQgcmVxdWVzdCBpcyBwcmVzZW50IGZvciB0aW1lb3V0IHBlcmlvZAovLyBvZiB0aW1lCgphc3NpZ24gaGFsdF9yZXFfdGltZW91dF9jbnRfZW4gPSBoZHUyZXh1X2RiZ19oYWx0MnJ1bl9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChoYXJ0X2hhbHRfcmVxICYgfmhkdTJleHVfZGJnX3J1bjJoYWx0X28pOwoKYWx3YXlzX2ZmIEAocG9zZWRnZSBjbGssIG5lZ2VkZ2UgcnN0X24pIGJlZ2luCiAgICBpZiAofnJzdF9uKSBiZWdpbgogICAgICAgIGhhbHRfcmVxX3RpbWVvdXRfY250IDw9ICcxOwogICAgZW5kIGVsc2UgaWYgKGhhbHRfcmVxX3RpbWVvdXRfY250X2VuKSBiZWdpbgogICAgICAgIGhhbHRfcmVxX3RpbWVvdXRfY250IDw9IGhhbHRfcmVxX3RpbWVvdXRfY250X25leHQ7CiAgICBlbmQKZW5kCgphc3NpZ24gaGFsdF9yZXFfdGltZW91dF9jbnRfbmV4dCA9IGhkdTJleHVfZGJnX2hhbHQycnVuX28gICAgICAgICAgICAgICAgICAgID8gJzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaGFydF9oYWx0X3JlcSAmIH5oZHUyZXh1X2RiZ19ydW4yaGFsdF9vKSA/IGhhbHRfcmVxX3RpbWVvdXRfY250IC0gMSdiMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaGFsdF9yZXFfdGltZW91dF9jbnQ7Cgphc3NpZ24gaGFsdF9yZXFfdGltZW91dF9mbGFnID0gfnxoYWx0X3JlcV90aW1lb3V0X2NudDsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEhBUlQgU3RhdHVzIGxvZ2ljCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCiAvLyBIQVJUIFN0YXR1cyBsb2dpYyBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uYWwgdW5pdHM6CiAvLyAtIERlYnVnIG1vZGUgY2F1c2UgZGVjb2RlcgogLy8gLSBIYXJ0IGhhbHQgc3RhdHVzIGNhdXNlIGVuY29kZXIKIC8vIC0gSGFydCBoYWx0IHN0YXR1cyByZWdpc3RlcgovLwoKLy8gRGVidWcgbW9kZSBjYXVzZSBkZWNvZGVyCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphc3NpZ24gZG1vZGVfY2F1c2Vfc3N0ZXAgID0gaGFydF9ydW5jdHJsLnJlZGlyZWN0LnNzdGVwICYgcGlwZTJoZHVfaW5zdHJldF9pOwphc3NpZ24gZG1vZGVfY2F1c2VfZXhjZXB0ID0gZGJnX3N0YXRlX2RydW4gJiBwaXBlMmhkdV9leHVfZXhjX3JlcV9pCiAgICAgICAgICAgICAgICAgICAgICAgICAgJiB+cGlwZTJoZHVfYnJrcHRfaQpgaWZkZWYgU0NSMV9URFVfRU4KICAgICAgICAgICAgICAgICAgICAgICAgICAmIH5leHUyaGR1X2licmtwdF9od19pCmBlbmRpZiAvLyBTQ1IxX1REVV9FTgogICAgICAgICAgICAgICAgICAgICAgICAgIDsKYXNzaWduIGRtb2RlX2NhdXNlX2VicmVhayA9IGhhcnRfcnVuY3RybC5yZWRpcmVjdC5lYnJlYWsgJiBwaXBlMmhkdV9icmtwdF9pOwpgaWZkZWYgU0NSMV9URFVfRU4KYXNzaWduIGRtb2RlX2NhdXNlX3RtcmVxICA9IHRkdTJoZHVfZG1vZGVfcmVxX2kgJiBleHUyaGR1X2licmtwdF9od19pOwpgZW5kaWYgLy8gU0NSMV9URFVfRU4KCmFzc2lnbiBkbW9kZV9jYXVzZV9hbnkgPSBkbW9kZV9jYXVzZV9zc3RlcCB8IGRtb2RlX2NhdXNlX2VicmVhayB8IGRtb2RlX2NhdXNlX2V4Y2VwdAogICAgICAgICAgICAgICAgICAgICAgIHwgaGFydF9oYWx0X3JlcQpgaWZkZWYgU0NSMV9URFVfRU4KICAgICAgICAgICAgICAgICAgICAgICB8IGRtb2RlX2NhdXNlX3RtcmVxCmBlbmRpZiAvLyBTQ1IxX1REVV9FTgogICAgICAgICAgICAgICAgICAgICAgIDsKCi8vIEhBUlQgaGFsdCBjYXVzZSBlbmNvZGVyCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphbHdheXNfY29tYiBiZWdpbgogICAgY2FzZSAoMSdiMSkKYGlmZGVmIFNDUjFfVERVX0VOCiAgICAgICAgZG1vZGVfY2F1c2VfdG1yZXEgICA6IGhhcnRfaGFsdGNhdXNlID0gU0NSMV9IRFVfSEFMVENBVVNFX1RNUkVROwpgZW5kaWYgLy8gU0NSMV9URFVfRU4KICAgICAgICBkbW9kZV9jYXVzZV9lYnJlYWsgIDogaGFydF9oYWx0Y2F1c2UgPSBTQ1IxX0hEVV9IQUxUQ0FVU0VfRUJSRUFLOwogICAgICAgIGhhcnRfaGFsdF9yZXEgICAgICAgOiBoYXJ0X2hhbHRjYXVzZSA9IFNDUjFfSERVX0hBTFRDQVVTRV9ETVJFUTsKICAgICAgICBkbW9kZV9jYXVzZV9zc3RlcCAgIDogaGFydF9oYWx0Y2F1c2UgPSBTQ1IxX0hEVV9IQUxUQ0FVU0VfU1NURVA7CiAgICAgICAgZGVmYXVsdCAgICAgICAgICAgICA6IGhhcnRfaGFsdGNhdXNlID0gU0NSMV9IRFVfSEFMVENBVVNFX05PTkU7CiAgICBlbmRjYXNlCmVuZAoKLy8gSEFSVCBoYWx0IHN0YXR1cyByZWdpc3RlcgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYWx3YXlzX2ZmIEAocG9zZWRnZSBjbGssIG5lZ2VkZ2UgcnN0X24pIGJlZ2luCiAgICBpZiAofnJzdF9uKSBiZWdpbgogICAgICAgIGhhcnRfaGFsdHN0YXR1cyAgICAgICAgPD0gJzA7CiAgICBlbmQgZWxzZSBpZiAoaGFydF9oYWx0X2FjaykgYmVnaW4KICAgICAgICBoYXJ0X2hhbHRzdGF0dXMuZXhjZXB0IDw9IGRtb2RlX2NhdXNlX2V4Y2VwdDsKICAgICAgICBoYXJ0X2hhbHRzdGF0dXMuY2F1c2UgIDw9IGhhcnRfaGFsdGNhdXNlOwogICAgZW5kCmVuZAoKYXNzaWduIGhhcnRfaGFsdF9wbmQgPSAoZGZzbV90cmFucyB8IGRtX2RoYWx0X3JlcSkgJiB+aGFydF9oYWx0X2FjazsKYXNzaWduIGhhcnRfaGFsdF9hY2sgPSB+aGR1MmV4dV9kYmdfaGFsdGVkX28KICAgICAgICAgICAgICAgICAgICAgJiAoaGFsdF9yZXFfdGltZW91dF9mbGFnIHwgKH5waXBlMmhkdV9leHVfYnVzeV9pICYgZG1vZGVfY2F1c2VfYW55KSk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQcm9ncmFtIEJ1ZmZlciAoUEJVRikgbG9naWMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KIC8vIFByb2dyYW0gQnVmZmVyIGFsbG93cyB0byBleGVjdXRlIHNtYWxsIHByb2dyYW1zIGluIGRlYnVnIG1vZGUKLy8KCi8vIFRvIHRlcm1pbmF0ZSBQcm9ncmFtIEJ1ZmZlciBleGVjdXRpb24gZXhjZXB0aW9uIHNob3VsZCBiZSByYWlzZWQuIFRoZXJlIGFyZSAyCi8vIGNhc2VzOgovLyAtIE9uZSBvZiBQQlVGIGluc3RydWN0aW9ucyByYWlzZSBhbiBleGNlcHRpb24KLy8gLSBObyBQQlVGIGluc3RydWN0aW9uIHJhaXNlIGFuIGV4Y2VwdGlvbiBiZWZvcmUgdGhlIGxhc3QgUEJVRiBpbnN0cnVjdGlvbiBoYXMKLy8gYmVlbiBpc3N1ZWQuIEluIHRoaXMgY2FzZSBGU00gZ29lcyBpbnRvIEVYQ0lOSkVDVCBzdGF0ZSBhbmQgYW4gIkluc3RydWN0aW9uCi8vIGZldGNoIGFjY2VzcyBmYXVsdCIgZXhjZXB0aW9uIGlzIGluamVjdGVkCgovLyBQQlVGIEZTTQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYXNzaWduIGlmdV9oYW5kc2hha2VfZG9uZSA9IGhkdTJpZnVfcGJ1Zl9pbnN0cl92ZF9vICYgaWZ1MmhkdV9wYnVmX2luc3RyX3JkeV9pOwphc3NpZ24gcGJ1Zl9hZGRyX2VuZCAgICAgID0gKHBidWZfYWRkcl9mZiA9PSAoU0NSMV9IRFVfUEJVRl9BRERSX1NQQU4tMSkpOwoKYXNzaWduIHBidWZfc3RhcnRfZmV0Y2ggPSBkYmdfc3RhdGVfZGhhbHRlZCAgICAgICYgKGRiZ19zdGF0ZV9uZXh0ID09IFNDUjFfSERVX0RCR1NUQVRFX0RSVU4pOwphc3NpZ24gcGJ1Zl9leGNfaW5qX3JlcSA9IGlmdV9oYW5kc2hha2VfZG9uZSAgICAgJiBwYnVmX2FkZHJfZW5kOwphc3NpZ24gcGJ1Zl9leGNfaW5qX2VuZCA9IHBpcGUyaGR1X2V4dV9leGNfcmVxX2kgfCBpZnVfaGFuZHNoYWtlX2RvbmU7CgphbHdheXNfZmYgQChuZWdlZGdlIHJzdF9uLCBwb3NlZGdlIGNsaykgYmVnaW4KICAgIGlmICh+cnN0X24pIGJlZ2luCiAgICAgICAgcGJ1Zl9mc21fY3VyciA8PSBTQ1IxX0hEVV9QQlVGU1RBVEVfSURMRTsKICAgIGVuZCBlbHNlIGlmKGNsa19lbikgYmVnaW4KICAgICAgICBwYnVmX2ZzbV9jdXJyIDw9IHBidWZfZnNtX25leHQ7CiAgICBlbmQKZW5kCgphbHdheXNfY29tYiBiZWdpbgogICAgY2FzZSAocGJ1Zl9mc21fY3VycikKICAgICAgICBTQ1IxX0hEVV9QQlVGU1RBVEVfSURMRTogYmVnaW4KICAgICAgICAgICAgcGJ1Zl9mc21fbmV4dCA9IHBidWZfc3RhcnRfZmV0Y2ggICAgICAgPyBTQ1IxX0hEVV9QQlVGU1RBVEVfRkVUQ0gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTQ1IxX0hEVV9QQlVGU1RBVEVfSURMRTsKICAgICAgICBlbmQKICAgICAgICBTQ1IxX0hEVV9QQlVGU1RBVEVfRkVUQ0g6IGJlZ2luCiAgICAgICAgICAgIHBidWZfZnNtX25leHQgPSBwaXBlMmhkdV9leHVfZXhjX3JlcV9pID8gU0NSMV9IRFVfUEJVRlNUQVRFX1dBSVQ0RU5ECiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwYnVmX2V4Y19pbmpfcmVxICAgICAgID8gU0NSMV9IRFVfUEJVRlNUQVRFX0VYQ0lOSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNDUjFfSERVX1BCVUZTVEFURV9GRVRDSDsKICAgICAgICBlbmQKICAgICAgICBTQ1IxX0hEVV9QQlVGU1RBVEVfRVhDSU5KRUNUOiBiZWdpbgogICAgICAgICAgICBwYnVmX2ZzbV9uZXh0ID0gcGJ1Zl9leGNfaW5qX2VuZCAgICAgICA/IFNDUjFfSERVX1BCVUZTVEFURV9XQUlUNEVORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNDUjFfSERVX1BCVUZTVEFURV9FWENJTkpFQ1Q7CiAgICAgICAgZW5kCiAgICAgICAgU0NSMV9IRFVfUEJVRlNUQVRFX1dBSVQ0RU5EOiBiZWdpbgogICAgICAgICAgICBwYnVmX2ZzbV9uZXh0ID0gaGR1MmV4dV9kYmdfaGFsdGVkX28gICA/IFNDUjFfSERVX1BCVUZTVEFURV9JRExFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU0NSMV9IRFVfUEJVRlNUQVRFX1dBSVQ0RU5EOwogICAgICAgIGVuZAogICAgZW5kY2FzZQplbmQKCmFzc2lnbiBwYnVmX2ZzbV9pZGxlICAgPSAocGJ1Zl9mc21fY3VyciA9PSBTQ1IxX0hEVV9QQlVGU1RBVEVfSURMRSk7CmFzc2lnbiBwYnVmX2ZzbV9mZXRjaCAgPSAocGJ1Zl9mc21fY3VyciA9PSBTQ1IxX0hEVV9QQlVGU1RBVEVfRkVUQ0gpOwphc3NpZ24gcGJ1Zl9mc21fZXhjaW5qID0gKHBidWZfZnNtX2N1cnIgPT0gU0NSMV9IRFVfUEJVRlNUQVRFX0VYQ0lOSkVDVCk7CgovLyBQcm9ncmFtIEJ1ZmZlciBhZGRyZXNzIHJlZ2lzdGVyCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphc3NpZ24gcGJ1Zl9hZGRyX25leHRfdmQgPSBwYnVmX2ZzbV9mZXRjaCAgICAgICAgICAmIGlmdV9oYW5kc2hha2VfZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgJiB+cGlwZTJoZHVfZXh1X2V4Y19yZXFfaSAmIH5wYnVmX2FkZHJfZW5kOwoKYWx3YXlzX2ZmIEAobmVnZWRnZSByc3RfbiwgcG9zZWRnZSBjbGspIGJlZ2luCiAgICBpZiAofnJzdF9uKSBiZWdpbgogICAgICAgIHBidWZfYWRkcl9mZiA8PSAnMDsKICAgIGVuZCBlbHNlIGlmKGNsa19lbikgYmVnaW4KICAgICAgICBwYnVmX2FkZHJfZmYgPD0gcGJ1Zl9hZGRyX25leHQ7CiAgICBlbmQKZW5kCgphc3NpZ24gcGJ1Zl9hZGRyX25leHQgPSBwYnVmX2ZzbV9pZGxlICAgICA/ICcwCiAgICAgICAgICAgICAgICAgICAgICA6IHBidWZfYWRkcl9uZXh0X3ZkID8gcGJ1Zl9hZGRyX2ZmICsgMSdiMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBidWZfYWRkcl9mZjsKCi8vIFBhc3MgaW5zdHJ1Y3Rpb24gZnJvbSBkZWJ1ZyBwcm9ncmFtIGJ1ZmZlciB0byBjcHUgcGlwZWxpbmUgd2l0aCB0d28gb3B0aW9uczoKLy8gLSB0aHJvdWdoIHJlZ2lzdGVyLCBiZXR0ZXIgZm9yIGZyZXF1ZW5jeQovLyAtIHRocm91Z2ggd2lyZXMsIGJldHRlciBmb3IgYXJlYQpnZW5lcmF0ZSBpZiAoSEFSVF9QQlVGX0lOU1RSX1JFR09VVF9FTikgYmVnaW4KICAgIGFsd2F5c19mZiBAKHBvc2VkZ2UgY2xrLCBuZWdlZGdlIHJzdF9uKSBiZWdpbgogICAgICAgIGlmICh+cnN0X24pIGJlZ2luCiAgICAgICAgICAgIHBidWZfaW5zdHJfd2FpdF9sYXRjaGluZyA8PSAxJ2IwOwogICAgICAgIGVuZCBlbHNlIGJlZ2luCiAgICAgICAgICAgIHBidWZfaW5zdHJfd2FpdF9sYXRjaGluZyA8PSBpZnVfaGFuZHNoYWtlX2RvbmU7CiAgICAgICAgZW5kCiAgICBlbmQKZW5kIGVsc2UgYmVnaW4KICAgIGFzc2lnbiBwYnVmX2luc3RyX3dhaXRfbGF0Y2hpbmcgPSAxJ2IwOwplbmQgZW5kZ2VuZXJhdGUKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIERlYnVnIENTUnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFzc2lnbiBjc3JfdXBkX29uX2hhbHQgPSAoZGJnX3N0YXRlX3Jlc2V0IHwgZGJnX3N0YXRlX3J1bikKICAgICAgICAgICAgICAgICAgICAgICAmIChkYmdfc3RhdGVfbmV4dCA9PSBTQ1IxX0hEVV9EQkdTVEFURV9ESEFMVEVEKTsKCi8vIENTUnMgc2VsZWN0IGxvZ2ljCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphbHdheXNfY29tYiBiZWdpbiA6IGNzcl9pZl9yZWdzZWwKICAgIGNzcl9kY3NyX3NlbCAgICAgICAgPSAxJ2IwOwogICAgY3NyX2RwY19zZWwgICAgICAgICA9IDEnYjA7CiAgICBjc3JfZHNjcmF0Y2gwX3NlbCAgID0gMSdiMDsKICAgIC8vY3NyX2RzY3JhdGNoMV9zZWwgICA9IDEnYjA7CgogICAgaWYgKGNzcjJoZHVfcmVxX2kpIGJlZ2luCiAgICAgICAgY2FzZSAoY3NyMmhkdV9hZGRyX2kpCiAgICAgICAgICAgIFNDUjFfSERVX0RCR0NTUl9PRkZTX0RDU1IgICAgIDogY3NyX2Rjc3Jfc2VsICAgICAgPSAxJ2IxOwogICAgICAgICAgICBTQ1IxX0hEVV9EQkdDU1JfT0ZGU19EUEMgICAgICA6IGNzcl9kcGNfc2VsICAgICAgID0gMSdiMTsKICAgICAgICAgICAgU0NSMV9IRFVfREJHQ1NSX09GRlNfRFNDUkFUQ0gwOiBjc3JfZHNjcmF0Y2gwX3NlbCA9IDEnYjE7CiAgICAgICAgICAgIGRlZmF1bHQgOiBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9kY3NyX3NlbCAgICAgID0gMSdiWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JfZHBjX3NlbCAgICAgICA9IDEnYlg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyX2RzY3JhdGNoMF9zZWwgPSAxJ2JYOwogICAgICAgICAgICBlbmQKICAgICAgICBlbmRjYXNlCiAgICBlbmQKZW5kIDogY3NyX2lmX3JlZ3NlbAoKLy8gQ1NScyByZWFkIGludGVyZmFjZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYXNzaWduIGNzcl9yZF9kYXRhID0gY3NyX2Rjc3Jfb3V0IHwgY3NyX2RwY19vdXQgfCBjc3JfZHNjcmF0Y2gwX291dDsKCi8vIENTUnMgd3JpdGUgaW50ZXJmYWNlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphc3NpZ24gY3NyX3dyID0gY3NyMmhkdV9yZXFfaTsKCmFsd2F5c19jb21iIGJlZ2luIDogY3NyX2lmX3dyaXRlCiAgICBjc3Jfd3JfZGF0YSAgICAgPSAnMDsKCiAgICBpZiAoY3NyMmhkdV9yZXFfaSkgYmVnaW4KICAgICAgICBjYXNlIChjc3IyaGR1X2NtZF9pKQogICAgICAgICAgICBTQ1IxX0NTUl9DTURfV1JJVEUgOiBjc3Jfd3JfZGF0YSA9IGNzcjJoZHVfd2RhdGFfaTsKICAgICAgICAgICAgU0NSMV9DU1JfQ01EX1NFVCAgIDogY3NyX3dyX2RhdGEgPSBjc3JfcmRfZGF0YSB8IGNzcjJoZHVfd2RhdGFfaTsKICAgICAgICAgICAgU0NSMV9DU1JfQ01EX0NMRUFSIDogY3NyX3dyX2RhdGEgPSBjc3JfcmRfZGF0YSAmICh+Y3NyMmhkdV93ZGF0YV9pKTsKICAgICAgICAgICAgZGVmYXVsdCAgICAgICAgICAgIDogY3NyX3dyX2RhdGEgPSAnWDsKICAgICAgICBlbmRjYXNlCiAgICBlbmQKZW5kIDogY3NyX2lmX3dyaXRlCgovLyBEZWJ1ZyBDb250cm9sIGFuZCBTdGF0dXMgcmVnaXN0ZXIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU2V0dXBzIHRoZSBIQVJUIGJlaGF2aW91ciBpbiBEZWJ1ZyBNb2RlIGFuZCBob2xkcyBEZWJ1ZyBzdGF0dXMgaW5mb3JtYXRpb24KCmFsd2F5c19jb21iIGJlZ2luCiAgICBjc3JfZGNzcl9pbiAgICAgICAgICAgICAgICAgPSBjc3Jfd3JfZGF0YTsKICAgIGNzcl9kY3NyX3dyICAgICAgICAgICAgICAgICA9IGNzcl93ciAmIGNzcl9kY3NyX3NlbDsKCiAgICBjc3JfZGNzcl9vdXQgICAgICAgICAgICAgICAgPSAnMDsKICAgIGlmIChjc3JfZGNzcl9zZWwpIGJlZ2luCiAgICAgICAgY3NyX2Rjc3Jfb3V0LnhkZWJ1Z3ZlciAgPSBTQ1IxX0hEVV9ERUJVR0NTUl9EQ1NSX1hERUJVR1ZFUjsKICAgICAgICBjc3JfZGNzcl9vdXQuZWJyZWFrbSAgICA9IGNzcl9kY3NyX2VicmVha207CiAgICAgICAgY3NyX2Rjc3Jfb3V0LnN0ZXBpZSAgICAgPSBjc3JfZGNzcl9zdGVwaWU7CiAgICAgICAgY3NyX2Rjc3Jfb3V0LnN0ZXAgICAgICAgPSBjc3JfZGNzcl9zdGVwOwogICAgICAgIGNzcl9kY3NyX291dC5wcnYgICAgICAgID0gMidiMTE7CiAgICAgICAgY3NyX2Rjc3Jfb3V0LmNhdXNlICAgICAgPSBjc3JfZGNzcl9jYXVzZTsKICAgIGVuZAplbmQKCmFsd2F5c19mZiBAKG5lZ2VkZ2UgcnN0X24sIHBvc2VkZ2UgY2xrKSBiZWdpbgogICAgaWYgKH5yc3RfbikgYmVnaW4KICAgICAgICBjc3JfZGNzcl9lYnJlYWttICAgICAgICA8PSAxJ2IwOwogICAgICAgIGNzcl9kY3NyX3N0ZXBpZSAgICAgICAgIDw9IDEnYjA7CiAgICAgICAgY3NyX2Rjc3Jfc3RlcCAgICAgICAgICAgPD0gMSdiMDsKICAgIGVuZCBlbHNlIGlmKGNsa19lbikgYmVnaW4KICAgICAgICBpZiAoY3NyX2Rjc3Jfd3IpIGJlZ2luCiAgICAgICAgICAgIGNzcl9kY3NyX2VicmVha20gICAgPD0gY3NyX2Rjc3JfaW4uZWJyZWFrbTsKICAgICAgICAgICAgY3NyX2Rjc3Jfc3RlcGllICAgICA8PSBjc3JfZGNzcl9pbi5zdGVwaWU7CiAgICAgICAgICAgIGNzcl9kY3NyX3N0ZXAgICAgICAgPD0gY3NyX2Rjc3JfaW4uc3RlcDsKICAgICAgICBlbmQKICAgIGVuZAplbmQKCmFsd2F5c19mZiBAKG5lZ2VkZ2UgcnN0X24sIHBvc2VkZ2UgY2xrKSBiZWdpbgogICAgaWYgKH5yc3RfbikgYmVnaW4KICAgICAgICBjc3JfZGNzcl9jYXVzZSA8PSAxJ2IwOwogICAgZW5kIGVsc2UgaWYoY2xrX2VuKSBiZWdpbgogICAgICAgIGlmKGNzcl91cGRfb25faGFsdCkgYmVnaW4KICAgICAgICAgICAgY3NyX2Rjc3JfY2F1c2UgPD0gaGFydF9oYWx0c3RhdHVzLmNhdXNlOwogICAgICAgIGVuZAogICAgZW5kCmVuZAoKLy8gRGVidWcgUEMgcmVnaXN0ZXIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU2F2ZXMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIERlYnVnCi8vIE1vZGUgaXMgZW50ZXJlZC4gQ291bGQgYmUgY2hhbmdlZCBieSBkZWJ1Z2dlcgoKYXNzaWduIGNzcl9kcGNfd3IgICA9IGNzcl93ciAmIGNzcl9kcGNfc2VsOwoKYWx3YXlzX2ZmIEAocG9zZWRnZSBjbGssIG5lZ2VkZ2UgcnN0X24pIGJlZ2luCiAgICBpZiAofnJzdF9uKSBiZWdpbgogICAgICAgIGNzcl9kcGNfZmYgPD0gJzA7CiAgICBlbmQgZWxzZSBpZihjbGtfZW4pIGJlZ2luCiAgICAgICAgY3NyX2RwY19mZiA8PSBjc3JfZHBjX25leHQ7CiAgICBlbmQKZW5kCgphc3NpZ24gY3NyX2RwY19uZXh0ID0gY3NyX3VwZF9vbl9oYWx0ID8gcGlwZTJoZHVfcGNfY3Vycl9pCiAgICAgICAgICAgICAgICAgICAgOiBjc3JfZHBjX3dyICAgICAgPyBjc3Jfd3JfZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3NyX2RwY19mZjsKYXNzaWduIGNzcl9kcGNfb3V0ICA9IGNzcl9kcGNfc2VsICAgICA/IGNzcl9kcGNfZmYgOiAnMDsKCi8vIERlYnVnIFNjcmF0Y2ggMCByZWdpc3RlcgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYXNzaWduIGNzcl9kc2NyYXRjaDBfcmVzcCA9ICh+ZG0yaGR1X2RyZWdfcmVzcF9pIHwgZG0yaGR1X2RyZWdfZmFpbF9pKQogICAgICAgICAgICAgICAgICAgICAgICAgID8gU0NSMV9DU1JfUkVTUF9FUgogICAgICAgICAgICAgICAgICAgICAgICAgIDogU0NSMV9DU1JfUkVTUF9PSzsKYXNzaWduIGNzcl9kc2NyYXRjaDBfb3V0ICA9IGNzcl9kc2NyYXRjaDBfc2VsID8gZG0yaGR1X2RyZWdfcmRhdGFfaSA6ICcwOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSERVIDwtPiBETSBpbnRlcmZhY2UKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFzc2lnbiBoZHUyZG1faGFydF9ldmVudF9vID0gZGZzbV9ldmVudDsKCi8vIEhBUlQgc3RhdHVzCmFsd2F5c19jb21iIGJlZ2luCiAgICBoZHUyZG1faGFydF9zdGF0dXNfbyAgICAgICAgICAgPSAnMDsKICAgIGhkdTJkbV9oYXJ0X3N0YXR1c19vLmRiZ19zdGF0ZSA9IGRiZ19zdGF0ZTsKICAgIGhkdTJkbV9oYXJ0X3N0YXR1c19vLmV4Y2VwdCAgICA9IGRiZ19zdGF0ZV9kaGFsdGVkICYgaGFydF9oYWx0c3RhdHVzLmV4Y2VwdDsKICAgIGhkdTJkbV9oYXJ0X3N0YXR1c19vLmVicmVhayAgICA9IGRiZ19zdGF0ZV9kaGFsdGVkICYgKGhhcnRfaGFsdHN0YXR1cy5jYXVzZSA9PSBTQ1IxX0hEVV9IQUxUQ0FVU0VfRUJSRUFLKTsKZW5kCgphc3NpZ24gaGR1MmRtX2NtZF9yY29kZV9vID0gZGJnX3N0YXRlX3Jlc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgPyB+cGlwZTJoZHVfcmRjX3FsZnlfaSB8IH5waXBlMmhkdV9pbml0X3BjX2kgfCB+ZG0yaGR1X2NtZF9yZXFfaQogICAgICAgICAgICAgICAgICAgICAgICAgIDogfnBpcGUyaGR1X3JkY19xbGZ5X2kgfCB+ZGZzbV91cGRhdGU7CgphbHdheXNfY29tYiBiZWdpbgogICAgaGR1MmRtX2NtZF9yZXNwX28gICA9IDEnYjA7CgogICAgY2FzZSAoZGJnX3N0YXRlKQogICAgICAgIFNDUjFfSERVX0RCR1NUQVRFX1JFU0VUOiBiZWdpbgogICAgICAgICAgICBoZHUyZG1fY21kX3Jlc3BfbyAgPSBwaXBlMmhkdV9yZGNfcWxmeV9pICYgcGlwZTJoZHVfaW5pdF9wY19pICYgZG0yaGR1X2NtZF9yZXFfaTsKICAgICAgICBlbmQKCiAgICAgICAgU0NSMV9IRFVfREJHU1RBVEVfUlVOOiBiZWdpbgogICAgICAgICAgICBoZHUyZG1fY21kX3Jlc3BfbyAgPSBwaXBlMmhkdV9yZGNfcWxmeV9pICYgZGZzbV91cGRhdGUgJiBkbTJoZHVfY21kX3JlcV9pOwogICAgICAgIGVuZAoKICAgICAgICBTQ1IxX0hEVV9EQkdTVEFURV9ESEFMVEVEOiBiZWdpbgogICAgICAgICAgICBoZHUyZG1fY21kX3Jlc3BfbyAgPSBwaXBlMmhkdV9yZGNfcWxmeV9pID8gZGZzbV91cGRhdGUgOiBkbTJoZHVfY21kX3JlcV9pOwogICAgICAgIGVuZAoKICAgICAgICBTQ1IxX0hEVV9EQkdTVEFURV9EUlVOOiBiZWdpbgogICAgICAgICAgICBoZHUyZG1fY21kX3Jlc3BfbyAgPSAofnBpcGUyaGR1X3JkY19xbGZ5X2kgfCBkZnNtX3VwZGF0ZSkgJiBkbTJoZHVfY21kX3JlcV9pOwogICAgICAgIGVuZAoKICAgICAgICBkZWZhdWx0OiBiZWdpbgogICAgICAgICAgICBoZHUyZG1fY21kX3Jlc3BfbyAgPSAnWDsKICAgICAgICBlbmQKICAgIGVuZGNhc2UKZW5kCgphc3NpZ24gaGR1MmRtX3BidWZfYWRkcl9vICA9IHBidWZfYWRkcl9mZjsKYXNzaWduIGhkdTJkbV9kcmVnX3JlcV9vICAgPSBjc3JfZHNjcmF0Y2gwX3NlbDsKYXNzaWduIGhkdTJkbV9kcmVnX3dyX28gICAgPSBjc3Jfd3IgJiBjc3JfZHNjcmF0Y2gwX3NlbDsKYXNzaWduIGhkdTJkbV9kcmVnX3dkYXRhX28gPSBjc3Jfd3JfZGF0YTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEhEVSA8LT4gRVhVIGludGVyZmFjZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYXNzaWduIGhkdTJleHVfZGJnX2hhbHRlZF9vICAgID0gKGRiZ19zdGF0ZV9uZXh0ID09IFNDUjFfSERVX0RCR1NUQVRFX0RIQUxURUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICh+cGlwZTJoZHVfcmRjX3FsZnlfaSAmIH5kYmdfc3RhdGVfcnVuKTsKYXNzaWduIGhkdTJleHVfZGJnX3J1bl9zdGFydF9vID0gZGJnX3N0YXRlX2RoYWx0ZWQgJiBwaXBlMmhkdV9yZGNfcWxmeV9pICYgZGZzbV91cGRhdGU7CmFzc2lnbiBoZHUyZXh1X2RiZ19oYWx0MnJ1bl9vICA9IGhkdTJleHVfZGJnX2hhbHRlZF9vICYgaGFydF9yZXN1bWVfcmVxCmBpZmRlZiBTQ1IxX0NMS0NUUkxfRU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgY2xrX3BpcGVfZW4KYGVuZGlmIC8vIFNDUjFfQ0xLQ1RSTF9FTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwphc3NpZ24gaGR1MmV4dV9kYmdfcnVuMmhhbHRfbyAgPSBoYXJ0X2hhbHRfYWNrOwoKYXNzaWduIGhkdTJleHVfcGJ1Zl9mZXRjaF9vICAgID0gaGFydF9ydW5jdHJsLmZldGNoX3NyYzsKYXNzaWduIGhkdTJleHVfaXJxX2RzYmxfbyAgICAgID0gaGFydF9ydW5jdHJsLmlycV9kc2JsOwphc3NpZ24gaGR1MmV4dV9wY19hZHZtdF9kc2JsX28gPSBoYXJ0X3J1bmN0cmwucGNfYWR2bXRfZHNibDsKLy8gTm8gY2hhbmdlIGluIGFyY2guIHN0YXRlIGlmIGRtb2RlIGNhdXNlZCBieSBicmVha3BvaW50CmFzc2lnbiBoZHUyZXh1X25vX2NvbW1pdF9vICAgICA9IGRtb2RlX2NhdXNlX2VicmVhawpgaWZkZWYgU0NSMV9URFVfRU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZG1vZGVfY2F1c2VfdG1yZXEKYGVuZGlmIC8vIFNDUjFfVERVX0VOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CmFzc2lnbiBoZHUyZXh1X2Rtb2RlX3NzdGVwX2VuX28gPSBoYXJ0X3J1bmN0cmwucmVkaXJlY3Quc3N0ZXA7CmFzc2lnbiBoZHUyZXh1X2RiZ19uZXdfcGNfbyAgICAgPSBjc3JfZHBjX2ZmOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSERVIDwtPiBJRlUgaW50ZXJmYWNlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphc3NpZ24gaGR1MmlmdV9wYnVmX2luc3RyX3ZkX28gID0gKHBidWZfZnNtX2ZldGNoIHwgcGJ1Zl9mc21fZXhjaW5qKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgfnBidWZfaW5zdHJfd2FpdF9sYXRjaGluZzsKYXNzaWduIGhkdTJpZnVfcGJ1Zl9pbnN0cl9lcnJfbyA9IHBidWZfZnNtX2V4Y2luajsKCmdlbmVyYXRlIGlmIChIQVJUX1BCVUZfSU5TVFJfUkVHT1VUX0VOKSBiZWdpbgogICAgYWx3YXlzX2ZmIEAocG9zZWRnZSBjbGspIGJlZ2luCiAgICAgICAgaGR1MmlmdV9wYnVmX2luc3RyX28gPD0gZG0yaGR1X3BidWZfaW5zdHJfaTsKICAgIGVuZAplbmQgZWxzZSBiZWdpbgogICAgYXNzaWduIGhkdTJpZnVfcGJ1Zl9pbnN0cl9vID0gZG0yaGR1X3BidWZfaW5zdHJfaTsKZW5kIGVuZGdlbmVyYXRlCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBIRFUgPC0+IENTUiBpbnRlcmZhY2UKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFzc2lnbiBjc3JfYWRkcl9kc2NyYXRjaDAgPSAoY3NyMmhkdV9hZGRyX2kgPT0gU0NSMV9IRFVfREJHQ1NSX09GRlNfRFNDUkFUQ0gwKTsKCmFzc2lnbiBoZHUyY3NyX3Jlc3BfbyAgPSB+ZGJnX3N0YXRlX2RydW4gICAgPyBTQ1IxX0NTUl9SRVNQX0VSCiAgICAgICAgICAgICAgICAgICAgICAgOiBjc3JfYWRkcl9kc2NyYXRjaDAgPyBjc3JfZHNjcmF0Y2gwX3Jlc3AKICAgICAgICAgICAgICAgICAgICAgICA6IGNzcjJoZHVfcmVxX2kgICAgICA/IFNDUjFfQ1NSX1JFU1BfT0sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNDUjFfQ1NSX1JFU1BfRVI7CmFzc2lnbiBoZHUyY3NyX3JkYXRhX28gPSBjc3JfcmRfZGF0YTsKCmBpZmRlZiBTQ1IxX1REVV9FTgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBIRFUgPC0+IFREVSBpbnRlcmZhY2UKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFzc2lnbiBoZHUydGR1X2h3YnJrX2RzYmxfbyA9IGhhcnRfcnVuY3RybC5od2Jya3B0X2RzYmw7CmBlbmRpZiAvLyBTQ1IxX1REVV9FTgoKYGlmZGVmIFNDUjFfVFJHVF9TSU1VTEFUSU9OCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBc3NlcnRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTVkFfSERVX1hDSEVDS19DT01NT04gOgogICAgYXNzZXJ0IHByb3BlcnR5ICgKICAgICAgICBAKG5lZ2VkZ2UgY2xrKSBkaXNhYmxlIGlmZiAofnJzdF9uKQogICAgICAgICEkaXN1bmtub3duKCB7cnN0X24sY2xrLGNsa19lbixjc3IyaGR1X3JlcV9pLHBpcGUyaGR1X3JkY19xbGZ5X2l9ICkKICAgICkKICAgIGVsc2UgJGVycm9yKCJIRFUgRXJyb3I6IGNvbW1vbiBzaWduYWxzIGFyZSBpbiBYIHN0YXRlIik7CgpTVkFfSERVX1hDSEVDS19DU1JfSU5URiA6CiAgICBhc3NlcnQgcHJvcGVydHkgKAogICAgICAgIEAobmVnZWRnZSBjbGspIGRpc2FibGUgaWZmICh+cnN0X24pCiAgICAgICAgY3NyMmhkdV9yZXFfaSB8LT4gISRpc3Vua25vd24oIHtjc3IyaGR1X2NtZF9pLGNzcjJoZHVfYWRkcl9pLGNzcjJoZHVfd2RhdGFfaX0gKQogICAgKQogICAgZWxzZSAkZXJyb3IoIkhEVSBFcnJvcjogQ1NSIGkvZiBpcyBpbiBYIHN0YXRlIik7CgpTVkFfSERVX1hDSEVDS19ETV9JTlRGIDoKICAgIGFzc2VydCBwcm9wZXJ0eSAoCiAgICAgICAgQChuZWdlZGdlIGNsaykgZGlzYWJsZSBpZmYgKH5yc3RfbikKICAgICAgICAhJGlzdW5rbm93bigge2RtMmhkdV9jbWRfcmVxX2ksZG0yaGR1X2NtZF9pLGRtMmhkdV9kcmVnX3Jlc3BfaSwKICAgICAgICBkbTJoZHVfZHJlZ19mYWlsX2l9ICkKICAgICkKICAgIGVsc2UgJGVycm9yKCJIRFUgRXJyb3I6IERNIGkvZiBpcyBpbiBYIHN0YXRlIik7CgpTVkFfSERVX1hDSEVDS19URFVfSU5URiA6CiAgICBhc3NlcnQgcHJvcGVydHkgKAogICAgICAgIEAobmVnZWRnZSBjbGspIGRpc2FibGUgaWZmICh+cnN0X24pCiAgICAgICAgISRpc3Vua25vd24oIHt0ZHUyaGR1X2Rtb2RlX3JlcV9pLGV4dTJoZHVfaWJya3B0X2h3X2l9ICkKICAgICkKICAgIGVsc2UgJGVycm9yKCJIRFUgRXJyb3I6IFREVSBpL2YgaXMgaW4gWCBzdGF0ZSIpOwoKU1ZBX0hEVV9YQ0hFQ0tfSEFSVF9JTlRGIDoKICAgIGFzc2VydCBwcm9wZXJ0eSAoCiAgICAgICAgQChuZWdlZGdlIGNsaykgZGlzYWJsZSBpZmYgKH5yc3RfbikKICAgICAgICAhJGlzdW5rbm93bigge3BpcGUyaGR1X2V4dV9idXN5X2kscGlwZTJoZHVfaW5zdHJldF9pLHBpcGUyaGR1X2luaXRfcGNfaSxwaXBlMmhkdV9leHVfZXhjX3JlcV9pLHBpcGUyaGR1X2Jya3B0X2ksCiAgICAgICAgcGlwZTJoZHVfcGNfY3Vycl9pLGlmdTJoZHVfcGJ1Zl9pbnN0cl9yZHlfaX0gKQogICAgKQogICAgZWxzZSAkZXJyb3IoIkhEVSBFcnJvcjogSEFSVCBpL2YgaXMgaW4gWCBzdGF0ZSIpOwoKYGVuZGlmIC8vIFNDUjFfVFJHVF9TSU1VTEFUSU9OCgplbmRtb2R1bGUgOiBzY3IxX3BpcGVfaGR1CgpgZW5kaWYgLy8gU0NSMV9EQkdfRU4K