PGh0bWw+CjxoZWFkPgogPHRpdGxlPgogemxpYiBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeSB2ZXJzaW9uIDEuMS40CiA8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IGJnY29sb3I9IldoaXRlIiB0ZXh0PSJCbGFjayIgdmxpbms9IlJlZCIgYWxpbms9Ik5hdnkiIGxpbms9IlJlZCI+CjwhLS0gYmFja2dyb3VuZD0iemxpYmJnLmdpZiIgLS0+Cgo8aDE+IHpsaWIgMS4xLjQgTWFudWFsIDwvaDE+Cjxocj4KPGEgbmFtZT0iQ29udGVudHMiPjxoMj5Db250ZW50czwvaDI+CjxvbCB0eXBlPSJJIj4KPGxpPiA8YSBocmVmPSIjUHJvbG9ndWUiPlByb2xvZ3VlPC9hPgo8bGk+IDxhIGhyZWY9IiNJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT4KPGxpPiA8YSBocmVmPSIjVXRpbGl0eSBmdW5jdGlvbnMiPlV0aWxpdHkgZnVuY3Rpb25zPC9hPgo8bGk+IDxhIGhyZWY9IiNCYXNpYyBmdW5jdGlvbnMiPkJhc2ljIGZ1bmN0aW9uczwvYT4KPGxpPiA8YSBocmVmPSIjQWR2YW5jZWQgZnVuY3Rpb25zIj5BZHZhbmNlZCBmdW5jdGlvbnM8L2E+CjxsaT4gPGEgaHJlZj0iI0NvbnN0YW50cyI+Q29uc3RhbnRzPC9hPgo8bGk+IDxhIGhyZWY9IiNzdHJ1Y3Qgel9zdHJlYW1fcyI+c3RydWN0IHpfc3RyZWFtX3M8L2E+CjxsaT4gPGEgaHJlZj0iI0NoZWNrc3VtIGZ1bmN0aW9ucyI+Q2hlY2tzdW0gZnVuY3Rpb25zPC9hPgo8bGk+IDxhIGhyZWY9IiNNaXNjIj5NaXNjPC9hPgo8L29sPgo8aHI+CjxhIG5hbWU9IlByb2xvZ3VlIj48aDI+IFByb2xvZ3VlIDwvaDI+CiAgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHZlcnNpb24gMS4xLjQsIE1hcmNoIDExdGgsIDIwMDIKICA8cD4KICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCiAgPHA+CiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KICA8cD4KICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgogIDxvbD4KICAgPGxpPiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgIDxsaT4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgIDxsaT4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICA8L29sPgoKICA8ZGw+CiAgPGR0PkplYW4tbG91cCBHYWlsbHkgICAgICAgIAogIDxkZD48YSBocmVmPSJtYWlsdG86amxvdXBAZ3ppcC5vcmciPmpsb3VwQGd6aXAub3JnPC9hPgogIDxkdD5NYXJrIEFkbGVyCiAgPGRkPjxhIGhyZWY9Im1haWx0bzptYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ij5tYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PC9hPgogIDwvZGw+CgogIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCiAgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMKICA8YSBocmVmPSJmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTAudHh0Ij4KICBmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTAudHh0IDwvYT4KICAoemxpYiBmb3JtYXQpLCAKICA8YSBocmVmPSJmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTEudHh0Ij4KICByZmMxOTUxLnR4dCA8L2E+CiAgKDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBmb3JtYXQpIGFuZCAKICA8YSBocmVmPSJmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTIudHh0Ij4KICByZmMxOTUyLnR4dCA8L2E+CiAgKGd6aXAgZm9ybWF0KS4KICA8cD4KICBUaGlzIG1hbnVhbCBpcyBjb252ZXJ0ZWQgZnJvbSB6bGliLmggYnkgCiAgPGEgaHJlZj0ibWFpbHRvOnBpYWlwQGNzaWUubnR1LmVkdS50dyI+IHBpYWlwIDwvYT4KICA8cD4KICBWaXNpdCA8YSBocmVmPSJodHRwOi8vZnRwLmNkcm9tLmNvbS9wdWIvaW5mb3ppcC96bGliLyI+CiAgaHR0cDovL2Z0cC5jZHJvbS5jb20vcHViL2luZm96aXAvemxpYi88L2E+IAogIGZvciB0aGUgb2ZmaWNpYWwgemxpYiB3ZWIgcGFnZS4KICA8cD4KCjxocj4KPGEgbmFtZT0iSW50cm9kdWN0aW9uIj48aDI+IEludHJvZHVjdGlvbiA8L2gyPgogICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCiAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQKICBkYXRhLiAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZAogIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZQogIHN0cmVhbSBpbnRlcmZhY2UuCiAgPHA+CgogICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCiAgZW5vdWdoIChmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLCBvciBjYW4gYmUgZG9uZSBieQogIHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCiAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAogIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCiAgPHA+CgogICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAogIHdpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpby4KICA8cD4KCiAgICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuIFRoZSBkZWNvZGVyIGNoZWNrcwogIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIKICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgogIDxwPgoKPGhyPgo8YSBuYW1lPSJVdGlsaXR5IGZ1bmN0aW9ucyI+PGgyPiBVdGlsaXR5IGZ1bmN0aW9ucyA8L2gyPgogICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUKICAgPGEgaHJlZj0iI0Jhc2ljIGZ1bmN0aW9ucyI+YmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9uczwvYT4uIAogICBUbyBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlLCBzb21lCiAgIGRlZmF1bHQgb3B0aW9ucyBhcmUgYXNzdW1lZCAoY29tcHJlc3Npb24gbGV2ZWwgYW5kIG1lbW9yeSB1c2FnZSwKICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCiAgIHV0aWxpdHkgZnVuY3Rpb25zIGNhbiBlYXNpbHkgYmUgbW9kaWZpZWQgaWYgeW91IG5lZWQgc3BlY2lhbCBvcHRpb25zLgo8aDM+IEZ1bmN0aW9uIGxpc3QgPC9oMz4KPHVsPgo8bGk+IGludCAgPGEgaHJlZj0iI2NvbXByZXNzIj5jb21wcmVzczwvYT4gKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKTsKPGxpPiBpbnQgIDxhIGhyZWY9IiNjb21wcmVzczIiPmNvbXByZXNzMjwvYT4gKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuLCBpbnQgbGV2ZWwpOwo8bGk+IGludCAgPGEgaHJlZj0iI3VuY29tcHJlc3MiPnVuY29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7CjxsaT4gdHlwZWRlZiB2b2lkcCBnekZpbGU7CjxsaT4gIGd6RmlsZSAgPGEgaHJlZj0iI2d6b3BlbiI+Z3pvcGVuPC9hPiAgKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpOwo8bGk+IGd6RmlsZSAgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+ICAoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKTsKPGxpPiBpbnQgIDxhIGhyZWY9IiNnenNldHBhcmFtcyI+Z3pzZXRwYXJhbXM8L2E+IChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpOwo8bGk+IGludCAgICAgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiAgKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7CjxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3p3cml0ZSI+Z3p3cml0ZTwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7CjxsaT4gaW50IFZBICAgPGEgaHJlZj0iI2d6cHJpbnRmIj5nenByaW50ZjwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CjxsaT4gaW50ICA8YSBocmVmPSIjZ3pwdXRzIj5nenB1dHM8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcyk7CjxsaT4gY2hhciAqICA8YSBocmVmPSIjZ3pnZXRzIj5nemdldHM8L2E+IChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKTsKPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnenB1dGMiPmd6cHV0YzwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgYyk7CjxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pnZXRjIj5nemdldGM8L2E+IChnekZpbGUgZmlsZSk7CjxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pmbHVzaCI+Z3pmbHVzaDwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpOwo8bGk+IHpfb2ZmX3QgICAgIDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4gKGd6RmlsZSBmaWxlLCB6X29mZl90IG9mZnNldCwgaW50IHdoZW5jZSk7CjxsaT4gel9vZmZfdCAgICAgPGEgaHJlZj0iI2d6dGVsbCI+Z3p0ZWxsPC9hPiAoZ3pGaWxlIGZpbGUpOwo8bGk+IGludCAgICAgPGEgaHJlZj0iI2d6cmV3aW5kIj5nenJld2luZDwvYT4gKGd6RmlsZSBmaWxlKTsKPGxpPiBpbnQgIDxhIGhyZWY9IiNnemVvZiI+Z3plb2Y8L2E+IChnekZpbGUgZmlsZSk7CjxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pjbG9zZSI+Z3pjbG9zZTwvYT4gKGd6RmlsZSBmaWxlKTsKPGxpPiBjb25zdCBjaGFyICogIDxhIGhyZWY9IiNnemVycm9yIj5nemVycm9yPC9hPiAoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKTsKPC91bD4KPGgzPiBGdW5jdGlvbiBkZXNjcmlwdGlvbiA8L2gzPgo8ZGw+Cjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iY29tcHJlc3MiPmNvbXByZXNzPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pOzwvZm9udD4KPGRkPgogICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCiAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4KICAgc291cmNlTGVuIHBsdXMgMTIgYnl0ZXMuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCiAgIGNvbXByZXNzZWQgYnVmZmVyLjxwPgogICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gPGEgaHJlZj0iI2NvbXByZXNzIj5jb21wcmVzczwvYT4gYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCiAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC48cD4KICAgICA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90CiAgIGVub3VnaCBtZW1vcnksIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAogICBidWZmZXIuPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImNvbXByZXNzMiI+Y29tcHJlc3MyPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sIGludCBsZXZlbCk7PC9mb250Pgo8ZGQ+CiAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIFRoZSBsZXZlbAogICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4uICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQogICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgMC4xJSBsYXJnZXIgdGhhbiBzb3VyY2VMZW4gcGx1cwogICAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCiAgIDxwPgoKICAgICA8YSBocmVmPSIjY29tcHJlc3MyIj5jb21wcmVzczI8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCiAgIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwKICAgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0idW5jb21wcmVzcyI+dW5jb21wcmVzczwvYT4gKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKTs8L2ZvbnQ+CjxkZD4KICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCiAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQogICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCiAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgogICBieSBzb21lIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKQogICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4gPHA+CiAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZWNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQogICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCiAgIDxwPgoKICAgICA8YSBocmVmPSIjdW5jb21wcmVzcyI+dW5jb21wcmVzczwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAogICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKICAgYnVmZmVyLCBvciA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQuCiAgIDxwPgoKPGR0PiB0eXBlZGVmIHZvaWRwIGd6RmlsZTsKPGRkPiA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBnekZpbGUgIDxhIG5hbWU9Imd6b3BlbiI+Z3pvcGVuPC9hPiAgKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpOzwvZm9udD4KPGRkPgogICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgogICBpcyBhcyBpbiBmb3BlbiAoInJiIiBvciAid2IiKSBidXQgY2FuIGFsc28gaW5jbHVkZSBhIGNvbXByZXNzaW9uIGxldmVsCiAgICgid2I5Iikgb3IgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvcgogICBIdWZmbWFuIG9ubHkgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLiAoU2VlIHRoZSBkZXNjcmlwdGlvbgogICBvZiA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKQogICA8cD4KCiAgICAgPGEgaHJlZj0iI2d6b3BlbiI+Z3pvcGVuPC9hPiBjYW4gYmUgdXNlZCB0byByZWFkIGEgZmlsZSB3aGljaCBpcyBub3QgaW4gZ3ppcCBmb3JtYXQgOyBpbiB0aGlzCiAgIGNhc2UgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiB3aWxsIGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgZmlsZSB3aXRob3V0IGRlY29tcHJlc3Npb24uCiAgIDxwPgoKICAgICA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+IHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIG9yIGlmIHRoZXJlIHdhcwogICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gOyBlcnJubwogICBjYW4gYmUgY2hlY2tlZCB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUKICAgemxpYiBlcnJvciBpcyA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPikuCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gZ3pGaWxlICA8YSBuYW1lPSJnemRvcGVuIj5nemRvcGVuPC9hPiAgKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSk7PC9mb250Pgo8ZGQ+CiAgICAgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+KCkgYXNzb2NpYXRlcyBhIGd6RmlsZSB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IgZmQuICBGaWxlCiAgIGRlc2NyaXB0b3JzIGFyZSBvYnRhaW5lZCBmcm9tIGNhbGxzIGxpa2Ugb3BlbiwgZHVwLCBjcmVhdCwgcGlwZSBvcgogICBmaWxlbm8gKGluIHRoZSBmaWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLgogICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgYXMgaW4gPGEgaHJlZj0iI2d6b3BlbiI+Z3pvcGVuPC9hPi4KICAgPHA+CiAgICAgVGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjZ3pjbG9zZSI+Z3pjbG9zZTwvYT4gb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlCiAgIGZpbGUgZGVzY3JpcHRvciBmZCwganVzdCBsaWtlIGZjbG9zZShmZG9wZW4oZmQpLCBtb2RlKSBjbG9zZXMgdGhlIGZpbGUKICAgZGVzY3JpcHRvciBmZC4gSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+KGR1cChmZCksIG1vZGUpLgogICA8cD4KICAgICA8YSBocmVmPSIjZ3pkb3BlbiI+Z3pkb3BlbjwvYT4gcmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlCiAgIHRoZSAoZGUpY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJnenNldHBhcmFtcyI+Z3pzZXRwYXJhbXM8L2E+IChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpOzwvZm9udD4KPGRkPgogICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuIFNlZSB0aGUgZGVzY3JpcHRpb24KICAgb2YgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlc2UgcGFyYW1ldGVycy4KICAgPHA+CiAgICAgPGEgaHJlZj0iI2d6c2V0cGFyYW1zIj5nenNldHBhcmFtczwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2Vzcywgb3IgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIGZpbGUgd2FzIG5vdAogICBvcGVuZWQgZm9yIHdyaXRpbmcuCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnenJlYWQiPmd6cmVhZDwvYT4gIChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pOzwvZm9udD4KPGRkPgogICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KICAgSWYgdGhlIGlucHV0IGZpbGUgd2FzIG5vdCBpbiBnemlwIGZvcm1hdCwgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiBjb3BpZXMgdGhlIGdpdmVuIG51bWJlcgogICBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCiAgIDxwPgogICAgIDxhIGhyZWY9IiNnenJlYWQiPmd6cmVhZDwvYT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkICgwIGZvcgogICBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4KICAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6d3JpdGUiPmd6d3JpdGU8L2E+IChnekZpbGUgZmlsZSwgY29uc3Qgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pOzwvZm9udD4KPGRkPgogICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCiAgIDxhIGhyZWY9IiNnendyaXRlIj5nendyaXRlPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4KICAgKDAgaW4gY2FzZSBvZiBlcnJvcikuCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50IFZBICAgPGEgbmFtZT0iZ3pwcmludGYiPmd6cHJpbnRmPC9hPiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTs8L2ZvbnQ+CjxkZD4KICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCiAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuIDxhIGhyZWY9IiNnenByaW50ZiI+Z3pwcmludGY8L2E+IHJldHVybnMgdGhlIG51bWJlciBvZgogICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiAoMCBpbiBjYXNlIG9mIGVycm9yKS4KICAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9Imd6cHV0cyI+Z3pwdXRzPC9hPiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKnMpOzwvZm9udD4KPGRkPgogICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSwgZXhjbHVkaW5nCiAgIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KICAgPHA+CiAgICAgIDxhIGhyZWY9IiNnenB1dHMiPmd6cHV0czwvYT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KICAgICAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBjaGFyICogIDxhIG5hbWU9Imd6Z2V0cyI+Z3pnZXRzPC9hPiAoZ3pGaWxlIGZpbGUsIGNoYXIgKmJ1ZiwgaW50IGxlbik7PC9mb250Pgo8ZGQ+CiAgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvcgogICBhIG5ld2xpbmUgY2hhcmFjdGVyIGlzIHJlYWQgYW5kIHRyYW5zZmVycmVkIHRvIGJ1Ziwgb3IgYW4gZW5kLW9mLWZpbGUKICAgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQgd2l0aCBhIG51bGwKICAgY2hhcmFjdGVyLgogICA8cD4KICAgICAgPGEgaHJlZj0iI2d6Z2V0cyI+Z3pnZXRzPC9hPiByZXR1cm5zIGJ1Ziwgb3IgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiBpbiBjYXNlIG9mIGVycm9yLgogICAgICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pwdXRjIj5nenB1dGM8L2E+IChnekZpbGUgZmlsZSwgaW50IGMpOzwvZm9udD4KPGRkPgogICAgICBXcml0ZXMgYywgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KICAgPGEgaHJlZj0iI2d6cHV0YyI+Z3pwdXRjPC9hPiByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pnZXRjIj5nemdldGM8L2E+IChnekZpbGUgZmlsZSk7PC9mb250Pgo8ZGQ+CiAgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gPGEgaHJlZj0iI2d6Z2V0YyI+Z3pnZXRjPC9hPiByZXR1cm5zIHRoaXMgYnl0ZQogICBvciAtMSBpbiBjYXNlIG9mIGVuZCBvZiBmaWxlIG9yIGVycm9yLgogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pmbHVzaCI+Z3pmbHVzaDwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpOzwvZm9udD4KPGRkPgogICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gVGhlIHBhcmFtZXRlcgogICBmbHVzaCBpcyBhcyBpbiB0aGUgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkgZnVuY3Rpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIKICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gPGEgaHJlZj0iI2d6ZXJyb3IiPmd6ZXJyb3I8L2E+IGJlbG93KS4gPGEgaHJlZj0iI2d6Zmx1c2giPmd6Zmx1c2g8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmCiAgIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaXMgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4gYW5kIGFsbCBvdXRwdXQgY291bGQgYmUgZmx1c2hlZC4KICAgPHA+CiAgICAgPGEgaHJlZj0iI2d6Zmx1c2giPmd6Zmx1c2g8L2E+IHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgogICBkZWdyYWRlIGNvbXByZXNzaW9uLgogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHpfb2ZmX3QgICAgIDxhIG5hbWU9Imd6c2VlayI+Z3pzZWVrPC9hPiAoZ3pGaWxlIGZpbGUsIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTs8L2ZvbnQ+CjxkZD4KICAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IDxhIGhyZWY9IiNnenJlYWQiPmd6cmVhZDwvYT4gb3IgPGEgaHJlZj0iI2d6d3JpdGUiPmd6d3JpdGU8L2E+IG9uIHRoZQogICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIFRoZSBvZmZzZXQgcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiBUaGUgd2hlbmNlIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGluIGxzZWVrKDIpOwogICB0aGUgdmFsdWUgU0VFS19FTkQgaXMgbm90IHN1cHBvcnRlZC4KICAgPHA+CiAgICAgSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciByZWFkaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIGVtdWxhdGVkIGJ1dCBjYW4gYmUKICAgZXh0cmVtZWx5IHNsb3cuIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQogICBzdXBwb3J0ZWQgOyA8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+IHRoZW4gY29tcHJlc3NlcyBhIHNlcXVlbmNlIG9mIHplcm9lcyB1cCB0byB0aGUgbmV3CiAgIHN0YXJ0aW5nIHBvc2l0aW9uLgogICA8cD4KICAgICAgPGEgaHJlZj0iI2d6c2VlayI+Z3pzZWVrPC9hPiByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbSwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvciwgaW4KICAgcGFydGljdWxhciBpZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcgYW5kIHRoZSBuZXcgc3RhcnRpbmcgcG9zaXRpb24KICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pyZXdpbmQiPmd6cmV3aW5kPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KPGRkPgogICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCiAgICAgPHA+CiAgIDxhIGhyZWY9IiNnenJld2luZCI+Z3pyZXdpbmQ8L2E+KGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludCk8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+KGZpbGUsIDBMLCBTRUVLX1NFVCkKICAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiB6X29mZl90ICAgICA8YSBuYW1lPSJnenRlbGwiPmd6dGVsbDwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+CjxkZD4KICAgICBSZXR1cm5zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiBvciA8YSBocmVmPSIjZ3p3cml0ZSI+Z3p3cml0ZTwvYT4gb24gdGhlCiAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQogICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCiAgIDxwPgoKICAgPGEgaHJlZj0iI2d6dGVsbCI+Z3p0ZWxsPC9hPihmaWxlKSBpcyBlcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4oZmlsZSwgMEwsIFNFRUtfQ1VSKQogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZ3plb2YiPmd6ZW9mPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KPGRkPgogICAgIFJldHVybnMgMSB3aGVuIEVPRiBoYXMgcHJldmlvdXNseSBiZWVuIGRldGVjdGVkIHJlYWRpbmcgdGhlIGdpdmVuCiAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemNsb3NlIj5nemNsb3NlPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KPGRkPgogICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKICAgYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCiAgIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIDxhIGhyZWY9IiNnemVycm9yIj5nemVycm9yPC9hPiBiZWxvdykuCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gY29uc3QgY2hhciAqICA8YSBuYW1lPSJnemVycm9yIj5nemVycm9yPC9hPiAoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKTs8L2ZvbnQ+CjxkZD4KICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgogICBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKICAgZXJybnVtIGlzIHNldCB0byA8YSBocmVmPSIjWl9FUlJOTyI+Wl9FUlJOTzwvYT4gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubwogICB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCiAgIDxwPgo8L2RsPgo8aHI+CjxhIG5hbWU9IkJhc2ljIGZ1bmN0aW9ucyI+PGgyPiBCYXNpYyBmdW5jdGlvbnMgPC9oMj4KPGgzPiBGdW5jdGlvbiBsaXN0IDwvaDM+Cjx1bD4KPGxpPiAgY29uc3QgY2hhciAqICA8YSBocmVmPSIjemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPiAodm9pZCk7CjxsaT4gIGludCAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGxldmVsKTsKPGxpPiAgaW50ICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGZsdXNoKTsKPGxpPiAgaW50ICA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7CjxsaT4gIGludCAgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7CjxsaT4gIGludCAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBmbHVzaCk7CjxsaT4gIGludCAgPGEgaHJlZj0iI2luZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOwo8L3VsPgoKPGgzPiBGdW5jdGlvbiBkZXNjcmlwdGlvbiA8L2gzPgo8ZGw+Cjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBjb25zdCBjaGFyICogIDxhIG5hbWU9InpsaWJWZXJzaW9uIj56bGliVmVyc2lvbjwvYT4gKHZvaWQpOzwvZm9udD4KPGRkPiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbXBhcmUgPGEgaHJlZj0iI3psaWJWZXJzaW9uIj56bGliVmVyc2lvbjwvYT4gYW5kIFpMSUJfVkVSU0lPTiBmb3IgY29uc2lzdGVuY3kuCiAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCiAgIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KICAgVGhpcyBjaGVjayBpcyBhdXRvbWF0aWNhbGx5IG1hZGUgYnkgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gYW5kIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+LgogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwpOzwvZm9udD4KPGRkPgogICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gZm9yIGNvbXByZXNzaW9uLiBUaGUgZmllbGRzCiAgIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCiAgIElmIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFyZSBzZXQgdG8gPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gdXBkYXRlcyB0aGVtIHRvCiAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgogICA8cD4KCiAgICAgVGhlIGNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgPGEgaHJlZj0iI1pfREVGQVVMVF9DT01QUkVTU0lPTiI+Wl9ERUZBVUxUX0NPTVBSRVNTSU9OPC9hPiwgb3IgYmV0d2VlbiAwIGFuZCA5OgogICAxIGdpdmVzIGJlc3Qgc3BlZWQsIDkgZ2l2ZXMgYmVzdCBjb21wcmVzc2lvbiwgMCBnaXZlcyBubyBjb21wcmVzc2lvbiBhdAogICBhbGwgKHRoZSBpbnB1dCBkYXRhIGlzIHNpbXBseSBjb3BpZWQgYSBibG9jayBhdCBhIHRpbWUpLgogICA8cD4KCiAgIDxhIGhyZWY9IiNaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4gcmVxdWVzdHMgYSBkZWZhdWx0IGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQKICAgY29tcHJlc3Npb24gKGN1cnJlbnRseSBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgogICA8cD4KCiAgICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAogICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwKICAgPGEgaHJlZj0iI1pfVkVSU0lPTl9FUlJPUiI+Wl9WRVJTSU9OX0VSUk9SPC9hPiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKDxhIGhyZWY9IiN6bGliX3ZlcnNpb24iPnpsaWJfdmVyc2lvbjwvYT4pIGlzIGluY29tcGF0aWJsZQogICB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciAoWkxJQl9WRVJTSU9OKS4KICAgPGEgaHJlZj0iI21zZyI+bXNnPC9hPiBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gZG9lcyBub3QKICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLgogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImRlZmxhdGUiPmRlZmxhdGU8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBmbHVzaCk7PC9mb250Pgo8ZGQ+CiAgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAogIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZSBzb21lCiAgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KICBmb3JjZWQgdG8gZmx1c2guPHA+CgogICAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQogIGZvbGxvd2luZyBhY3Rpb25zOgoKICA8dWw+CiAgPGxpPiBDb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4KICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CiAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gYXJlIHVwZGF0ZWQgYW5kCiAgICBwcm9jZXNzaW5nIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuCgogIDxsaT4gCiAgICBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCB1cGRhdGUgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4KICAgIGFjY29yZGluZ2x5LiBUaGlzIGFjdGlvbiBpcyBmb3JjZWQgaWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBub24gemVyby4KICAgIEZvcmNpbmcgZmx1c2ggZnJlcXVlbnRseSBkZWdyYWRlcyB0aGUgY29tcHJlc3Npb24gcmF0aW8sIHNvIHRoaXMgcGFyYW1ldGVyCiAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuCiAgICBTb21lIG91dHB1dCBtYXkgYmUgcHJvdmlkZWQgZXZlbiBpZiBmbHVzaCBpcyBub3Qgc2V0LgogIDwvdWw+IDxwPgoKICBCZWZvcmUgdGhlIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IG9yIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYWNjb3JkaW5nbHkgOyA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+CiAgc2hvdWxkIG5ldmVyIGJlIHplcm8gYmVmb3JlIHRoZSBjYWxsLiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlCiAgY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsCiAgKDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS4gSWYgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+CiAgYW5kIHdpdGggemVybyA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUKICBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KICA8cD4KCiAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byA8YSBocmVmPSIjWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+LCBhbGwgcGVuZGluZyBvdXRwdXQgaXMKICBmbHVzaGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0aGUgb3V0cHV0IGlzIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBzbwogIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuIChJbiBwYXJ0aWN1bGFyCiAgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkCiAgYmVmb3JlIHRoZSBjYWxsLikgIEZsdXNoaW5nIG1heSBkZWdyYWRlIGNvbXByZXNzaW9uIGZvciBzb21lIGNvbXByZXNzaW9uCiAgYWxnb3JpdGhtcyBhbmQgc28gaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4KICA8cD4KCiAgICBJZiBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPiwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKICA8YSBocmVmPSIjWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+LCBhbmQgdGhlIGNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KICByZXN0YXJ0IGZyb20gdGhpcyBwb2ludCBpZiBwcmV2aW91cyBjb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gZGFtYWdlZCBvciBpZgogIHJhbmRvbSBhY2Nlc3MgaXMgZGVzaXJlZC4gVXNpbmcgPGEgaHJlZj0iI1pfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPiB0b28gb2Z0ZW4gY2FuIHNlcmlvdXNseSBkZWdyYWRlCiAgdGhlIGNvbXByZXNzaW9uLgogIDxwPgoKICAgIElmIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIHdpdGggPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCiAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZAogIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4pLCB1bnRpbCB0aGUgZmx1c2ggaXMgY29tcGxldGUgKDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIHdpdGggbm9uLXplcm8KICA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+KS4KICA8cD4KCiAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQsCiAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHJldHVybnMgd2l0aCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IGlmIHRoZXJlCiAgd2FzIGVub3VnaCBvdXRwdXQgc3BhY2UgOyBpZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCiAgY2FsbGVkIGFnYWluIHdpdGggPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4gYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4pIGJ1dCBubwogIG1vcmUgaW5wdXQgZGF0YSwgdW50aWwgaXQgcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb3IgYW4gZXJyb3IuIEFmdGVyCiAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGhhcyByZXR1cm5lZCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+LCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZQogIHN0cmVhbSBhcmUgPGEgaHJlZj0iI2RlZmxhdGVSZXNldCI+ZGVmbGF0ZVJlc2V0PC9hPiBvciA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4uCiAgPHA+CiAgCiAgICA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSBhZnRlciA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBpZiBhbGwgdGhlIGNvbXByZXNzaW9uCiAgaXMgdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwLiBJbiB0aGlzIGNhc2UsIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gbXVzdCBiZSBhdCBsZWFzdAogIDAuMSUgbGFyZ2VyIHRoYW4gPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gcGx1cyAxMiBieXRlcy4gIElmIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBkb2VzIG5vdCByZXR1cm4KICA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+LCB0aGVuIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFzIGRlc2NyaWJlZCBhYm92ZS4KICA8cD4KCiAgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBzZXRzIHN0cm0tJmd0IDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+IHRvIHRoZSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gY2hlY2tzdW0gb2YgYWxsIGlucHV0IHJlYWQKICBzbyBmYXIgKHRoYXQgaXMsIDxhIGhyZWY9IiN0b3RhbF9pbiI+dG90YWxfaW48L2E+IGJ5dGVzKS4KICA8cD4KCiAgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBtYXkgdXBkYXRlIDxhIGhyZWY9IiNkYXRhX3R5cGUiPmRhdGFfdHlwZTwvYT4gaWYgaXQgY2FuIG1ha2UgYSBnb29kIGd1ZXNzIGFib3V0CiAgdGhlIGlucHV0IGRhdGEgdHlwZSAoPGEgaHJlZj0iI1pfQVNDSUkiPlpfQVNDSUk8L2E+IG9yIDxhIGhyZWY9IiNaX0JJTkFSWSI+Wl9CSU5BUlk8L2E+KS4gSW4gZG91YnQsIHRoZSBkYXRhIGlzIGNvbnNpZGVyZWQKICBiaW5hcnkuIFRoaXMgZmllbGQgaXMgb25seSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMgYW5kIGRvZXMgbm90IGFmZmVjdAogIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaW4gYW55IG1hbm5lci4KICA8cD4KCiAgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IGlmIGFsbCBpbnB1dCBoYXMgYmVlbgogIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkIChvbmx5IHdoZW4gZmx1c2ggaXMgc2V0IHRvCiAgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4pLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlCiAgaWYgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IG9yIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IHdhcyBOVUxMKSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKICAoZm9yIGV4YW1wbGUgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gb3IgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiB3YXMgemVybykuCiAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTs8L2ZvbnQ+CjxkZD4KICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgogICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55CiAgIHBlbmRpbmcgb3V0cHV0LgogICA8cD4KCiAgICAgPGEgaHJlZj0iI2RlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZQogICBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCwgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAogICBwcmVtYXR1cmVseSAoc29tZSBpbnB1dCBvciBvdXRwdXQgd2FzIGRpc2NhcmRlZCkuIEluIHRoZSBlcnJvciBjYXNlLAogICA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUKICAgZGVhbGxvY2F0ZWQpLgogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250Pgo8ZGQ+ICAgICAKCUluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gZm9yIGRlY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKICAgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+LCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKICAgdGhlIGNhbGxlci4gSWYgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGlzIG5vdCA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBpcyBsYXJnZSBlbm91Z2ggKHRoZSBleGFjdAogICB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjb21wcmVzc2lvbiBtZXRob2QpLCA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiBkZXRlcm1pbmVzIHRoZQogICBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSB0aGUgemxpYiBoZWFkZXIgYW5kIGFsbG9jYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzCiAgIGFjY29yZGluZ2x5IDsgb3RoZXJ3aXNlIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGNhbGwgb2YKICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+LiAgSWYgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYXJlIHNldCB0byA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+LCA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiB1cGRhdGVzIHRoZW0gdG8KICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCiAgIDxwPgoKICAgICA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAogICBtZW1vcnksIDxhIGhyZWY9IiNaX1ZFUlNJT05fRVJST1IiPlpfVkVSU0lPTl9FUlJPUjwvYT4gaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQogICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlci4gIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IKICAgbWVzc2FnZS4gPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcKICAgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLiAgKFNvIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQKICAgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gbWF5IGJlIG1vZGlmaWVkLCBidXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYXJlIHVuY2hhbmdlZC4pCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGZsdXNoKTs8L2ZvbnQ+CjxkZD4KICAgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBkZWNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBzb21lCiAgaW50cm9kdWNlIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkKICBleGNlcHQgd2hlbiBmb3JjZWQgdG8gZmx1c2guCiAgPHA+CgogIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKICBmb2xsb3dpbmcgYWN0aW9uczoKCiAgPHVsPgogIDxsaT4gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4KICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CiAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nCiAgICB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLgoKICA8bGk+IFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIHVwZGF0ZSA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgCiAgICA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IGFjY29yZGluZ2x5LiAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUsIAogICAgdW50aWwgdGhlcmUgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgCiAgICAoc2VlIGJlbG93IGFib3V0IHRoZSBmbHVzaCBwYXJhbWV0ZXIpLgogIDwvdWw+IDxwPgoKICBCZWZvcmUgdGhlIGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIHRoZSBuZXh0XyogYW5kIGF2YWlsXyogdmFsdWVzIGFjY29yZGluZ2x5LgogIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IKICBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiA9PSAwKSwgb3IgYWZ0ZXIgZWFjaAogIGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuIElmIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBhbmQgd2l0aCB6ZXJvIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4sIGl0CiAgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZQogIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCiAgPHA+CgogICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IGZsdXNoZXMgYXMgbXVjaAogIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlIGZsdXNoaW5nIGJlaGF2aW9yIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBpcwogIG5vdCBzcGVjaWZpZWQgZm9yIHZhbHVlcyBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIG90aGVyIHRoYW4gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPgogIGFuZCA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiwgYnV0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQKICBhcyBwb3NzaWJsZSBhbnl3YXkuCiAgPHA+CgogICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb3IgYW4KICBlcnJvci4gSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcAogIChhIHNpbmdsZSBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bwogIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+LiBJbiB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZwogIG91dHB1dCBpcyBmbHVzaGVkIDsgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKICB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuIHNhdmVkCiAgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0CiAgYmUgPGEgaHJlZj0iI2luZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+IHRvIGRlYWxsb2NhdGUgdGhlIGRlY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uIFRoZSB1c2Ugb2YgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4KICBpcyBuZXZlciByZXF1aXJlZCwgYnV0IGNhbiBiZSB1c2VkIHRvIGluZm9ybSA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gdGhhdCBhIGZhc3RlciByb3V0aW5lCiAgbWF5IGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgY2FsbC4KICA8cD4KCiAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCAoc2VlIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+CiAgYmVsb3cpLCA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gc2V0cyBzdHJtLTxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+IHRvIHRoZSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gY2hlY2tzdW0gb2YgdGhlCiAgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgPGEgaHJlZj0iI1pfTkVFRF9ESUNUIj5aX05FRURfRElDVDwvYT4gOyBvdGhlcndpc2UgCiAgaXQgc2V0cyBzdHJtLSZndCA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiB0byB0aGUgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQKICBzbyBmYXIgKHRoYXQgaXMsIDxhIGhyZWY9IiN0b3RhbF9vdXQiPnRvdGFsX291dDwvYT4gYnl0ZXMpIGFuZCByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiwgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBvcgogIGFuIGVycm9yIGNvZGUgYXMgZGVzY3JpYmVkIGJlbG93LiBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpCiAgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZQogIGNvbXByZXNzb3IgYW5kIHJldHVybnMgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBvbmx5IGlmIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0LgogIDxwPgoKICAgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpIHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dCBwcm9jZXNzZWQKICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gaWYgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcwogIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIDxhIGhyZWY9IiNaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+IGlmIGEKICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMKICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0CiAgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtKSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudAogIChmb3IgZXhhbXBsZSBpZiA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gb3IgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gd2FzIE5VTEwpLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90CiAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdAogIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4gPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4gaXMgdXNlZC4gSW4gdGhlIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4KICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4gY2FsbCA8YSBocmVmPSIjaW5mbGF0ZVN5bmMiPmluZmxhdGVTeW5jPC9hPiB0byBsb29rIGZvciBhIGdvb2QKICBjb21wcmVzc2lvbiBibG9jay4KICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KPGRkPgogICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCiAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKICAgcGVuZGluZyBvdXRwdXQuCiAgIDxwPgoKICAgICA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPgogICB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgZXJyb3IgY2FzZSwgPGEgaHJlZj0iI21zZyI+bXNnPC9hPiBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhCiAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KPC9kbD4KPGhyPgo8YSBuYW1lPSJBZHZhbmNlZCBmdW5jdGlvbnMiPjxoMj4gQWR2YW5jZWQgZnVuY3Rpb25zIDwvaDI+CiAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIG9ubHkgaW4gc29tZSBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KPGgzPiBGdW5jdGlvbiBsaXN0IDwvaDM+Cjx1bD4KPGxpPiAgaW50ICA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sCjxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwgdUludCAgZGljdExlbmd0aCk7CjxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBkZXN0LCA8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHNvdXJjZSk7CjxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOwo8bGk+IGludCAgPGEgaHJlZj0iI2RlZmxhdGVQYXJhbXMiPmRlZmxhdGVQYXJhbXM8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KTsKPGxpPiBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50ICB3aW5kb3dCaXRzKTsKPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwgdUludCAgZGljdExlbmd0aCk7CjxsaT4gaW50ICA8YSBocmVmPSIjaW5mbGF0ZVN5bmMiPmluZmxhdGVTeW5jPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKPGxpPiBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlUmVzZXQiPmluZmxhdGVSZXNldDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Cgo8L3VsPgo8aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+CjxkbD4KPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCAgbGV2ZWwsIGludCAgbWV0aG9kLCBpbnQgIHdpbmRvd0JpdHMsIGludCAgbWVtTGV2ZWwsIGludCAgc3RyYXRlZ3kpOzwvZm9udD4KCjxkZD4gVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gd2l0aCBtb3JlIGNvbXByZXNzaW9uIG9wdGlvbnMuIFRoZQogICBmaWVsZHMgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+LCA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+LCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBhbmQgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQogICB0aGUgY2FsbGVyLjxwPgoKICAgICBUaGUgbWV0aG9kIHBhcmFtZXRlciBpcyB0aGUgY29tcHJlc3Npb24gbWV0aG9kLiBJdCBtdXN0IGJlIDxhIGhyZWY9IiNaX0RFRkxBVEVEIj5aX0RFRkxBVEVEPC9hPiBpbgogICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuPHA+CgogICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQogICAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yIHRoaXMKICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCiAgIGNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYKICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gaXMgdXNlZCBpbnN0ZWFkLjxwPgoKICAgICBUaGUgbWVtTGV2ZWwgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbXVjaCBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZAogICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LiBtZW1MZXZlbD0xIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0CiAgIGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW8gOyBtZW1MZXZlbD05IHVzZXMgbWF4aW11bSBtZW1vcnkKICAgZm9yIG9wdGltYWwgc3BlZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguIFNlZSB6Y29uZi5oIGZvciB0b3RhbCBtZW1vcnkKICAgdXNhZ2UgYXMgYSBmdW5jdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC48cD4KCiAgICAgVGhlIHN0cmF0ZWd5IHBhcmFtZXRlciBpcyB1c2VkIHRvIHR1bmUgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gVXNlIHRoZQogICB2YWx1ZSA8YSBocmVmPSIjWl9ERUZBVUxUX1NUUkFURUdZIj5aX0RFRkFVTFRfU1RSQVRFR1k8L2E+IGZvciBub3JtYWwgZGF0YSwgPGEgaHJlZj0iI1pfRklMVEVSRUQiPlpfRklMVEVSRUQ8L2E+IGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEKICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBvciA8YSBocmVmPSIjWl9IVUZGTUFOX09OTFkiPlpfSFVGRk1BTl9PTkxZPC9hPiB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCiAgIHN0cmluZyBtYXRjaCkuICBGaWx0ZXJlZCBkYXRhIGNvbnNpc3RzIG1vc3RseSBvZiBzbWFsbCB2YWx1ZXMgd2l0aCBhCiAgIHNvbWV3aGF0IHJhbmRvbSBkaXN0cmlidXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcwogICB0dW5lZCB0byA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiB0aGVtIGJldHRlci4gVGhlIGVmZmVjdCBvZiA8YSBocmVmPSIjWl9GSUxURVJFRCI+Wl9GSUxURVJFRDwvYT4gaXMgdG8gZm9yY2UgbW9yZQogICBIdWZmbWFuIGNvZGluZyBhbmQgbGVzcyBzdHJpbmcgbWF0Y2hpbmcgOyBpdCBpcyBzb21ld2hhdCBpbnRlcm1lZGlhdGUKICAgYmV0d2VlbiBaX0RFRkFVTFQgYW5kIDxhIGhyZWY9IiNaX0hVRkZNQU5fT05MWSI+Wl9IVUZGTUFOX09OTFk8L2E+LiBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cwogICB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4KICAgaWYgaXQgaXMgbm90IHNldCBhcHByb3ByaWF0ZWx5LjxwPgoKICAgICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAogICBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYW4gaW52YWxpZAogICBtZXRob2QpLiA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IGRvZXMKICAgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS48cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImRlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOzwvZm9udD4KPGRkPgogICAgIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGUgc2VxdWVuY2UKICAgd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkCiAgIGltbWVkaWF0ZWx5IGFmdGVyIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+LCA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IG9yIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4sIGJlZm9yZSBhbnkKICAgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4uIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQogICBkaWN0aW9uYXJ5IChzZWUgPGEgaHJlZj0iI2luZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4pLjxwPgoKICAgICBUaGUgZGljdGlvbmFyeSBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5CiAgIHRvIGJlIGVuY291bnRlcmVkIGxhdGVyIGluIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQsIHdpdGggdGhlIG1vc3QgY29tbW9ubHkKICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQogICBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQgY2FuIGJlCiAgIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3kgOyB0aGUgZGF0YSBjYW4gdGhlbiBiZSBjb21wcmVzc2VkIGJldHRlciB0aGFuCiAgIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS48cD4KCiAgICAgRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2lvbiBkYXRhIHN0cnVjdHVyZXMgc2VsZWN0ZWQgYnkKICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gb3IgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiwgYSBwYXJ0IG9mIHRoZSBkaWN0aW9uYXJ5IG1heSBpbiBlZmZlY3QgYmUKICAgZGlzY2FyZGVkLCBmb3IgZXhhbXBsZSBpZiB0aGUgZGljdGlvbmFyeSBpcyBsYXJnZXIgdGhhbiB0aGUgd2luZG93IHNpemUgaW4KICAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IG9yIGRlZmxhdGUyLiBUaHVzIHRoZSBzdHJpbmdzIG1vc3QgbGlrZWx5IHRvIGJlIHVzZWZ1bCBzaG91bGQgYmUKICAgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuPHA+CgogICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tJmd0IDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+IGlzIHNldCB0byB0aGUgQWRsZXIzMiB2YWx1ZQogICBvZiB0aGUgZGljdGlvbmFyeSA7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQogICB3aGljaCBkaWN0aW9uYXJ5IGhhcyBiZWVuIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuIChUaGUgQWRsZXIzMiB2YWx1ZQogICBhcHBsaWVzIHRvIHRoZSB3aG9sZSBkaWN0aW9uYXJ5IGV2ZW4gaWYgb25seSBhIHN1YnNldCBvZiB0aGUgZGljdGlvbmFyeSBpcwogICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLik8cD4KCiAgICAgPGEgaHJlZj0iI2RlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2Vzcywgb3IgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgYQogICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBOVUxMIGRpY3Rpb25hcnkpIG9yIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gaXMKICAgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZSBpZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc3RyZWFtCiAgIG9yIGlmIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgaXMgYnNvcnQpLiA8YSBocmVmPSIjZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiBkb2VzIG5vdAogICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImRlZmxhdGVDb3B5Ij5kZWZsYXRlQ29weTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gZGVzdCwgPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzb3VyY2UpOzwvZm9udD4KPGRkPgogICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uPHA+CgogICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHNldmVyYWwgY29tcHJlc3Npb24gc3RyYXRlZ2llcyB3aWxsIGJlCiAgIHRyaWVkLCBmb3IgZXhhbXBsZSB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIHdheXMgb2YgcHJlLXByb2Nlc3NpbmcgdGhlIGlucHV0CiAgIGRhdGEgd2l0aCBhIGZpbHRlci4gVGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIGRpc2NhcmRlZCBzaG91bGQgdGhlbiBiZSBmcmVlZAogICBieSBjYWxsaW5nIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPi4gIE5vdGUgdGhhdCA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAogICBjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3aGljaCBjYW4gYmUgcXVpdGUgbGFyZ2UsIHNvIHRoaXMgc3RyYXRlZ3kgaXMgc2xvdyBhbmQKICAgY2FuIGNvbnN1bWUgbG90cyBvZiBtZW1vcnkuPHA+CgogICAgIDxhIGhyZWY9IiNkZWZsYXRlQ29weSI+ZGVmbGF0ZUNvcHk8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKICAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHNvdXJjZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudAogICAoc3VjaCBhcyA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGJlaW5nIE5VTEwpLiA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAogICBkZXN0aW5hdGlvbi48cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KPGRkPiAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPiBmb2xsb3dlZCBieSA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiwKICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4KICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGFueSBvdGhlciBhdHRyaWJ1dGVzCiAgIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPi48cD4KCiAgICAgIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2Vzcywgb3IgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHNvdXJjZQogICBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IG9yIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGJlaW5nIE5VTEwpLjxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7PC9mb250Pgo8ZGQ+CiAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgY29tcHJlc3Npb24gc3RyYXRlZ3kuICBUaGUKICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4uICBUaGlzIGNhbiBiZQogICB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzdHJhaWdodCBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLCBvcgogICB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQga2luZCBvZiBpbnB1dCBkYXRhIHJlcXVpcmluZyBhIGRpZmZlcmVudAogICBzdHJhdGVneS4gSWYgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGNoYW5nZWQsIHRoZSBpbnB1dCBhdmFpbGFibGUgc28gZmFyCiAgIGlzIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwKICAgdGFrZSBlZmZlY3Qgb25seSBhdCB0aGUgbmV4dCBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLjxwPgoKICAgICBCZWZvcmUgdGhlIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGVQYXJhbXMiPmRlZmxhdGVQYXJhbXM8L2E+LCB0aGUgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IG11c3QgYmUgc2V0IGFzIGZvcgogICBhIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCksIHNpbmNlIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGlucHV0IG1heSBoYXZlIHRvCiAgIGJlIGNvbXByZXNzZWQgYW5kIGZsdXNoZWQuIEluIHBhcnRpY3VsYXIsIHN0cm0tJmd0IDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gbXVzdCBiZSAKICAgbm9uLXplcm8uPHA+CgogICAgIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlCiAgIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPgogICBpZiBzdHJtLSZndGF2YWlsX291dCB3YXMgemVyby48cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iaW5mbGF0ZUluaXQyIj5pbmZsYXRlSW5pdDI8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCAgd2luZG93Qml0cyk7PC9mb250PgoKPGRkPiAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuIFRoZQogICBmaWVsZHMgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+LCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZAogICBiZWZvcmUgYnkgdGhlIGNhbGxlci48cD4KCiAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIG1heGltdW0gd2luZG93CiAgIHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvcgogICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGlzIHVzZWQKICAgaW5zdGVhZC4gSWYgYSBjb21wcmVzc2VkIHN0cmVhbSB3aXRoIGEgbGFyZ2VyIHdpbmRvdyBzaXplIGlzIGdpdmVuIGFzCiAgIGlucHV0LCA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaW5zdGVhZCBvZgogICB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LjxwPgoKICAgICAgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAogICBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYSBuZWdhdGl2ZQogICBtZW1MZXZlbCkuIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIDxhIGhyZWY9IiNpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4KICAgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmCiAgIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLiAoU28gPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBtYXkgYmUKICAgbW9kaWZpZWQsIGJ1dCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBhcmUgdW5jaGFuZ2VkLik8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOzwvZm9udD4KPGRkPgogICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKICAgc2VxdWVuY2UuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPgogICBpZiB0aGlzIGNhbGwgcmV0dXJuZWQgPGEgaHJlZj0iI1pfTkVFRF9ESUNUIj5aX05FRURfRElDVDwvYT4uIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgogICBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBBZGxlcjMyIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgY2FsbCBvZgogICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4uIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQogICBkaWN0aW9uYXJ5IChzZWUgPGEgaHJlZj0iI2RlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4pLjxwPgoKICAgICA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhCiAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBpcwogICBpbmNvbnNpc3RlbnQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIGdpdmVuIGRpY3Rpb25hcnkgZG9lc24ndCBtYXRjaCB0aGUKICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgQWRsZXIzMiB2YWx1ZSkuIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+IGRvZXMgbm90CiAgIHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IHN1YnNlcXVlbnQgY2FsbHMgb2YKICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImluZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgoKPGRkPiAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKICBkZXNjcmlwdGlvbiBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gd2l0aCA8YSBocmVmPSIjWl9GVUxMX0ZMVVNIIj5aX0ZVTExfRkxVU0g8L2E+KSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbAogIGF2YWlsYWJsZSBpbnB1dCBpcyBza2lwcGVkLiBObyBvdXRwdXQgaXMgcHJvdmlkZWQuPHA+CgogICAgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgYSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPgogIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGlmIG5vIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAogIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCiAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBzYXZlIHRoZSBjdXJyZW50IGN1cnJlbnQgdmFsdWUgb2YgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gd2hpY2gKICBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gSW4gdGhlIGVycm9yIGNhc2UsIHRoZQogIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4sIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKICB1bnRpbCBzdWNjZXNzIG9yIGVuZCBvZiB0aGUgaW5wdXQgZGF0YS48cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iaW5mbGF0ZVJlc2V0Ij5pbmZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KPGRkPgogICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gZm9sbG93ZWQgYnkgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4sCiAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgZGVjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4KICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IDxhIGhyZWY9IiNpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4uCiAgIDxwPgoKICAgICAgPGEgaHJlZj0iI2luZmxhdGVSZXNldCI+aW5mbGF0ZVJlc2V0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlCiAgIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gb3IgPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gYmVpbmcgTlVMTCkuCiAgIDxwPgo8L2RsPgoKPGhyPgo8YSBuYW1lPSJDaGVja3N1bSBmdW5jdGlvbnMiPjxoMj4gQ2hlY2tzdW0gZnVuY3Rpb25zIDwvaDI+CiAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcmVsYXRlZCB0byBjb21wcmVzc2lvbiBidXQgYXJlIGV4cG9ydGVkCiAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKICAgY29tcHJlc3Npb24gbGlicmFyeS4KPGgzPiBGdW5jdGlvbiBsaXN0IDwvaDM+Cjx1bD4KPGxpPiB1TG9uZyAgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+ICh1TG9uZyA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiwgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pOwo8bGk+IHVMb25nICA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPiAgICh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTsKPC91bD4KPGgzPiBGdW5jdGlvbiBkZXNjcmlwdGlvbiA8L2gzPgo8ZGw+Cjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHVMb25nICA8YSBuYW1lPSJhZGxlcjMyIj5hZGxlcjMyPC9hPiAodUxvbmcgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4sIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTs8L2ZvbnQ+CjxkZD4KICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCiAgIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucwogICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgogICA8cD4KICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAogICBtdWNoIGZhc3Rlci4gVXNhZ2UgZXhhbXBsZToKICAgPHByZT4KCiAgICAgdUxvbmcgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gPSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4oMEwsIDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4sIDApOwoKICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgewogICAgICAgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gPSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4oPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4sIGJ1ZmZlciwgbGVuZ3RoKTsKICAgICB9CiAgICAgaWYgKDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+ICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOwogICA8L3ByZT4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHVMb25nICA8YSBuYW1lPSJjcmMzMiI+Y3JjMzI8L2E+ICAgKHVMb25nIGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pOzwvZm9udD4KPGRkPgogICAgIFVwZGF0ZSBhIHJ1bm5pbmcgY3JjIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kIHJldHVybiB0aGUgdXBkYXRlZAogICBjcmMuIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUKICAgZm9yIHRoZSBjcmMuIFByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nIChvbmUncyBjb21wbGVtZW50KSBpcyBwZXJmb3JtZWQKICAgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgogICBVc2FnZSBleGFtcGxlOgogICA8cHJlPgoKICAgICB1TG9uZyBjcmMgPSA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPigwTCwgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgMCk7CgogICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CiAgICAgICBjcmMgPSA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPihjcmMsIGJ1ZmZlciwgbGVuZ3RoKTsKICAgICB9CiAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7CiAgIDwvcHJlPgo8L2RsPgo8aHI+CjxhIG5hbWU9InN0cnVjdCB6X3N0cmVhbV9zIj48aDI+IHN0cnVjdCB6X3N0cmVhbV9zIDwvaDI+Cjxmb250IGNvbG9yPSJCbHVlIj4KPGEgbmFtZT0iel9zdHJlYW1fcyI+CjxwcmU+CnR5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgewogICAgQnl0ZWYgICAgKjxhIG5hbWU9Im5leHRfaW4iPm5leHRfaW48L2E+OyAgLyogbmV4dCBpbnB1dCBieXRlICovCiAgICB1SW50ICAgICA8YSBuYW1lPSJhdmFpbF9pbiI+YXZhaWxfaW48L2E+OyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gKi8KICAgIHVMb25nICAgIDxhIG5hbWU9InRvdGFsX2luIj50b3RhbF9pbjwvYT47ICAvKiB0b3RhbCBuYiBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqLwoKICAgIEJ5dGVmICAgICo8YSBuYW1lPSJuZXh0X291dCI+bmV4dF9vdXQ8L2E+OyAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi8KICAgIHVJbnQgICAgIDxhIG5hbWU9ImF2YWlsX291dCI+YXZhaWxfb3V0PC9hPjsgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gKi8KICAgIHVMb25nICAgIDxhIG5hbWU9InRvdGFsX291dCI+dG90YWxfb3V0PC9hPjsgLyogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqLwoKICAgIGNoYXIgICAgICo8YSBuYW1lPSJtc2ciPm1zZzwvYT47ICAgICAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCiAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICo8YSBuYW1lPSJzdGF0ZSI+c3RhdGU8L2E+OyAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KCiAgICBhbGxvY19mdW5jIDxhIG5hbWU9InphbGxvYyI+emFsbG9jPC9hPjsgIC8qIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+ICovCiAgICBmcmVlX2Z1bmMgIDxhIG5hbWU9InpmcmVlIj56ZnJlZTwvYT47ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiAqLwogICAgdm9pZHBmICAgICA8YSBuYW1lPSJvcGFxdWUiPm9wYXF1ZTwvYT47ICAvKiBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiAqLwoKICAgIGludCAgICAgPGEgbmFtZT0iZGF0YV90eXBlIj5kYXRhX3R5cGU8L2E+OyAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBhc2NpaSBvciBiaW5hcnkgKi8KICAgIHVMb25nICAgPGEgbmFtZT0iYWRsZXIiPmFkbGVyPC9hPjsgICAgICAvKiA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCiAgICB1TG9uZyAgIDxhIG5hbWU9InJlc2VydmVkIj5yZXNlcnZlZDwvYT47ICAgLyogPGEgaHJlZj0iI3Jlc2VydmVkIj5yZXNlcnZlZDwvYT4gZm9yIGZ1dHVyZSB1c2UgKi8KfSA8YSBocmVmPSIjel9zdHJlYW1fcyI+el9zdHJlYW08L2E+IDsKCnR5cGVkZWYgPGEgaHJlZj0iI3pfc3RyZWFtX3MiPnpfc3RyZWFtPC9hPiBGQVIgKiA8YSBuYW1lPSJ6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT47ICD/IAo8L3ByZT4KPC9mb250PgogICBUaGUgYXBwbGljYXRpb24gbXVzdCB1cGRhdGUgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiB3aGVuIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IGhhcwogICBkcm9wcGVkIHRvIHplcm8uIEl0IG11c3QgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IHdoZW4gPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPgogICBoYXMgZHJvcHBlZCB0byB6ZXJvLiBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZAogICA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IGJlZm9yZSBjYWxsaW5nIHRoZSBpbml0IGZ1bmN0aW9uLiBBbGwgb3RoZXIgZmllbGRzIGFyZSBzZXQgYnkgdGhlCiAgIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIG11c3Qgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiA8cD4KCiAgIFRoZSA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QKICAgcGFyYW1ldGVyIGZvciBjYWxscyBvZiA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPi4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjdXN0b20KICAgbWVtb3J5IG1hbmFnZW1lbnQuIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCiAgIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gdmFsdWUuIDxwPgoKICAgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBtdXN0IHJldHVybiA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgogICBJZiB6bGliIGlzIHVzZWQgaW4gYSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gbXVzdCBiZQogICB0aHJlYWQgc2FmZS4gPHA+CgogICBPbiAxNi1iaXQgc3lzdGVtcywgdGhlIGZ1bmN0aW9ucyA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBtdXN0IGJlIGFibGUgdG8gYWxsb2NhdGUKICAgZXhhY3RseSA2NTUzNiBieXRlcywgYnV0IHdpbGwgbm90IGJlIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzCiAgIGlmIHRoZSBzeW1ib2wgTUFYU0VHXzY0SyBpcyBkZWZpbmVkIChzZWUgemNvbmYuaCkuIFdBUk5JTkc6IE9uIE1TRE9TLAogICBwb2ludGVycyByZXR1cm5lZCBieSA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGZvciBvYmplY3RzIG9mIGV4YWN0bHkgNjU1MzYgYnl0ZXMgKm11c3QqCiAgIGhhdmUgdGhlaXIgb2Zmc2V0IG5vcm1hbGl6ZWQgdG8gemVyby4gVGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbgogICBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuIFRvIHJlZHVjZSBtZW1vcnkKICAgcmVxdWlyZW1lbnRzIGFuZCBhdm9pZCBhbnkgYWxsb2NhdGlvbiBvZiA2NEsgb2JqZWN0cywgYXQgdGhlIGV4cGVuc2Ugb2YKICAgY29tcHJlc3Npb24gcmF0aW8sIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgogICA8cD4KCiAgIFRoZSBmaWVsZHMgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gYW5kIDxhIGhyZWY9IiN0b3RhbF9vdXQiPnRvdGFsX291dDwvYT4gY2FuIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3Mgb3IKICAgcHJvZ3Jlc3MgcmVwb3J0cy4gQWZ0ZXIgY29tcHJlc3Npb24sIDxhIGhyZWY9IiN0b3RhbF9pbiI+dG90YWxfaW48L2E+IGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mCiAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhbmQgbWF5IGJlIHNhdmVkIGZvciB1c2UgaW4gdGhlIGRlY29tcHJlc3NvcgogICAocGFydGljdWxhcmx5IGlmIHRoZSBkZWNvbXByZXNzb3Igd2FudHMgdG8gZGVjb21wcmVzcyBldmVyeXRoaW5nIGluCiAgIGEgc2luZ2xlIHN0ZXApLiA8cD4KCjxocj4KPGEgbmFtZT0iQ29uc3RhbnRzIj48aDI+IENvbnN0YW50cyA8L2gyPgo8Zm9udCBjb2xvcj0iQmx1ZSI+CjxwcmU+CiNkZWZpbmUgPGEgbmFtZT0iWl9OT19GTFVTSCI+Wl9OT19GTFVTSDwvYT4gICAgICAwCiNkZWZpbmUgPGEgbmFtZT0iWl9QQVJUSUFMX0ZMVVNIIj5aX1BBUlRJQUxfRkxVU0g8L2E+IDEgCgkvKiB3aWxsIGJlIHJlbW92ZWQsIHVzZSA8YSBocmVmPSIjWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+IGluc3RlYWQgKi8KI2RlZmluZSA8YSBuYW1lPSJaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4gICAgMgojZGVmaW5lIDxhIG5hbWU9IlpfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPiAgICAzCiNkZWZpbmUgPGEgbmFtZT0iWl9GSU5JU0giPlpfRklOSVNIPC9hPiAgICAgICAgNAovKiBBbGxvd2VkIGZsdXNoIHZhbHVlcyA7IHNlZSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBiZWxvdyBmb3IgZGV0YWlscyAqLwoKI2RlZmluZSA8YSBuYW1lPSJaX09LIj5aX09LPC9hPiAgICAgICAgICAgIDAKI2RlZmluZSA8YSBuYW1lPSJaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gICAgMQojZGVmaW5lIDxhIG5hbWU9IlpfTkVFRF9ESUNUIj5aX05FRURfRElDVDwvYT4gICAgIDIKI2RlZmluZSA8YSBuYW1lPSJaX0VSUk5PIj5aX0VSUk5PPC9hPiAgICAgICAgKC0xKQojZGVmaW5lIDxhIG5hbWU9IlpfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gKC0yKQojZGVmaW5lIDxhIG5hbWU9IlpfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiAgICgtMykKI2RlZmluZSA8YSBuYW1lPSJaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+ICAgICgtNCkKI2RlZmluZSA8YSBuYW1lPSJaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+ICAgICgtNSkKI2RlZmluZSA8YSBuYW1lPSJaX1ZFUlNJT05fRVJST1IiPlpfVkVSU0lPTl9FUlJPUjwvYT4gKC02KQovKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUKICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KICovCgojZGVmaW5lIDxhIG5hbWU9IlpfTk9fQ09NUFJFU1NJT04iPlpfTk9fQ09NUFJFU1NJT048L2E+ICAgICAgICAgMAojZGVmaW5lIDxhIG5hbWU9IlpfQkVTVF9TUEVFRCI+Wl9CRVNUX1NQRUVEPC9hPiAgICAgICAgICAgICAxCiNkZWZpbmUgPGEgbmFtZT0iWl9CRVNUX0NPTVBSRVNTSU9OIj5aX0JFU1RfQ09NUFJFU1NJT048L2E+ICAgICAgIDkKI2RlZmluZSA8YSBuYW1lPSJaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4gICgtMSkKLyogY29tcHJlc3Npb24gbGV2ZWxzICovCgojZGVmaW5lIDxhIG5hbWU9IlpfRklMVEVSRUQiPlpfRklMVEVSRUQ8L2E+ICAgICAgICAgICAgMQojZGVmaW5lIDxhIG5hbWU9IlpfSFVGRk1BTl9PTkxZIj5aX0hVRkZNQU5fT05MWTwvYT4gICAgICAgIDIKI2RlZmluZSA8YSBuYW1lPSJaX0RFRkFVTFRfU1RSQVRFR1kiPlpfREVGQVVMVF9TVFJBVEVHWTwvYT4gICAgMAovKiBjb21wcmVzc2lvbiBzdHJhdGVneSA7IHNlZSA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+KCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KCiNkZWZpbmUgPGEgbmFtZT0iWl9CSU5BUlkiPlpfQklOQVJZPC9hPiAgIDAKI2RlZmluZSA8YSBuYW1lPSJaX0FTQ0lJIj5aX0FTQ0lJPC9hPiAgICAxCiNkZWZpbmUgPGEgbmFtZT0iWl9VTktOT1dOIj5aX1VOS05PV048L2E+ICAyCi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgPGEgaHJlZj0iI2RhdGFfdHlwZSI+ZGF0YV90eXBlPC9hPiBmaWVsZCAqLwoKI2RlZmluZSA8YSBuYW1lPSJaX0RFRkxBVEVEIj5aX0RFRkxBVEVEPC9hPiAgIDgKLyogVGhlIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBjb21wcmVzc2lvbiBtZXRob2QgKHRoZSBvbmx5IG9uZSBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uKSAqLwoKI2RlZmluZSA8YSBuYW1lPSJaX05VTEwiPlpfTlVMTDwvYT4gIDAgIC8qIGZvciBpbml0aWFsaXppbmcgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4sIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gKi8KCiNkZWZpbmUgPGEgbmFtZT0iemxpYl92ZXJzaW9uIj56bGliX3ZlcnNpb248L2E+IDxhIGhyZWY9IiN6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+KCkKLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyBsZXNzIHRoYW4gMS4wLjIgKi8KPC9wcmU+CjwvZm9udD4KCjxocj4KPGEgbmFtZT0iTWlzYyI+PGgyPiBNaXNjIDwvaDI+CiA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBhbmQgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gYXJlIG1hY3JvcyB0byBhbGxvdyBjaGVja2luZyB0aGUgemxpYiB2ZXJzaW9uCiBhbmQgdGhlIGNvbXBpbGVyJ3MgdmlldyBvZiA8YSBocmVmPSIjel9zdHJlYW1fcyI+el9zdHJlYW08L2E+LgogPHA+CiBPdGhlciBmdW5jdGlvbnM6CiA8ZGw+CiA8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBjb25zdCBjaGFyICAgKiAgPGEgbmFtZT0iekVycm9yIj56RXJyb3I8L2E+ICAgICAgICAgICAoaW50IGVycik7PC9mb250PgogPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICAgICAgICAgIDxhIG5hbWU9ImluZmxhdGVTeW5jUG9pbnQiPmluZmxhdGVTeW5jUG9pbnQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHopOzwvZm9udD4KIDxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGNvbnN0IHVMb25nZiAqICA8YSBuYW1lPSJnZXRfY3JjX3RhYmxlIj5nZXRfY3JjX3RhYmxlPC9hPiAgICAodm9pZCk7PC9mb250PgogPC9kbD4KIDxocj4KIDxmb250IHNpemU9Ii0xIj4KIExhc3QgdXBkYXRlOiBXZWQgT2N0IDEzIDIwOjQyOjM0IDE5OTk8YnI+CiBwaWFwaUBjc2llLm50dS5lZHUudHcKIDwvZm9udD4KCjwvYm9keT4KPC9odG1sPgo=