Q3VycmVudCBmdW5jdGlvbmFsaXR5IGxldmVsOiBFU1NMIDMuMCwgR0xTTCAxLjUKCkJ1Z3MKIC0gaW1wbGljaXRseS1zaXplZCBnbF9DbGlwRGlzdGFuY2VbXSAoYXQgbGVhc3QgaW4gdGVzc2VsbGF0aW9uIHNoYWRlcnMpIHdpdGggc2l6ZXMgZ3JlYXRlciB0aGFuIG9uZSBhcmUgbm90IGdldHRpbmcgc2l6ZXMgZ3JlYXRlciB0aGFuIG9uZQoKKyBjcmVhdGUgdmVyc2lvbiBzeXN0ZW0KCkxpbmsgVmFsaWRhdGlvbgogICAgKyBwcm92aWRlIGlucHV0IGNvbmZpZyBmaWxlIGZvciBzZXR0aW5nIGxpbWl0cwogICAgICAtIGFsc28gY29uc2lkZXIgc3BpdHRpbmcgb3V0IG1lYXN1cmVzIG9mIGNvbXBsZXhpdHkKICAgICsgZW5zdXJlIG5vIHN0YXRpYyByZWZlcmVuY2VzIHRocm93biBhd2F5CiAgICAtIGdlbmVyYXRlIHN0YXRpYyB1c2Ugb2Ygb2JqZWN0IGV2ZW4gaWYgdGhlIG9ubHkgdXNlIGlzIHRvIGFjY2VzcyB0aGUgbGVuZ3RoIG9mIGl0cyBhcnJheQogICAgQ3Jvc3Mtc3RhZ2UgbGlua2luZwogICAgICAtIHR5cGUgY29uc2lzdGVuY3kgY2hlY2sgb2YgdW5pZm9ybSBhbmQgaW5zIDwtPiBvdXRzLCBib3RoIHZhcmlhYmxlcyBhbmQgYmxvY2tzLCBzdGFnZS1zcGVjaWZpYyBhcnJheW5lc3MgbWF0Y2hpbmcKICAgICAgLSBsb2NhdGlvbi9iaW5kaW5nL2luZGV4IGNoZWNrCiAgICAgIC0gbWl4ZWQgZXMvbm9uLWVzIHByb2ZpbGVzCiAgICAgIC0gc3RhdGljYWxseSBjb25zdW1lZCBpbnB1dCBub3QgcHJvZHVjZWQgYnkgcHJldmlvdXMgc3RhZ2UKICAgICAgLSBnaXZlIGVycm9yIGZvciBzaGFyaW5nIGEgcGFja2VkIGJsb2NrCiAgICAgIC0gMS4yOiBtYXRjaGluZyBpbml0aWFsaXplcnMgZm9yIHVuaWZvcm1zCiAgICAgIC0gMS4zOiBvbmx5IHN0YXRpY2FsbHkgdXNlZCBidWlsdC1pbnMgaGF2ZSB0byBiZSByZWRlY2xhcmVkIGFzIGZsYXQKICAgICAgLSAxLjU6IG1hdGNoaW5nIGJldHdlZW4gZ2xfUGVyVmVydGV4IGJsb2NrcyBhbmQgZ2xfUGVyRnJhZ21lbnQgYmxvY2tzCiAgICAgIC0gMS4zOiBkZXByZWNhdGVkIG1peGluZyBmaXhlZCB2ZXJ0ZXgvZnJhZ21lbnQgc3RhZ2Ugd2l0aCBwcm9ncmFtbWFibGUgZnJhZ21lbnQvdmVydGV4IHN0YWdlLgogICAgICArIDQuMDogdGVzc2VsbGF0aW9uIHByaW1pdGl2ZSwgdmVydGljZXMsIHNwYWNpbmcsIG9yZGVyLCAKICAgICAgLSA0LjM6IGNvbXB1dGUgc2hhZGVyIG5vdCBjb21iaW5lZCB3aXRoIGFueSBvdGhlciBzdGFnZXMKICAgICAgLSA0LjM6IHJlbW92ZSBjcm9zcy12ZXJzaW9uIGxpbmtpbmcgcmVzdHJpY3Rpb25zLgogICAgICAtIDQuMzogQWxsb3cgbWlzbWF0Y2hlcyBpbiBpbnRlcnBvbGF0aW9uIGFuZCBhdXhpbGlhcnkgcXVhbGlmaWNhdGlvbiBhY3Jvc3Mgc3RhZ2VzLgogICAgICAtIDQuNDogQSBzdGFnZSBjb250YWlucyB0d28gZGlmZmVyZW50IGJsb2NrcywgZWFjaCB3aXRoIG5vIGluc3RhbmNlIG5hbWUsIHdoZXJlIHRoZSBibG9ja3MgY29udGFpbiBhIG1lbWJlciB3aXRoIHRoZSBzYW1lIG5hbWUuCiAgICBJbnRyYS1zdGFnZSBsaW5raW5nLCBzaW5nbGUgc2hhZGVyCiAgICAgICsgcmVjdXJzaW9uIGZvciBmdW5jdGlvbnMKICAgICAgLSBsaW1pdHMgY2hlY2tpbmc6CiAgICAgICAgICArIGJpbmRpbmdzCiAgICAgICAgICAtIG51bWJlciBvZiBpbnB1dC9vdXRwdXQgY29tcG9ub25lbnRzCiAgICAgICAgICArIHRlc3NlbGxhdGlvbiBsaW1pdHMKICAgICAgICAgICsgdGVzc2VsbGF0aW9uIHByaW1pdGl2ZSBhcnJheSBzaXppbmcgY29uc2lzdGVuY3kKICAgICAgICAgICsgTm9uIEVTOiBnbF9UZXhDb29yZCBjYW4gb25seSBoYXZlIGEgbWF4IGFycmF5IHNpemUgb2YgdXAgdG8gZ2xfTWF4VGV4dHVyZUNvb3JkcwogICAgICAgICAgKyBOb24gRVM6IGdsX0NsaXBEaXN0YW5jZSAuLi4KICAgICAgICAgIC0gLi4uCiAgICAgICsgZXhhY3RseSBvbmUgbWFpbgogICAgICArIEVTIDMuMDogZnJhZ21lbnQgb3V0cHV0cyBhbGwgaGF2ZSBsb2NhdGlvbnMsIGlmIG1vcmUgdGhhbiBvbmUKICAgICAgKyBsb2NhdGlvbiBhbGlhc2luZy9vdmVybGFwIChleGNlcHQgZGVza3RvcCB2ZXJ0ZXggc2hhZGVyIGlucHV0cykKICAgICAgKyBiaW5kaW5nIG92ZXJsYXAgZm9yIGF0b21pYyBjb3VudGVycwogICAgICArIE5vbiBFUzogZ2VvbWV0cnkgc2hhZGVyIGlucHV0IGFycmF5IHNpemVzIGFuZCBpbnB1dCBsYXlvdXQgcXVhbGlmaWVyIGRlY2xhcmF0aW9uCiAgICAgICsgTm9uIEVTOiByZWFkIG9yIHdyaXRlIHRvIGJvdGggZ2xfQ2xpcFZlcnRleCBhbmQgZ2xfQ2xpcERpc3RhbmNlCiAgICAgICsgTm9uIEVTOiB3cml0ZSB0byBvbmx5IG9uZSBvZiBnbF9GcmFnQ29sb3IsIGdsX0ZyYWdEYXRhLCBvciB1c2VyLWRlY2xhcmVkCiAgICAgICsgMS41MDogbWF0Y2ggYmV0d2VlbiBhbGwgZXhwbGljaXQgaW5wdXQgYXJyYXkgc2l6ZXMgYW5kIGlucHV0IHByaW1pdGl2ZQogICAgICArIDEuNTA6IGF0IGxlYXN0IG9uZSBnZW9tZXRyeSBzaGFkZXIgc2F5cyBpbnB1dCBwcmltaXRpdmUgYW5kIGF0IGxlYXN0IG9uZSBzYXlzIG91dHB1dCBwcmltaXRpdmUuLi4KICAgICAgKyAxLjUwOiBhdCBsZWFzdCBvbmUgZ2VvbWV0cnkgc2hhZGVyIHNheXMgbWF4X3ZlcnRpY2VzLi4uCiAgICAgICsgMS41MDogb3JpZ2luX3VwcGVyX2xlZnQgYW5kIHBpeGVsX2NlbnRlcl9pbnRlZ2VyIGhhdmUgdG8gbWF0Y2gKICAgICAgLSBFdmVuIHRoZSBwb3RlbnRpYWwgZm9yIHJlY3Vyc2lvbiB0aHJvdWdoIHN1YnJvdXRpbmUgdW5pZm9ybXMgaXMgYW4gZXJyb3IuCiAgICAgIC0gNC40OiBBbiBpbnRlcmZhY2UgY29udGFpbnMgdHdvIGRpZmZlcmVudCBibG9ja3MsIGVhY2ggd2l0aCBubyBpbnN0YW5jZSBuYW1lLCB3aGVyZSB0aGUgYmxvY2tzIGNvbnRhaW4gYSBtZW1iZXIgd2l0aCB0aGUgc2FtZSBuYW1lLgogICAgICAtIDQuNDogY29tcG9uZW50IGFsaWFzaW5nIChleGNlcHQgZGVza3RvcCB2ZXJ0ZXggc2hhZGVyIGlucHV0cykKICAgICAgLSA0LjQ6IG92ZXJsYXBwaW5nIHRyYW5zZm9ybS9mZWVkYmFjayBvZmZzZXRzLCBvZmZzZXQvc3RyaWRlIG92ZXJmbG93IGNoZWNrcywgYW5kIHN0cmlkZSBtYXRjaGluZwogICAgSW50cmEtc3RhZ2UgbGlua2luZywgbXVsdGlwbGUgc2hhZGVyIChOb24tRVMpCiAgICAgICsgdHlwZSBjb25zaXN0ZW5jeSBjaGVjayBvZiB1bmlmb3JtcywgZ2xvYmFscywgaW5zLCBhbmQgb3V0cwogICAgICArIHZhbHVlIGNoZWNraW5nIG9mIGdsb2JhbCBjb25zdCBpbml0aWFsaXplcnMKICAgICAgKyB2YWx1ZSBjaGVja2luZyBvZiB1bmlmb3JtIGluaXRpYWxpemVycwogICAgICArIGxvY2F0aW9uIG1hdGNoCiAgICAgIC0gYmxvY2sgbWF0Y2hpbmcKICAgICAgKyBjb21wb25lbnQvYmluZGluZy9pbmRleC9vZmZzZXQgbWF0Y2ggY2hlY2sKICAgICAgKyBjb21wdXRlIHNoYWRlciBsYXlvdXQobG9jYWxfc2l6ZV8qKSBtYXRjaGluZwogICAgICArIG1peGVkIGVzL25vbi1lcyBwcm9maWxlcyBhcmUgYW4gZXJyb3IKICAgICAgLSBiaW5kaW5nIG92ZXJsYXAgZm9yIGF0b21pYyBjb3VudGVycwogICAgICAtIG1hdGNoaW5nIHJlZGVjbGFyYXRpb25zIG9mIGludGVyZmFjZSBibG9ja3MKICAgICAgLSA0LjM6IGltcGxpY2l0IGFycmF5IHNpemluZyBpcyBjcm9zcyBzaGFkZXIgd2l0aGluIGEgc3RhZ2UKICAgICAgLSA0LjQ6IElmIGdsX0ZyYWdDb29yZCBpcyByZWRlY2xhcmVkIGluIGFueSBmcmFnbWVudCBzaGFkZXIgaW4gYSBwcm9ncmFtLCBpdCBtdXN0IGJlIHJlZGVjbGFyZWQgaW4gYWxsIHRoZSBmcmFnbWVudCBzaGFkZXJzIGluIHRoYXQgcHJvZ3JhbSB0aGF0IGhhdmUgYSBzdGF0aWMgdXNlIGdsX0ZyYWdDb29yZAoKU2hhZGVyIEZ1bmN0aW9uYWxpdHkgdG8gSW1wbGVtZW50L0ZpbmlzaAogICAgRVNTTCAyLjAgKCN2ZXJzaW9uIDEwMCkKICAgICAgKyBpbXBsZW1lbnQgbm9uLWluZHVjdGl2ZSBsb29wIGxpbWl0YXRpb24gZGV0ZWN0aW9uCiAgICAgICsgaW1wbGVtZW50IG5vbi1pbmR1Y3RpdmUgYXJyYXkgYWNjZXNzZXMgbGltaXRhdGlvbiBkZXRlY3Rpb24KICAgIEVTU0wgMy4wCiAgICAgIC0gImNvbnN0IiBjb21waWxlLXRpbWUgY29uc3RhbnQgcHJvcGFnYXRpb24gaW4gdGhlIGZyb250LWVuZCBoYXMgdG8gYmUgY29tcGxldGUsIGZvciBhbGwgYnVpbHQtaW4gZnVuY3Rpb25zCiAgICBFU1NMIDMuMQogICAgICArIENvbXB1dGUgc2hhZGVycwogICAgICArIFNoYWRlciBzdG9yYWdlIGJ1ZmZlciBvYmplY3RzCiAgICAgIC0gQXJyYXlzIG9mIGFycmF5cwogICAgICArIEF0b21pYyBjb3VudGVycwogICAgICArIEltYWdlcwogICAgICArIFNlcGFyYXRlIHByb2dyYW0gb2JqZWN0cyAoYWxzbyBrbm93biBhcyBzZXBhcmF0ZSBzaGFkZXIgb2JqZWN0cykKICAgICAgKyBFeHBsaWNpdCB1bmlmb3JtIGxvY2F0aW9ucwogICAgICArIFRleHR1cmUgZ2F0aGVyCiAgICAgICsgQml0ZmllbGQgb3BlcmF0aW9ucwogICAgICArIEludGVnZXIgbWl4IGZ1bmN0aW9uCiAgICAgICsgb3ZlcmxhcHBpbmcgYmluZGluZ3Mvb2Zmc2V0cyBhbmQgb2Zmc2V0IHBvc3QgaW5jcmVtZW50CiAgICAgICsgZnJleHAvbGRleHAKICAgICAgKyBwYWNrVW5vcm00eDgoKSxwYWNrU25vcm00eDgoKSwgdW5wYWNrVW5vcm00eDgoKSwgdW5wYWNrU25vcm00eDgoKQogICAgICArIDJETVMgc2FtcGxlcnMgYW5kIGltYWdlcwogICAgICArIGluaGVyaXRhbmNlIG9mIG1lbW9yeSBxdWFsaWZpZXJzIGluIGJsb2NrIG1lbWJlcnMKICAgIEdMU0wgMS4yCiAgICAgICsgSGFuZGxlIG11bHRpcGxlIGNvbXBpbGF0aW9uIHVuaXRzIHBlciBzdGFnZQogICAgICArIEFsbG93IGluaXRpYWxpemVycyBvbiB1bmlmb3JtIGRlY2xhcmF0aW9ucwogICAgICArIHNpZ25hdHVyZSBtYXRjaGluZyB0YWtlcyB0eXBlIGNvbnZlcnNpb25zIGludG8gYWNjb3VudCwgYW1iaWd1aXR5IGlzIGFuIGVycm9yCiAgICBHTFNMIDEuMwogICAgICArIGZsYXQgcmVkZWNsYXJhdGlvbiBvZiBidWlsdC1pbiB2YXJpYWJsZXMKICAgICAgLSBQcmVwcm9jZXNzb3IgdG9rZW4gcGFzdGluZyAoIyMpLCAjIyBkb2VzIG1hY3JvIGV4cGFuc2lvbiBhZnRlciBwYXN0aW5nIG5vdCBiZWZvcmUKICAgICAgKyBub24tcGVyc3BlY3RpdmUgKGxpbmVhcikgaW50ZXJwb2xhdGlvbiAobm9wZXJzcGVjdGl2ZSkKICAgICAgKyBhZGQgZ2xfQ2xpcERpc3RhbmNlW10gdG8gYm90aCB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMKICAgICAgKyBEZXByZWNhdGVkIGdsX0NsaXBWZXJ0ZXgKICAgICAgKyBkZXByZWNhdGUgYWxtb3N0IGFsbCBidWlsdC1pbiBzdGF0ZQogICAgICArIGZ0cmFuc2Zvcm0oKSBpcyBkZXByZWNhdGVkCiAgICAgICsgRGVwcmVjYXRlZCBidWlsdC1pbiB2ZXJ0ZXggaW5wdXRzIChhdHRyaWJ1dGVzKSBhbmQgc29tZSBvdXRwdXRzICh2YXJ5aW5ncykuCiAgICBHTFNMIDEuNCAoTm9uLUVTKQogICAgICArIHJlY3Rhbmd1bGFyIHRleHR1cmVzCiAgICAgICsgdHJhY2sgYXMgcmVtb3ZlZCBpbiB0aGlzIHJlbGVhc2UsIGJ1dCBwcmVzZW50IGluIG90aGVyczoKICAgICAgICArIFVzZSBvZiBnbF9DbGlwVmVydGV4LiAgVXNlIGdsX0NsaXBEaXN0YW5jZSBpbnN0ZWFkLgogICAgICAgICsgQnVpbHQtaW4gdmVydGV4IHNoYWRlciBpbnB1dHMuCiAgICAgICAgKyBCdWlsdC1pbiB1bmlmb3JtcyBleGNlcHQgZm9yIGRlcHRoIHJhbmdlIHBhcmFtZXRlcnMKICAgICAgICArIEJ1aWx0LWluIGludGVyZmFjZSBiZXR3ZWVuIHZlcnRleCBhbmQgZnJhZ21lbnQ6ICBnbF9UZXhDb29yZCwgZ2xfRm9nRnJhZ0Nvb3JkLCBhbmQgYWxsIHRoZSBjb2xvciB2YWx1ZXMuCiAgICAgICAgKyBCdWlsdC1pbiB0d28tc2lkZWQgY29sb3JpbmcuCiAgICAgICAgKyBGaXhlZCBmdW5jdGlvbmFsaXR5IGZvciBhIHByb2dyYW1tYWJsZSBzdGFnZS4gCiAgICAgICAgKyBmdHJhbnNmb3JtKCkuICBVc2UgaW52YXJpYW50IG91dHB1dHMgaW5zdGVhZC4KICAgIEdMU0wgMS41IChOb24tRVMpCiAgICAgICsgRGVwcmVjYXRlZCBnbF9NYXhWYXJ5aW5nQ29tcG9uZW50cwogICAgICArIEFkZCBuZXcgbWluaW11bSBtYXhpbXVtcyBmb3IgZ2xfTWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cywgZ2xfTWF4R2VvbWV0cnlJbnB1dENvbXBvbmVudHMsIGdsX01heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cywgYW5kIGdsX01heEZyYWdtZW50SW5wdXRDb21wb25lbnRzLCAKICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gZ2xfTWF4VmFyeWluZ0NvbXBvbmVudHMuICBBbHNvLCBjb3JyZWN0ZWQgZ2xfTWF4VmFyeWluZ0NvbXBvbmVudHMgdG8gYmUgNjAgaW5zdGVhZCBvZiA2NC4KICAgICAgKyBBZGRlZCBnbF9QcmltaXRpdmVJRCBhcyBhbiBpbnB1dCB0byBmcmFnbWVudCBzaGFkZXJzLgogICAgICArIEFkZGVkIGdsX0ZyYWdDb29yZCBxdWFsaWZpZXJzIG9yaWdpbl91cHBlcl9sZWZ0LCBhbmQgcGl4ZWxfY2VudGVyX2ludGVnZXIgdG8gbW9kaWZ5IHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgZ2xfRnJhZ0Nvb3JkIChhbmQgaGF2ZSBubyBhZmZlY3Qgb24gYW55IG90aGVyIGFzcGVjdCBvZiB0aGUgcGlwZWxpbmUgb3IgbGFuZ3VhZ2UpLgogICAgICAgICsgaW5jbHVkaW5nIHJlZGVjbGFyYXRpb24gb2YgZ2xfRnJhZ0Nvb3JkIHRoYXQgYWRkcyBub3RoaW5nCiAgICAgICsgQWRkZWQgc3VwcG9ydCBmb3IgbXVsdGktc2FtcGxlIHRleHR1cmVzIHRocm91Z2ggc2FtcGxlcjJETVMgYW5kIHNhbXBsZXIyRE1TQXJyYXkgc3VwcG9ydCBpbiB0ZXhlbEZldGNoKCkgYW5kIHRleHR1cmVTaXplKCkuCiAgICAgICsgQnJvYWRlbmVkIGludGVyZmFjZSBibG9ja3MgZnJvbSBqdXN0IHVuaWZvcm1zIHRvIGluIGFuZCBvdXQgaW50ZXJmYWNlcyBhcyB3ZWxsLgogICAgICArIEJyb2FkZW4gYXJyYXkgdXNhZ2UgdG8gaW5jbHVkZSB2ZXJ0ZXggc2hhZGVyIGlucHV0cyAodmVydGV4IGluKS4KICAgICAgKyBBZGRlZCBnZW9tZXRyeSBzaGFkZXJzLiAgVGhpcyBpbmNsdWRlcyB0YXJnZXRpbmcgbGF5ZXJzIGluIEZCTyByZW5kZXJpbmcuCiAgICAgICsgZ2VvbWV0cnkgc2hhZGVyIGxheW91dHM6IHRoZXkgbXVzdCBiZSBkZWNsYXJlZCwgdGVsbGluZyB0aGUgc3lzdGVtIHRoZSBwcmltaXRpdmUgaW5wdXQgYW5kIG91dHB1dCB0eXBlcyBhbmQgbWF4aW11bSBudW1iZXIgb2YgdmVydGljZXMuCiAgICAgICsgQWRkZWQgZ2VvbWV0cnkgc2hhZGVyIGNvbnN0YW50cy4KICAgICAgKyBCcm9hZGVuIHN0cnVjdHVyZSB1c2FnZSB0byBpbmNsdWRlIGdlb21ldHJ5IGlucHV0cyBhbmQgZ2VvbWV0cnkgb3V0cHV0cy4KICAgICAgKyB0ZXhlbCBvZmZzZXQgbGltaXQgY2hlY2tpbmcKICAgICAgKyAxLjUwOiBnZW9tZXRyeSBzaGFkZXJzOiBtYXhfdmVydGljZXMgbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgZ2xfTWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyAobWF5YmUgYXQgY29tcGlsZSB0aW1lKQogICAgR0xTTCAzLjMKICAgICAgKyBBZGQgQVJCX2V4cGxpY2l0X2F0dHJpYl9sb2NhdGlvbiBleHRlbnNpb24KICAgICAgKyBBZGQgQVJCX3NoYWRlcl9iaXRfZW5jb2RpbmcgZXh0ZW5zaW9uCiAgICBHTFNMIDQuMAogICAgICArIHRlc3NlbGxhdGlvbiBjb250cm9sIHN0YWdlIGFuZCB0ZXNzZWxsYXRpb24gZXZhbHVhdGlvbiBzdGFnZS4gSW5jbHVkZXMgYmFycmllcigpIGJ1aWx0LWluIGZvciBzeW5jaHJvbml6YXRpb24uCiAgICAgICAgKyBwYXRjaCBpbiwgcGF0Y2ggb3V0CiAgICAgICAgKyBpbnB1dC9vdXRwdXQgYXJyYXlzCiAgICAgICAgICArIHVuc2l6ZWQgYXJyYXkgc2l6aW5nIHRvIGdsX01heFBhdGNoVmVydGljZXMsIGluY2x1ZGluZyBnbF9pbi9nbF9vdXQKICAgICAgICArIGJ1aWx0LWluIHZhcmlhYmxlcywgZnVuY3Rpb25zLCBhbmQgY29uc3RhbnRzIHZlcmlmaWNhdGlvbgogICAgICAgICsgbGF5b3V0IHF1YWxpZmllcnMgZm9yIHByaW1pdGl2ZSB0eXBlcwogICAgICAtIFBvbHltb3JwaGljIGZ1bmN0aW9uczogUnVuLXRpbWUgc2VsZWN0aW9uIG9mIHdoYXQgZnVuY3Rpb24gZ2V0cyBjYWxsZWQsIHRocm91Z2ggdGhlIG5ldyBrZXl3b3JkIHN1YnJvdXRpbmUuCiAgICAgIC0gNjRiaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB3aXRoIHRoZSBuZXcgdHlwZSBrZXl3b3JkIGRvdWJsZS4gIEJ1aWx0LWluIGZ1bmN0aW9ucyBleHRlbmRlZCBmb3IgZG91YmxlcywgYW5kIG5ldyBmdW5jdGlvbiBtYXRjaGluZyBydWxlcyBhcmUgYWRkZWQgdG8gYm90aCBhbGxvdyBpbXBsaWNpdCBjb252ZXJzaW9ucyB3aGVuIGNhbGxpbmcgYSBmdW5jdGlvbiBhbmQgcHJlc2VydmUgbW9zdCBleGlzdGluZyBmdW5jdGlvbiBtYXRjaGluZyBvbmNlIGRvdWJsZXMgYXJlIGluY2x1ZGVkLiAKICAgICAgKyBNb3JlIGltcGxpY2l0IGNvbnZlcnNpb25zIAogICAgICAgICArIGZsb2F0IHRvIGRvdWJsZSwgYW5kIHNpbWlsYXJseSBmb3IgYWxsIGZsb2F0aW5nLXBvaW50IHZlY3RvciBhbmQgbWF0cml4IHR5cGVzCiAgICAgICAgICsgaW50IHRvIHVpbnQsIGFuZCBzaW1pbGFybHkgZm9yIGFsbCBpbnRlZ2VyIHZlY3RvciB0eXBlcwogICAgICAgICArIGludCB0byBkb3VibGUsIGFuZCBzaW1pbGFybHkgZm9yIGFsbCB2ZWN0b3JzIG9mIGludGVnZXJzIGFuZCBkb3VibGVzLgogICAgICAgICArIHVpbnQgdG8gZG91YmxlLCBhbmQgc2ltaWxhcmx5IGZvciBhbGwgdmVjdG9ycyBvZiBpbnRlZ2VycyBhbmQgZG91Ymxlcy4KICAgICAgKyBDdWJlIG1hcCBhcnJheSB0ZXh0dXJlcyBhbmQgdGV4dHVyZSBmdW5jdGlvbnMgdGV4dHVyZSgpLCB0ZXh0dXJlU2l6ZSgpLCB0ZXh0dXJlTG9kKCksIGFuZCB0ZXh0dXJlR3JhZCgpLgogICAgICArIFNhbXBsZXIgYXJyYXlzIGNhbiB0YWtlIGEgdmFyaWFibGUgaW5kZXggbm93LCBhcyBsb25nIGFzIGl0J3MgdmFsdWUgaXMgdW5pZm9ybSBmb3IgYWxsIHVzZXMuCiAgICAgIC0gUGVyLXNhbXBsZSBzaGFkaW5nLiBJbmNsdWRpbmcgc2FtcGxlIGlucHV0IG1hc2sgZ2xfU2FtcGxlTWFza0luW10gYW5kIHBlci1zYW1wbGUgaW50ZXJwb2xhdGlvbiwgd2l0aCBleHBsaWNpdCBpbnRlcnBvbGF0aW9uIGJ1aWx0LWlucyBpbnRlcnBvbGF0ZUF0Q2VudHJvaWQoKSwgaW50ZXJwb2xhdGVBdFNhbXBsZSgpLCBhbmQgaW50ZXJwb2xhdGVBdE9mZnNldCgpLgogICAgICAtIE5ldyBwcmVjaXNlIHF1YWxpZmllciB0byBkaXNhbGxvdyBvcHRpbWl6YXRpb25zIHRoYXQgcmUtb3JkZXIgb3BlcmF0aW9ucyBvciB0cmVhdCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG9wZXJhdG9yIHdpdGggZGlmZmVyZW50IHByZWNpc2lvbi4KICAgICAgKyBBZGQgYSBmdXNlZCBtdWx0aXBseSBhbmQgYWRkIGJ1aWx0LWluLCBmbWEoKSwgaW4gcmVsYXRpb24gdG8gdGhlIG5ldyBwcmVjaXNlIHF1YWxpZmllci4gKEJlY2F1c2Ugk2EgKiBiICsgY5Qgd2lsbCByZXF1aXJlIHR3byBvcGVyYXRpb25zIHVuZGVyIG5ldyBydWxlcyBmb3IgcHJlY2lzZS4pCiAgICAgICsgQWRkZWQgbmV3IGJ1aWx0LWluIGZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucyAKICAgICAgICAgKyBmcmV4cCgpIGFuZCBsZGV4cCgpCiAgICAgICAgICsgcGFja1Vub3JtMngxNigpLCB1bnBhY2tVbm9ybTJ4MTYoKSwKICAgICAgICAgKyBwYWNrVW5vcm00eDgoKSwgcGFja1Nub3JtNHg4KCksIHVucGFja1Vub3JtNHg4KCksIHVucGFja1Nub3JtNHg4KCkKICAgICAgICAgKyBwYWNrRG91YmxlMngzMigpIGFuZCB1bnBhY2tEb3VibGUyeDMyKCkKICAgICAgKyBBZGQgbmV3IGJ1aWx0LWluIGludGVnZXIgZnVuY3Rpb25zCiAgICAgICAgICsgdWFkZENhcnJ5KCkgYW5kIHVzdWJCb3Jyb3coKQogICAgICAgICArIHVtdWxFeHRlbmRlZCgpIGFuZCBpbXVsRXh0ZW5kZWQoKQogICAgICAgICArIGJpdGZpZWxkRXh0cmFjdCgpIGFuZCBiaXRmaWVsZEluc2VydCgpCiAgICAgICAgICsgYml0ZmllbGRSZXZlcnNlKCkKICAgICAgICAgKyBiaXRDb3VudCgpLCBmaW5kTFNCKCksIGFuZGZpbmRNU0IoKQogICAgICAtIE5ldyBidWlsdC1pbiB0byBxdWVyeSBMT0QsIHRleHR1cmVRdWVyeUxvZCgpLgogICAgICAtIE5ldyBvdmVybG9hZGVkIGZ1bmN0aW9uIG1hdGNoaW5nIGFsZ29yaXRobSwgaGFuZGxpbmcgc2VsZWN0aW9uIGZyb20gbWFueSB2YWxpZCBtdWx0aXBsZSBjaG9pY2VzLgogICAgICArIFRleHR1cmUgZ2F0aGVyIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBmb3VyIHRleGVscyB3aXRoIGEgc2luZ2xlIGNhbGwuCiAgICAgICAgICsgdGV4dHVyZUdhdGhlcigpCiAgICAgICAgICsgdGV4dHVyZUdhdGhlck9mZnNldCgpCiAgICAgICAgICsgdGV4dHVyZUdhdGhlck9mZnNldHMoKQogICAgICArIEFkZCBzdHJlYW1zIG91dCBmcm9tIGdlb21ldHJ5IHNoYWRlci4gT3V0cHV0IGNhbiBiZSBkaXJlY3RlZCB0byBzdHJlYW1zIHRocm91Z2gKICAgICAgICAgKyBFbWl0U3RyZWFtVmVydGV4KCkgYW5kIEVuZFN0cmVhbVByaW1pdGl2ZSgpLgogICAgR0xTTCA0LjEKICAgICAgKyBTdXBwb3J0IGZvciBwYXJ0aXRpb25pbmcgc2hhZGVycyBpbnRvIG11bHRpcGxlIHByb2dyYW1zIHRvIHByb3ZpZGUgbGlnaHQtd2VpZ2h0IG1peGluZyBvZiBkaWZmZXJlbnQgc2hhZGVyIHN0YWdlcy4KICAgICAgICAgICAgKEdMX0FSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cykKICAgICAgICArIGxheW91dCBxdWFsaWZpZXJzCiAgICAgICAgKyByZWRlY2xhcmF0aW9uIG9mIGlucHV0L291dHB1dCBibG9ja3MKICAgICAgICArIC4uLgogICAgICAtIEFkZCA2NC1iaXQgZmxvYXRpbmctcG9pbnQgYXR0cmlidXRlcyBmb3IgdmVydGV4IHNoYWRlciBpbnB1dHMuCiAgICAgICsgU3VwcG9ydCB2aWV3cG9ydCBhcnJheXMgc28gd2hlcmUgdGhlIGdlb21ldHJ5IHNoYWRlciBzZWxlY3RzIHdoaWNoIHZpZXdwb3J0IGFycmF5IHdpbGwgdHJhbnNmb3JtIGl0cyBvdXRwdXQuCiAgICBHTFNMIDQuMgogICAgICArIE1vdmUgdGhlc2UgcHJldmlvdXNseSBkZXByZWNhdGVkIGZlYXR1cmVzIHRvIGJlIG9ubHkgaW4gdGhlIGNvbXBhdGliaWxpdHkgcHJvZmlsZToKICAgICAgICArIFRoZSBrZXl3b3JkIGF0dHJpYnV0ZSBmb3IgdmVydGV4IHNoYWRlciBpbnB1dHMuIChVc2UgaW4gaW5zdGVhZC4pCiAgICAgICAgKyBUaGUga2V5d29yZCB2YXJ5aW5nIGZvciBpbnB1dHMgYW5kIG91dHB1dHMuIChVc2UgaW4gYW5kIG91dCBpbnN0ZWFkLikKICAgICAgICArIFRoZSBvcmlnaW5hbCB0ZXh0dXJpbmcgYnVpbHQtaW4gZnVuY3Rpb25zLiAoVXNlIHRoZSBuZXcgZm9ybXMgaW5zdGVhZC4pCiAgICAgICAgKyBUaGUgYnVpbHQtaW4gdmFyaWFibGVzIGdsX0ZyYWdDb2xvciBhbmQgZ2xfRnJhZ0RhdGEuIChVc2Ugb3V0IGluc3RlYWQuKQogICAgICAgICsgQnVpbHQtaW4gY29uc3RhbnRzIHJlbGF0ZWQgdG8gdGhlc2UuCiAgICAgICsgQ2hhbmdlIGZyb20gQVNDSUkgdG8gVVRGLTggZm9yIHRoZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0IGFuZCBhbHNvIGFsbG93IGFueSBjaGFyYWN0ZXJzIGluc2lkZSBjb21tZW50cyAoZXhjZXB0IHRoZSBieXRlIHZhbHVlIDApLCAKICAgICAgICBpbmNsdWRpbmcgJ1wnLgogICAgICArIEFkZCBsaW5lLWNvbnRpbnVhdGlvbiB1c2luZyAnXCcsIGFzIGluIEMrKy4KICAgICAgKyBFUyBjb252ZXJnZW5jZQogICAgICAgICsgQ2xhcmlmeSB0aGF0IC54eXp3eHkueHkgaXMgaWxsZWdhbCwgYXMgaXQgdGVtcG9yYXJpbHkgbWFrZXMgYSCTdmVjNpQuCiAgICAgICAgKyBDbGFyaWZ5IHRoYXQgcmV0dXJuIHN0YXRlbWVudHMgb25seSBhY2NlcHQgdmFsdWVzIChubyByZXR1cm4gb2YgYSB2b2lkIGZ1bmN0aW9uKS4KICAgICAgKyBBZGQgaW1hZ2UgdHlwZXMgKEdMX0FSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZSkKICAgICAgICArIDMzIG5ldyB0eXBlcywgYWxsIHdpdGggk2ltYWdllCBpbiB0aGVpciBuYW1lLCBjb3JyZXNwb25kIHRvIHRoZSBub24tc2hhZG93IHRleHR1cmUgdHlwZXMKICAgICAgICArIGFkZGl0aW9uIG9mIG1lbW9yeSBxdWFsaWZpZXJzOiBjb2hlcmVudCwgdm9sYXRpbGUsIHJlc3RyaWN0LCByZWFkb25seSwgYW5kIHdyaXRlb25seQogICAgICAgICsgY2FuIHJlYWQvd3JpdGUvbW9kaWZ5IGltYWdlcyBmcm9tIGEgc2hhZGVyLCB0aHJvdWdoIG5ldyBidWlsdC1pbiBmdW5jdGlvbnMKICAgICAgICArIHF1YWxpZmllcnMgY2FuIGFjdCBpbmRlcGVuZGVudGx5IG9uIHRoZSBvcGFxdWUgc2hhZGVyIHZhcmlhYmxlIGFuZCB0aGUgYmFja2luZyBpbWFnZSwgc28gZXh0cmEgcXVhbGlmaWVycyBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZWx5IHF1YWxpZnkgdGhlc2UKICAgICAgICArIGVhcmx5X2ZyYWdtZW50X3Rlc3RzCiAgICAgICsgVmFyaWFibGVzIGRlY2xhcmVkIGluIGlmIGFuZCBlbHNlIHN0YXRlbWVudHMgYXJlIHNjb3BlZCBvbmx5IHRvIHRoZSBlbmQgb2YgdGhvc2Ugc3RhdGVtZW50cywgZXNwZWNpYWxseSBmb3Igbm9uLWNvbXBvdW5kIHN0YXRlbWVudHMKICAgICAgICBOb3RlLCB0aGlzIGlzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlLCBpdCBtYXkgZGVwZW5kIG9uICN2ZXJzaW9uLgogICAgICArIEFsbG93IGltcGxpY2l0IGNvbnZlcnNpb25zIG9mIHJldHVybiB2YWx1ZXMgdG8gdGhlIGRlY2xhcmVkIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLgogICAgICArIFRoZSBjb25zdCBrZXl3b3JkIGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUgdmFyaWFibGVzIHdpdGhpbiBhIGZ1bmN0aW9uIGJvZHkgd2l0aCBpbml0aWFsaXplciBleHByZXNzaW9ucyB0aGF0IGFyZSBub3QgY29uc3RhbnQgZXhwcmVzc2lvbnMuCiAgICAgICsgUXVhbGlmaWVycyBvbiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgbm8gbG9uZ2VyIGhhdmUgdG8gZm9sbG93IGEgc3RyaWN0IG9yZGVyLiBUaGUgbGF5b3V0IHF1YWxpZmllciBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcywgYW5kIG11bHRpcGxlIHBhcmFtZXRlciBxdWFsaWZpZXJzIGNhbiBiZSB1c2VkLgogICAgICArIFBhcmFtZXRlciBxdWFsaWZpZXJzIGNhbiBpbmNsdWRlIHByZWNpc2lvbiBhbmQgbWVtb3J5IHF1YWxpZmllcnMuCiAgICAgICsgQWRkIGEgbmV3IGF0b21pY191aW50IHR5cGUgdG8gc3VwcG9ydCBhdG9taWMgY291bnRlcnMuIEFsc28sIGFkZCBidWlsdC1pbiBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBhdG9taWMgY291bnRlcnMuCiAgICAgICAgKyBhdG9taWNDb3VudGVySW5jcmVtZW50LCBhdG9taWNDb3VudGVyRGVjcmVtZW50LCBhbmQgYXRvbWljQ291bnRlcgogICAgICArIEFkZCBsYXlvdXQgcXVhbGlmaWVyIGlkZW50aWZpZXJzIGJpbmRpbmcgYW5kIG9mZnNldCB0byBiaW5kIHVuaXRzIHRvIHNhbXBsZXIgYW5kIGltYWdlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucywgYXRvbWljIGNvdW50ZXJzLCBhbmQgdW5pZm9ybSBibG9ja3MuCiAgICAgICsgQWRkIGJ1aWx0LWluIGZ1bmN0aW9ucyB0byBwYWNrL3VucGFjayAxNiBiaXQgZmxvYXRpbmctcG9pbnQgbnVtYmVycyAoQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfcGFjazJmKS4KICAgICAgICArIHBhY2tIYWxmMngxNiBhbmQgdW5wYWNrSGFsZjJ4MTYKICAgICAgICArIHBhY2tTbm9ybTJ4MTZhbmQgdW5wYWNrU25vcm0yeDE2CiAgICAgICsgQWRkIGdsX0ZyYWdEZXB0aCBsYXlvdXQgcXVhbGlmaWVycyB0byBjb21tdW5pY2F0ZSB3aGF0IGtpbmQgb2YgY2hhbmdlcyB3aWxsIGJlIG1hZGUgdG8gZ2xfRnJhZ0RlcHRoIChHTF9BTURfY29uc2VydmF0aXZlIGRlcHRoKS4KICAgICAgKyBBZGQgQy1zdHlsZSBjdXJseSBicmFjZSBpbml0aWFsaXplciBsaXN0cyBzeW50YXggZm9yIGluaXRpYWxpemVycy4gRnVsbCBpbml0aWFsaXphdGlvbiBvZiBhZ2dyZWdhdGVzIGlzIHJlcXVpcmVkIHdoZW4gdGhlc2UgYXJlIHVzZWQuCiAgICAgICsgQWxsb3cgLmxlbmd0aCgpIHRvIGJlIGFwcGxpZWQgdG8gdmVjdG9ycyBhbmQgbWF0cmljZXMsIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgb3IgY29sdW1ucy4KICAgICAgKyBDbGFyaWZ5IHRoYXQgLmxlbmd0aCgpIHJldHVybnMgYW4gaW50IHR5cGUgYW5kIGNhbiBiZSB1c2VkIGFzIGEgY29uc3RhbnQgaW50ZWdlciBleHByZXNzaW9uLgogICAgICArIEFsbG93IHN3aXp6bGUgb3BlcmF0aW9ucyBvbiBzY2FsYXJzLgogICAgICArIFBvc2l0aXZlIHNpZ25lZCBkZWNpbWFsIGxpdGVyYWxzLCBhcyB3ZWxsIGFzIG9jdGFsIGFuZCBoZXhhZGVjaW1hbCwgY2FuIHNldCBhbGwgMzIgYml0cy4gVGhpcyBpbmNsdWRlcyBzZXR0aW5nIHRoZSBzaWduIGJpdCB0byBjcmVhdGUgYSBuZWdhdGl2ZSB2YWx1ZS4KICAgICAgKyBDbGFyaWZpZWQgdGhhdCBhIGNvbW1hIHNlcXVlbmNlLW9wZXJhdG9yIGV4cHJlc3Npb24gY2Fubm90IGJlIGEgY29uc3RhbnQgZXhwcmVzc2lvbi4gRS5nLiwgkygyLDMplCBpcyBub3QgYWxsb3dlZCwgc2VtYW50aWNhbGx5LCAKICAgICAgICAgICAgYXMgYSB2YWxpZCBjb25zdGFudCBleHByZXNzaW9uIDMsIGV2ZW4gdGhvdWdoIGl0IGlzIGFuIGV4cHJlc3Npb24gdGhhdCB3aWxsIGV2YWx1YXRlIHRvIDMuCiAgICAgICsgVXNlIHZlYzIgaW5zdGVhZCBvZiB2ZWMzIGZvciBjb29yZGluYXRlIGluIHRleHR1cmVHYXRoZXIqKHNhbXBsZXIyRFJlY3QsLi4uKS4KICAgICAgKyBDbGFyaWZ5IHRoYXQgdGV4dHVyZUdhdGhlck9mZnNldCgpIGNhbiB0YWtlIG5vbi1jb25zdGFudHMgZm9yIHRoZSBvZmZzZXRzLgogICAgR0xTTCA0LjMKICAgICAgKyBBZGQgc2hhZGVyIHN0b3JhZ2UgYnVmZmVyIG9iamVjdHMsIGFzIHBlciB0aGUgQVJCX3NoYWRlcl9zdG9yYWdlX2J1ZmZlcl9vYmplY3QgZXh0ZW5zaW9uLiBUaGlzIGluY2x1ZGVzIAogICAgICAgICAgICArIGFsbG93aW5nIHRoZSBsYXN0IG1lbWJlciBvZiBhIHN0b3JhZ2UgYnVmZmVyIGJsb2NrIHRvIGJlIGFuIGFycmF5IHRoYXQgZG9lcyBub3Qga25vdyBpdHMgc2l6ZSB1bnRpbCByZW5kZXIgdGltZQogICAgICAgICAgICArIHJlYWQvd3JpdGUgbWVtb3J5IHNoYXJlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBhbmQgb3RoZXIgc2hhZGVyIGludm9jYXRpb25zCiAgICAgICAgICAgICsgYWRkaW5nIHRoZSBzdGQ0MzAgbGF5b3V0IHF1YWxpZmllciBmb3Igc2hhZGVyIHN0b3JhZ2UgYmxvY2tzCiAgICAgICAgICAgICsgYWRkIGF0b21pYyBidWlsdC1pbnMKICAgICAgICAgICAgKyBsYXlvdXQoYmluZGluZz0pCiAgICAgIC0gQWxsb3cgLmxlbmd0aCgpIG9uIGFsbCBhcnJheXM7IHJldHVybmluZyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCBvciBub3QsIGRlcGVuZGluZyBvbiBob3cgdGhlIAogICAgICAgIGFycmF5IGlzIHNpemVkLCBhcyBwZXIgdGhlIEFSQl9zaGFkZXJfc3RvcmFnZV9idWZmZXJfb2JqZWN0IGV4dGVuc2lvbi4KICAgICAgLSBCZSBjbGVhciB0aGF0IGltcGxpY2l0IGFycmF5IHNpemluZyBpcyBvbmx5IHdpdGhpbiBhIHN0YWdlLCBub3QgY3Jvc3Mgc3RhZ2UuCiAgICAgIC0gQXJyYXkgY2xhcmlmaWNhdGlvbnM6IAogICAgICAgICAgICAtIEFsbCBhcnJheXMgYXJlIGluaGVyZW50bHkgaG9tb2dlbmVvdXMsIGV4Y2VwdCBmb3IgYXJyYXlzIG9mIHRoZSBuZXcgc2hhZGVyIHN0b3JhZ2UgYnVmZmVyIG9iamVjdHMKICAgICAgICAgICAgLSBBcnJheXMgb2Ygc2hhZGVyIHN0b3JhZ2UgYnVmZmVyIG9iamVjdHMgd2lsbCBiZSBkZXJlZmVyZW5jZWQgd2hlbiB0aGUgLmxlbmd0aCgpIG1ldGhvZCBpcyB1c2VkIG9uIGFuIHVuc2l6ZWQgYXJyYXkgCiAgICAgICAgICAgICAgICBtZW1iZXIsIHNvIHRoYXQgbXVzdCBhIGhhdmUgdmFsaWQgaW5kZXguIAogICAgICAgICAgICAtIEFycmF5cyBvZiBvdGhlciBvYmplY3RzICh1bmlmb3JtIGJsb2NrcykgY29udGFpbmluZyBpbXBsaWNpdGx5IHNpemVkIGFycmF5cyB3aWxsIGhhdmUgdGhlIHNhbWUgaW1wbGljaXQgc2l6ZSBmb3IgYWxsIAogICAgICAgICAgICAgICAgZWxlbWVudHMgb2YgdGhlIGFycmF5LgogICAgICAtIEFycmF5cyBvZiBhcnJheXMgYXJlIG5vdyBzdXBwb3J0ZWQsIGFzIHBlciB0aGUgR0xfQVJCX2FycmF5c19vZl9hcnJheXMgZXh0ZW5zaW9uLgogICAgICArIENvbXB1dGUgc2hhZGVycyBhcmUgbm93IHN1cHBvcnRlZCwgYXMgcGVyIHRoZSBHTF9BUkJfY29tcHV0ZV9zaGFkZXIgZXh0ZW5zaW9uLgogICAgICArIEFkZGVkIGltYWdlU2l6ZSgpIGJ1aWx0LWlucyB0byBxdWVyeSB0aGUgZGltZW5zaW9ucyBvZiBhbiBpbWFnZS4KICAgICAgLSBBbGwgY2hvaWNlIG9mIGRlcHRoIG9yIHN0ZW5jaWwgdGV4dHVyaW5nLCBmb3IgYSBwYWNrZWQgZGVwdGgtc3RlbmNpbCB0ZXh0dXJlLCBhcyBwZXIgdGhlIAogICAgICAgIEdMX0FSQl9zdGVuY2lsX3RleHR1cmluZyBleHRlbnNpb24uCiAgICAgIC0gQWxsb3cgZXhwbGljaXQgbG9jYXRpb25zL2luZGV4ZXMgdG8gYmUgYXNzaWduZWQgdG8gdW5pZm9ybSB2YXJpYWJsZXMgYW5kIHN1YnJvdXRpbmVzLCBhcyBwZXIgdGhlIAogICAgICAgIEdMX0FSQl9leHBsaWNpdF91bmlmb3JtX2xvY2F0aW9uIGV4dGVuc2lvbi4KICAgICAgKyBBY2NlcHQgRVMgR0xTTCBzaGFkZXIgI3ZlcnNpb24gc3RhdGVtZW50cywgd2hpY2ggd2lsbCByZXF1ZXN0IEVTIGZ1bmN0aW9uYWxpdHkgZm9yIEVTIEdMU0wgCiAgICAgICAgdmVyc2lvbnMgMTAwIGFuZCAzMDAsIGFzIHBlciB0aGUgR0xfQVJCX0VTM19jb21wYXRpYmlsaXR5IGV4dGVuc2lvbi4KICAgICAgKyBDbGFyaWZ5IGFuZCBjb3JyZWN0IHNjb3BpbmcgcnVsZXMgdG8gd2hhdCB3b3VsZCBub3JtYWxseSBiZSBleHBlY3RlZCBhbmQgd2hhdCB3YXMgaW50ZW5kZWQuIAogICAgICAgIChGdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCBib2R5IG5lc3QgaW5zaWRlIGdsb2JhbCBzcGFjZS4gTG9vcCB2YXJpYWJsZXMgYW5kIGJvZHkgbmVzdCBpbnNpZGUgCiAgICAgICAgbG9vcCBzY29wZS4pCiAgICAgICsgVGhlcmUgYXJlIG5vIGRpZ3JhcGhzICh0cmlncmFwaHMgd2VyZSBhbHJlYWR5IGRpc2FsbG93ZWQpLgogICAgICArIFJlbW92ZSB0aGUgQ1BQIGRpZmZlcmVuY2UgdGhhdCBpdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciB0byB1c2UgI2lmIG9yICNlbGlmIG9uIGV4cHJlc3Npb25zIAogICAgICAgIGNvbnRhaW5pbmcgdW5kZWZpbmVkIG1hY3JvIG5hbWVzLiBUaGlzIHJldmVydHMgYmFjayB0byBmb2xsb3dpbmcgZXhwZWN0ZWQgQ1BQIGJlaGF2aW9yLgogICAgICArIFNldCBib3RoIGdsX01heEZyYWdtZW50SW1hZ2VVbmlmb3JtcyBhbmQgZ2xfTWF4Q29tYmluZWRJbWFnZVVuaWZvcm1zIHRvIDguCiAgICAgIC0gQ2xhcmlmeSB0ZXh0dXJlU2l6ZSgpIGZvciBjdWJlIG1hcCBhcnJheXMuCiAgICAgIC0gRm9yIGxheW91dCBxdWFsaWZpZXJzLAogICAgICAgICAgICArIG1ha2UgbmVnYXRpdmUgb3V0cHV0IGxvY2F0aW9ucyBhIGNvbXBpbGUtdGltZSBlcnJvciwgb25jZSBpbnRlZ2VyIGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkIGluIGxheW91dHMKICAgICAgICAgICAgLSBtYWtlIGluZGV4ZXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMV0gYSBjb21waWxlLXRpbWUgZXJyb3IuCiAgICAgIC0gQWRkIHRleHR1cmVRdWVyeUxldmVscygpIGJ1aWx0LWlucyB0byBxdWVyeSB0aGUgbnVtYmVyIG9mIG1pcG1hcCBsZXZlbHMsIGFzIHBlciB0aGUgCiAgICAgICAgR0xfQVJCX3RleHR1cmVfcXVlcnlfbGV2ZWxzIGV4dGVuc2lvbi4KICAgICAgKyBNYWtlIGdsX0xheWVyIGFuZCBnbF9WaWV3cG9ydEluZGV4IGFsc28gYmUgaW5wdXRzIHRvIHRoZSBmcmFnbWVudCBzaGFkZXIsIGFzIHBlciB0aGUgCiAgICAgICAgR0xfQVJCX2ZyYWdtZW50X2xheWVyX3ZpZXdwb3J0IGV4dGVuc2lvbi4KICAgICAgLSBDbGFyaWZ5IGZyYWdtZW50IG91dHB1dCB2YXJpYWJsZXMgY2Fubm90IGJlIGRvdWJsZSBwcmVjaXNpb24uCiAgICAgICsgQWxsb3cgdGhlIG5ldyBzaGFyZWQga2V5d29yZCB0byBiZSBpbiBsYXlvdXQtcXVhbGlmaWVyLWlkLCBhbGxvd2luZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IAogICAgICAgIHdpdGggdGhlIHNoYXJlZCBpZGVudGlmaWVyIHRoYXQgd2FzIHByZXZpb3VzbHkgdXNlZC4KICAgICAgKyBBZGRlZCBvdmVybG9va2VkIHRleHR1cmUgZnVuY3Rpb24gZmxvYXQgdGV4dHVyZU9mZnNldCAoc2FtcGxlcjJEQXJyYXlTaGFkb3cgc2FtcGxlciwgdmVjNCBQLCB2ZWMyIG9mZnNldCBbLCBmbG9hdCBiaWFzXSApLgogICAgICArIEFkZCBtaXNzaW5nIHR5cGUgaW4gZ3JhbW1hciwgQVRPTUlDX1VJTlQsIGFuZCBtaXNzaW5nIHF1YWxpZmllcnMgQ09IRVJFTlQsIFZPTEFUSUxFLCBSRVNUUklDVCwgUkVBRE9OTFksIGFuZCBXUklURU9OTFkuCiAgICAgICsgQWRkIG1pc3NpbmcgaW5pdGlhbGl6ZXIgbGlzdHMgdG8gZ3JhbW1hci4KICAgIEdMU0wgNC40CiAgICAgICsgSW5jb3Jwb3JhdGUgdGhlIEFSQl9lbmhhbmNlZF9sYXlvdXRzIGV4dGVuc2lvbiwgd2hpY2ggYWRkcwogICAgICAgICsgY29tcGlsZS10aW1lIGNvbnN0YW50IGV4cHJlc3Npb25zIGZvciBsYXlvdXQgcXVhbGlmaWVyIGludGVnZXJzCiAgICAgICAgKyBuZXcgb2Zmc2V0IGFuZCBhbGlnbiBsYXlvdXQgcXVhbGlmaWVycyBmb3IgY29udHJvbCBvdmVyIGJ1ZmZlciBibG9jayBsYXlvdXRzCiAgICAgICAgKyBhZGQgbG9jYXRpb24gbGF5b3V0IHF1YWxpZmllciBmb3IgaW5wdXQgYW5kIG91dHB1dCBibG9ja3MgYW5kIGJsb2NrIG1lbWJlcnMKICAgICAgICArIG5ldyBjb21wb25lbnQgbGF5b3V0IHF1YWxpZmllciBmb3IgZmluZXItZ3JhaW5lZCBsYXlvdXQgY29udHJvbCBvZiBpbnB1dCBhbmQgb3V0cHV0IHZhcmlhYmxlcyBhbmQgYmxvY2tzCiAgICAgICAgKyBuZXcgeGZiX2J1ZmZlciwgeGZiX3N0cmlkZSwgYW5kIHhmYl9vZmZzZXRsYXlvdXQgcXVhbGlmaWVycyB0byBhbGxvdyB0aGUgc2hhZGVyIHRvIGNvbnRyb2wgCiAgICAgICAgICB0cmFuc2Zvcm0gZmVlZGJhY2sgYnVmZmVyaW5nLgogICAgICArIEJ1ZyAxMDUzMDogVG8gYmUgY29uc2lzdGVudCB3aXRoIEVTLCBpbmNsdWRlIHNhbXBsZSB0eXBlcyBhcyB2YWxpZCBpbiBhIHByZWNpc2lvbiBzdGF0ZW1lbnQuIAogICAgICAgIE5vdGUgdGhlIGRlZmF1bHRzIGFyZSBpcnJlbGV2YW50LCBhcyBwcmVjaXNpb24gcXVhbGlmaWVycyBhcmUgbm90IHJlcXVpcmVkIG9yIGhhdmUgYW55IG1lYW5pbmcuCiAgICBHTFNMIDQuNQogICAgICArIEluY29ycG9yYXRlIHRoZSBBUkJfRVMzXzFfY29tcGF0aWJpbGl0eSBleHRlbnNpb24KICAgICAgICArIFN1cHBvcnRzIE9wZW5HTCBFUyAzMTAgc2hhZGVycy4KICAgICAgICArIEFkZHMgaW1hZ2VBdG9taWNFeGNoYW5nZSgpIGJ1aWx0LWluIGZ1bmN0aW9uIGZvciBmbG9hdGluZy1wb2ludCBpbWFnZXMuCiAgICAgICAgKyBBZGRzIGNvaGVyZW50IHRvIGF0b21pYyBhbmQgaW1hZ2UtYXRvbWljIGJ1aWx0LWluIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCiAgICAgICAgKyBBZGRzIGdsX0hlbHBlckludm9jYXRpb24gYnVpbHQtaW4gdmFyaWFibGUgdG8gc2F5IHdoZXRoZXIgYSBmcmFnbWVudCBzaGFkZXIgaW52b2NhdGlvbiBpcyAKICAgICAgICAgICAgICBvbmx5IGFzIGEgaGVscGVyLCBzbyB0aGUgc2hhZGVyIGNhbiBza2lwIGNvZGUgbm90IG5lZWRlZCBvciBoYXJtZnVsIHdoZW4gaW4gYSBoZWxwZXIgaW52b2NhdGlvbi4KICAgICAgICArIEFkZHMgZ2xfTWF4U2FtcGxlc2J1aWx0LWluIGNvbnN0YW50LCBhbmQgc2V2ZXJhbCBvdGhlciBidWlsdC1pbiBjb25zdGFudHMuCiAgICAgICAgKyBBZGRzIG1peCgpIGJ1aWx0LWluIGZ1bmN0aW9ucyBmb3Igc2VsZWN0aW9uIG9mIGludCwgdWludCwgYW5kYm9vbCBjb21wb25lbnRzLgogICAgICArIEluY29ycG9yYXRlIHRoZSBHTF9BUkJfc2hhZGVyX3RleHR1cmVfaW1hZ2Vfc2FtcGxlcyBleHRlbnNpb24gdG8gcXVlcnkgaG93IG1hbnkgc2FtcGxlcyBhcmUgaW4gYSBtdWx0aS1zYW1wbGUgdGV4dHVyZSBvciBpbWFnZS4KICAgICAgKyBJbmNvcnBvcmF0ZSB0aGUgR0xfQVJCX2N1bGxfZGlzdGFuY2UgZXh0ZW5zaW9ucyB0byBhZGQgdGhlIGJ1aWx0LWluIHZhcmlhYmxlIGdsX0N1bGxEaXN0YW5jZVtdICwgd2hpY2ggd2lsbCBjdWxsIHdob2xlIHByaW1pdGl2ZXMuCiAgICAgICsgSW5jb3Jwb3JhdGUgdGhlIEdMX0FSQl9kZXJpdmF0aXZlX2NvbnRyb2wgZXh0ZW5zaW9uCg==