PGh0bWw+Cgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KPHRpdGxlPkN1c3RvbSBQb2x5Z29uPC90aXRsZT4KPC9oZWFkPgoKPGJvZHk+Cgo8cD48Zm9udCBmYWNlPSJDb3VyaWVyIE5ldyI+Lyo8YnI+CkNvcHlyaWdodCAyMDA4IEludGVsIENvcnBvcmF0aW9uPGJyPgo8YnI+ClVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsPGJyPgpWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdDxicj4KaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KS48YnI+CiovPGJyPgojaW5jbHVkZSAmbHQ7Ym9vc3QvcG9seWdvbi9wb2x5Z29uLmhwcCZndDs8YnI+CiNpbmNsdWRlICZsdDtjYXNzZXJ0Jmd0Ozxicj4KI2luY2x1ZGUgJmx0O2xpc3QmZ3Q7PGJyPgpuYW1lc3BhY2UgZ3RsID0gYm9vc3Q6OnBvbHlnb247PGJyPgp1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnBvbHlnb246Om9wZXJhdG9yczs8YnI+PGJyPgovL2ZpcnN0IGxldHMgdHVybiBvdXIgcG9seWdvbiB1c2FnZSBjb2RlIGludG8gYSBnZW5lcmljPGJyPgovL2Z1bmN0aW9uIHBhcmFtZXRlcml6ZWQgYnkgcG9seWdvbiB0eXBlPGJyPgp0ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgUG9seWdvbiZndDs8YnI+CnZvaWQgdGVzdF9wb2x5Z29uKCkgezxicj4KJm5ic3A7IC8vbGV0cyBjb25zdHJ1Y3QgYSAxMHgxMCByZWN0YW5nbGUgc2hhcGVkIHBvbHlnb248YnI+CiZuYnNwOyB0eXBlZGVmIHR5cGVuYW1lIGd0bDo6cG9seWdvbl90cmFpdHMmbHQ7UG9seWdvbiZndDs6OnBvaW50X3R5cGUgUG9pbnQ7PGJyPgombmJzcDsgUG9pbnQgcHRzW10gPSB7Z3RsOjpjb25zdHJ1Y3QmbHQ7UG9pbnQmZ3Q7KDAsIDApLDxicj4KJm5ic3A7IGd0bDo6Y29uc3RydWN0Jmx0O1BvaW50Jmd0OygxMCwgMCksPGJyPgombmJzcDsgZ3RsOjpjb25zdHJ1Y3QmbHQ7UG9pbnQmZ3Q7KDEwLCAxMCksPGJyPgombmJzcDsgZ3RsOjpjb25zdHJ1Y3QmbHQ7UG9pbnQmZ3Q7KDAsIDEwKSB9Ozxicj4KJm5ic3A7IFBvbHlnb24gcG9seTs8YnI+CiZuYnNwOyBndGw6OnNldF9wb2ludHMocG9seSwgcHRzLCBwdHMrNCk7PGJyPgo8YnI+CiZuYnNwOyAvL25vdyBsZXRzIHNlZSB3aGF0IHdlIGNhbiBkbyB3aXRoIHRoaXMgcG9seWdvbjxicj4KJm5ic3A7IGFzc2VydChndGw6OmFyZWEocG9seSkgPT0gMTAwLjBmKTs8YnI+CiZuYnNwOyBhc3NlcnQoZ3RsOjpjb250YWlucyhwb2x5LCBndGw6OmNvbnN0cnVjdCZsdDtQb2ludCZndDsoNSwgNSkpKTs8YnI+CiZuYnNwOyBhc3NlcnQoIWd0bDo6Y29udGFpbnMocG9seSwgZ3RsOjpjb25zdHJ1Y3QmbHQ7UG9pbnQmZ3Q7KDE1LCA1KSkpOzxicj4KJm5ic3A7IGd0bDo6cmVjdGFuZ2xlX2RhdGEmbHQ7aW50Jmd0OyByZWN0Ozxicj4KJm5ic3A7IGFzc2VydChndGw6OmV4dGVudHMocmVjdCwgcG9seSkpOyAvL2dldCBib3VuZGluZyBib3ggb2YgcG9seTxicj4KJm5ic3A7IGFzc2VydChndGw6OmVxdWl2YWxlbmNlKHJlY3QsIHBvbHkpKTsgLy9oZXksIHRoYXQncyBzbGljazxicj4KJm5ic3A7IGFzc2VydChndGw6OndpbmRpbmcocG9seSkgPT0gZ3RsOjpDT1VOVEVSQ0xPQ0tXSVNFKTs8YnI+CiZuYnNwOyBhc3NlcnQoZ3RsOjpwZXJpbWV0ZXIocG9seSkgPT0gNDAuMGYpOzxicj4KPGJyPgombmJzcDsgLy9hZGQgNSB0byBhbGwgY29vcmRzIG9mIHBvbHk8YnI+CiZuYnNwOyBndGw6OmNvbnZvbHZlKHBvbHksIGd0bDo6Y29uc3RydWN0Jmx0O1BvaW50Jmd0Oyg1LCA1KSk7PGJyPgombmJzcDsgLy9tdWx0aXBseSBhbGwgY29vcmRzIG9mIHBvbHkgYnkgMjxicj4KJm5ic3A7IGd0bDo6c2NhbGVfdXAocG9seSwgMik7PGJyPgombmJzcDsgZ3RsOjpzZXRfcG9pbnRzKHJlY3QsIGd0bDo6cG9pbnRfZGF0YSZsdDtpbnQmZ3Q7KDEwLCAxMCksPGJyPgombmJzcDsgZ3RsOjpwb2ludF9kYXRhJmx0O2ludCZndDsoMzAsIDMwKSk7PGJyPgombmJzcDsgYXNzZXJ0KGd0bDo6ZXF1aXZhbGVuY2UocG9seSwgcmVjdCkpOzxicj4KfTxicj4KPGJyPgovL05vdyBsZXRzIGRlY2xhcmUgb3VyIG93biBwb2x5Z29uIGNsYXNzPGJyPgovL09vcHMsIHdlIG5lZWQgYSBwb2ludCBjbGFzcyB0byBzdXBwb3J0IG91ciBwb2x5Z29uLCBsZXRzIGJvcnJvdzxicj4KLy90aGUgQ1BvaW50IGV4YW1wbGU8YnI+CnN0cnVjdCBDUG9pbnQgezxicj4KJm5ic3A7IGludCB4Ozxicj4KJm5ic3A7IGludCB5Ozxicj4KfTs8YnI+Cjxicj4KLy93ZSBoYXZlIHRvIGdldCBDUG9pbnQgd29ya2luZyB3aXRoIGJvb3N0IHBvbHlnb24gdG8gbWFrZSBvdXIgcG9seWdvbjxicj4KLy90aGF0IHVzZXMgQ1BvaW50IHdvcmtpbmcgd2l0aCBib29zdCBwb2x5Z29uPGJyPgpuYW1lc3BhY2UgYm9vc3QgeyBuYW1lc3BhY2UgcG9seWdvbiB7PGJyPgombmJzcDsgdGVtcGxhdGUgJmx0OyZndDs8YnI+CiZuYnNwOyBzdHJ1Y3QgZ2VvbWV0cnlfY29uY2VwdCZsdDtDUG9pbnQmZ3Q7IHsgdHlwZWRlZiBwb2ludF9jb25jZXB0IHR5cGU7IH07PGJyPgombmJzcDsgdGVtcGxhdGUgJmx0OyZndDs8YnI+CiZuYnNwOyBzdHJ1Y3QgcG9pbnRfdHJhaXRzJmx0O0NQb2ludCZndDsgezxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IHR5cGVkZWYgaW50IGNvb3JkaW5hdGVfdHlwZTs8YnI+Cjxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IHN0YXRpYyBpbmxpbmUgY29vcmRpbmF0ZV90eXBlIGdldChjb25zdCBDUG9pbnQmYW1wOyBwb2ludCwgPGJyPgombmJzcDsmbmJzcDsmbmJzcDsgb3JpZW50YXRpb25fMmQgb3JpZW50KSB7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYob3JpZW50ID09IEhPUklaT05UQUwpPGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuIHBvaW50Lng7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuIHBvaW50Lnk7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KJm5ic3A7IH07PGJyPgo8YnI+CiZuYnNwOyB0ZW1wbGF0ZSAmbHQ7Jmd0Ozxicj4KJm5ic3A7IHN0cnVjdCBwb2ludF9tdXRhYmxlX3RyYWl0cyZsdDtDUG9pbnQmZ3Q7IHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBzdGF0aWMgaW5saW5lIHZvaWQgc2V0KENQb2ludCZhbXA7IHBvaW50LCBvcmllbnRhdGlvbl8yZCBvcmllbnQsIAppbnQgdmFsdWUpIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZihvcmllbnQgPT0gSE9SSVpPTlRBTCk8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwb2ludC54ID0gdmFsdWU7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZWxzZTxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBvaW50LnkgPSB2YWx1ZTs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgc3RhdGljIGlubGluZSBDUG9pbnQgY29uc3RydWN0KGludCB4X3ZhbHVlLCBpbnQgeV92YWx1ZSkgezxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IENQb2ludCByZXR2YWw7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0dmFsLnggPSB4X3ZhbHVlOzxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJldHZhbC55ID0geV92YWx1ZTsgPGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuIHJldHZhbDs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPgombmJzcDsgfTs8YnI+Cn0gfTxicj4KPGJyPgovL0knbSBsYXp5IGFuZCB1c2UgdGhlIHN0bCBldmVyeXdoZXJlIHRvIGF2b2lkIHdyaXRpbmcgbXkgb3duIGNsYXNzZXM8YnI+Ci8vbXkgdG95IHBvbHlnb24gaXMgYSBzdGQ6Omxpc3QmbHQ7Q1BvaW50Jmd0Ozxicj4KdHlwZWRlZiBzdGQ6Omxpc3QmbHQ7Q1BvaW50Jmd0OyBDUG9seWdvbjs8YnI+Cjxicj4KLy93ZSBuZWVkIHRvIHNwZWNpYWxpemUgb3VyIHBvbHlnb24gY29uY2VwdCBtYXBwaW5nIGluIGJvb3N0IHBvbHlnb248YnI+Cm5hbWVzcGFjZSBib29zdCB7IG5hbWVzcGFjZSBwb2x5Z29uIHs8YnI+CiZuYnNwOyAvL2ZpcnN0IHJlZ2lzdGVyIENQb2x5Z29uIGFzIGEgcG9seWdvbl9jb25jZXB0IHR5cGU8YnI+CiZuYnNwOyB0ZW1wbGF0ZSAmbHQ7Jmd0Ozxicj4KJm5ic3A7IHN0cnVjdCBnZW9tZXRyeV9jb25jZXB0Jmx0O0NQb2x5Z29uJmd0O3sgdHlwZWRlZiBwb2x5Z29uX2NvbmNlcHQgdHlwZTsgfTs8YnI+Cjxicj4KJm5ic3A7IHRlbXBsYXRlICZsdDsmZ3Q7PGJyPgombmJzcDsgc3RydWN0IHBvbHlnb25fdHJhaXRzJmx0O0NQb2x5Z29uJmd0OyB7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgdHlwZWRlZiBpbnQgY29vcmRpbmF0ZV90eXBlOzxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IHR5cGVkZWYgQ1BvbHlnb246OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yX3R5cGU7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgdHlwZWRlZiBDUG9pbnQgcG9pbnRfdHlwZTs8YnI+Cjxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIEdldCB0aGUgYmVnaW4gaXRlcmF0b3I8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBzdGF0aWMgaW5saW5lIGl0ZXJhdG9yX3R5cGUgYmVnaW5fcG9pbnRzKGNvbnN0IENQb2x5Z29uJmFtcDsgdCkgezxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJldHVybiB0LmJlZ2luKCk7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KPGJyPgombmJzcDsmbmJzcDsmbmJzcDsgLy8gR2V0IHRoZSBlbmQgaXRlcmF0b3I8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBzdGF0aWMgaW5saW5lIGl0ZXJhdG9yX3R5cGUgZW5kX3BvaW50cyhjb25zdCBDUG9seWdvbiZhbXA7IHQpIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyByZXR1cm4gdC5lbmQoKTs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPgo8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyAvLyBHZXQgdGhlIG51bWJlciBvZiBzaWRlcyBvZiB0aGUgcG9seWdvbjxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IHN0YXRpYyBpbmxpbmUgc3RkOjpzaXplX3Qgc2l6ZShjb25zdCBDUG9seWdvbiZhbXA7IHQpIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyByZXR1cm4gdC5zaXplKCk7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KPGJyPgombmJzcDsmbmJzcDsmbmJzcDsgLy8gR2V0IHRoZSB3aW5kaW5nIGRpcmVjdGlvbiBvZiB0aGUgcG9seWdvbjxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IHN0YXRpYyBpbmxpbmUgd2luZGluZ19kaXJlY3Rpb24gd2luZGluZyhjb25zdCBDUG9seWdvbiZhbXA7IHQpIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyByZXR1cm4gdW5rbm93bl93aW5kaW5nOzxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiZuYnNwOyB9Ozxicj4KPGJyPgombmJzcDsgdGVtcGxhdGUgJmx0OyZndDs8YnI+CiZuYnNwOyBzdHJ1Y3QgcG9seWdvbl9tdXRhYmxlX3RyYWl0cyZsdDtDUG9seWdvbiZndDsgezxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IC8vZXhwZWN0cyBzdGwgc3R5bGUgaXRlcmF0b3JzPGJyPgombmJzcDsmbmJzcDsmbmJzcDsgdGVtcGxhdGUgJmx0O3R5cGVuYW1lIGlUJmd0Ozxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IHN0YXRpYyBpbmxpbmUgQ1BvbHlnb24mYW1wOyBzZXRfcG9pbnRzKENQb2x5Z29uJmFtcDsgdCwgPGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgCmlUIGlucHV0X2JlZ2luLCBpVCBpbnB1dF9lbmQpIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB0LmNsZWFyKCk7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdC5pbnNlcnQodC5lbmQoKSwgaW5wdXRfYmVnaW4sIGlucHV0X2VuZCk7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuIHQ7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KPGJyPgombmJzcDsgfTs8YnI+Cn0gfTxicj4KPGJyPgovL25vdyB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyBidXQgdGVzdCB0aGF0IG91ciBwb2x5Z29uPGJyPgovL3dvcmtzIHdpdGggbGlicmFyeSBpbnRlcmZhY2VzPGJyPgppbnQgbWFpbigpIHs8YnI+CiZuYnNwOyB0ZXN0X3BvbHlnb24mbHQ7Q1BvbHlnb24mZ3Q7KCk7IC8vd29vdCE8YnI+CiZuYnNwOyByZXR1cm4gMDs8YnI+Cn08YnI+CiZuYnNwOzwvZm9udD48L3A+CgoKPHRhYmxlIGNsYXNzPSJkb2NpbmZvIiBydWxlcz0ibm9uZSIgZnJhbWU9InZvaWQiIGlkPSJ0YWJsZTEiPgoJPGNvbGdyb3VwPgoJCTxjb2wgY2xhc3M9ImRvY2luZm8tbmFtZSI+PGNvbCBjbGFzcz0iZG9jaW5mby1jb250ZW50Ij4KCTwvY29sZ3JvdXA+Cgk8dGJvZHkgdkFsaWduPSJ0b3AiPgoJCTx0cj4KCQkJPHRoIGNsYXNzPSJkb2NpbmZvLW5hbWUiPkNvcHlyaWdodDo8L3RoPgoJCQk8dGQ+Q29weXJpZ2h0IKkgSW50ZWwgQ29ycG9yYXRpb24gMjAwOC0yMDEwLjwvdGQ+CgkJPC90cj4KCQk8dHIgY2xhc3M9ImZpZWxkIj4KCQkJPHRoIGNsYXNzPSJkb2NpbmZvLW5hbWUiPkxpY2Vuc2U6PC90aD4KCQkJPHRkIGNsYXNzPSJmaWVsZC1ib2R5Ij5EaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgCgkJCVZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIDx0dCBjbGFzcz0ibGl0ZXJhbCI+CgkJCTxzcGFuIGNsYXNzPSJwcmUiPkxJQ0VOU0VfMV8wLnR4dDwvc3Bhbj48L3R0PiBvciBjb3B5IGF0CgkJCTxhIGNsYXNzPSJyZWZlcmVuY2UiIHRhcmdldD0iX3RvcCIgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij4KCQkJaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0PC9hPik8L3RkPgoJCTwvdHI+CjwvdGFibGU+Cgo8L2JvZHk+Cgo8L2h0bWw+Cg==