TmFtZQoKICAgIE5WWF9wcm9ncmVzc19mZW5jZQoKTmFtZSBTdHJpbmdzCgogICAgR0xfTlZYX3Byb2dyZXNzX2ZlbmNlCgpDb250cmlidXRvcnMKCiAgICBJbmdvIEVzc2VyLCBOVklESUEKICAgIEpvc2h1YSBTY2huYXJyLCBOVklESUEKICAgIFJhbGYgQmllcm1hbm4sIE5WSURJQQoKQ29udGFjdAoKICAgIFJhbGYgQmllcm1hbm4sIE5WSURJQSBjb3Jwb3JhdGlvbiAocmJpZXJtYW5uJ2F0JyBudmlkaWEuY29tKQoKU3RhdHVzCgogICAgQ29tcGxldGUuCgpWZXJzaW9uCgogICAgTGFzdCBNb2RpZmllZCBEYXRlOiBBdWd1c3QgMTUsIDIwMTgKICAgIEF1dGhvciBSZXZpc2lvbjogMgoKTnVtYmVyCgogICAgT3BlbkdMIEV4dGVuc2lvbiAjNTQxCgpEZXBlbmRlbmNpZXMKCiAgICBUaGlzIGV4dGVuc2lvbiBpcyB3cml0dGVuIGFnYWluc3QgdGhlIE9wZW5HTCA0LjUgYW5kIE9wZW5HTCBFUyAzLjIgc3BlY2lmaWNhdGlvbnMuCiAgICAKICAgIFRoaXMgZXh0ZW5zaW9uIHJlcXVpcmVzIEVYVF9leHRlcm5hbF9vYmplY3RzLgoKICAgIFRoaXMgZXh0ZW5zaW9uIHJlcXVpcmVzIEVYVF9leHRlcm5hbF9vYmplY3RzX3dpbjMyCgogICAgVGhpcyBleHRlbnNpb24gaW50ZXJhY3RzIHdpdGggTlZfZ3B1X211bHRpY2FzdC4KCk92ZXJ2aWV3CgogICAgVGhpcyBleHRlbnNpb24gdXNlcyB0aGUgY29uY2VwdCBvZiBHTCBzZW1hcGhvcmVzIGFzIGRlZmluZWQgaW4gCiAgICBHTF9FWFRfc2VtYXBob3JlIHRvIGJldHRlciBjb29yZGluYXRlIG9wZXJhdGlvbnMgYmV0d2VlbiBtdWx0aXBsZQogICAgR1BVIGNvbW1hbmQgc3RyZWFtcy4gQSBzZW1hcGhvcmUgdHlwZSBjYWxsZWQgInByb2dyZXNzIGZlbmNlIiBpcyAKICAgIGRlcml2ZWQgZnJvbSB0aGUgR0wgc2VtYXBob3JlLiBUaGUgcHJvZ3Jlc3MgZmVuY2Ugc2VtYXBob3JlIGlzCiAgICBjcmVhdGVkIGJ5IENyZWF0ZVByb2dyZXNzRmVuY2VOVlgoKSByZXR1cm5pbmcgdGhlIG5hbWUgb2YgYSBuZXdseQogICAgY3JlYXRlZCBzZW1hcGhvcmUgb2JqZWN0LiBMaWtlIG90aGVyIHNlbWFwaG9yZXMsIHRoZXNlIGFyZSBzaWduYWxlZAogICAgYnkgdGhlIEdMIHNlcnZlci4gRWFjaCBzaWduYWwgb3BlcmF0aW9uIGlzIHF1ZXVlZCBpbiB0aGUgR1BVIGNvbW1hbmQKICAgIHN0cmVhbSB3aXRoIGFuIGFzc29jaWF0ZWQgZmVuY2UgdmFsdWUgdGhhdCBpcyB3cml0dGVuIHRvIHRoZSBzZW1hcGhvcmUKICAgIGF0IHRoZSBjb21wbGV0aW9uIG9mIGEgc2lnbmFsIG9wZXJhdGlvbi4gCgogICAgQSBHTCBzZXJ2ZXIgd2FpdCBjYW4gYmUgYWRkZWQgdG8gdGhlIGNvbW1hbmQgc3RyZWFtIHVzaW5nIFdhaXRTZW1hcGhvcmV1aTY0TlZYLgogICAgVGhpcyBibG9ja3MgdGhlIEdQVSB1bnRpbCB0aGUgcHJvZ3Jlc3MgZmVuY2Ugc2VtYXBob3JlIHJlYWNoZXMgb3IgZXhjZWVkcyB0aGUgCiAgICBzcGVjaWZpZWQgZmVuY2UgdmFsdWUuCiAgICAKICAgIEEgR0wgY2xpZW50IHdhaXQgY2FuIGJlIGluaXRpYXRlZCB1c2luZyBDbGllbnRXYWl0U2VtYXBob3JldWk2NE5WWC4gCiAgICBUaGlzIGJsb2NrcyB0aGUgQ1BVIHVudGlsIHRoZSBzcGVjaWZpZWQgZmVuY2UgdmFsdWUgaXMgcmVhY2hlZC4KCk5ldyBQcm9jZWR1cmVzIGFuZCBGdW5jdGlvbnMKCiAgICB1aW50IENyZWF0ZVByb2dyZXNzRmVuY2VOVlgoKTsKCiAgICB2b2lkIFNpZ25hbFNlbWFwaG9yZXVpNjROVlgodWludCBzaWduYWxHcHUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVpIGZlbmNlT2JqZWN0Q291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQgKnNlbWFwaG9yZUFycmF5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjQgKmZlbmNlVmFsdWVBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgdm9pZCBXYWl0U2VtYXBob3JldWk2NE5WWCh1aW50IHdhaXRHcHUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplaSBmZW5jZU9iamVjdENvdW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludCAqc2VtYXBob3JlQXJyYXksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjQgKmZlbmNlVmFsdWVBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIHZvaWQgQ2xpZW50V2FpdFNlbWFwaG9yZXVpNjROVlgoc2l6ZWkgZmVuY2VPYmplY3RDb3VudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQgKnNlbWFwaG9yZUFycmF5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0ICpmZW5jZVZhbHVlQXJyYXkpOwoKTmV3IFR5cGVzCgogICAgTm9uZQoKTmV3IFRva2VucwoKICAgIE5vbmUKCkFkZGl0aW9ucyB0byBDaGFwdGVyIDQgb2YgdGhlIE9wZW5HTCA0LjUgU3BlY2lmaWNhdGlvbiAoRXZlbnQgTW9kZWwpCgogIEFkZGl0aW9uIHRvIFNlY3Rpb24gNC4yLCAiU2VtYXBob3JlIE9iamVjdHOUCgoKICAgIEEgY29tbWFuZCAKCiAgICAgIHVpbnQgQ3JlYXRlUHJvZ3Jlc3NGZW5jZU5WWCgpOwoKICAgIGNyZWF0ZXMgYSBuYW1lZCBwcm9ncmVzcyBmZW5jZSBzZW1hcGhvcmUgb2JqZWN0LgoKICAgIEEgc2V0IG9mIHByb2dyZXNzIGZlbmNlIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQgYnkgcGFzc2luZyB0aGUgbmFtZXMgaW4gdGhlCiAgICBhcnJheSA8c2VtYXBob3Jlcz4gdG8gdGhlIGNvbW1hbmQKCiAgICAgIHZvaWQgRGVsZXRlU2VtYXBob3Jlc0VYVChzaXplaSBuLCBjb25zdCB1aW50ICpzZW1hcGhvcmVzKTsKCiAgICBQcm9ncmVzcyBmZW5jZSBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgb24gbmFtZWQgc2VtYXBob3JlIG9iamVjdHMuIFRoZQogICAgY29tbWFuZAoKICAgICAgdm9pZCBTaWduYWxTZW1hcGhvcmV1aTY0TlZYKHVpbnQgc2lnbmFsR3B1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVpIGZlbmNlT2JqZWN0Q291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludCAqc2VtYXBob3JlQXJyYXksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0ICpmZW5jZVZhbHVlQXJyYXkpOwoKICAgIFNpZ25hbFNlbWFwaG9yZXVpNjROVlggaW5zZXJ0cyBhIHNpZ25hbCBvcGVyYXRpb24gZm9yIGVhY2ggb2YgdGhlIDxmZW5jZU9iamVjdENvdW50PgogICAgc2VtYXBob3JlcyBpbiA8c2VtYXBob3JlQXJyYXk+LiBFYWNoIHNpZ25hbCB3cml0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgZmVuY2UgdmFsdWUgaW4gCiAgICA8ZmVuY2VWYWx1ZUFycmF5Pi4KCiAgICBJZiB0aGUgR0wgY29udGV4dCB1c2VzIE5WX2dwdV9tdWx0aWNhc3QgdG8gY29udHJvbCBtdWx0aXBsZSBHUFVzLCB0aGUgCiAgICA8c2lnbmFsR3B1PiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgdG8gc3BlY2lmeSB0aGUgR1BVIHRoYXQgc2lnbmFscyB0aGUgCiAgICBmZW5jZSB2YWx1ZSB0byB0aGUgZmVuY2Ugb2JqZWN0LiBPdGhlcndpc2UgPHNpZ25hbEdwdT4gbXVzdCBiZSAwLgoKICAgIElmIGEgdmFsdWUgaW4gPHNlbWFwaG9yZUFycmF5PiBpcyBub3QgdGhlIG5hbWUgb2YgYSBzZW1hcGhvcmUgb2JqZWN0LCAKICAgIGFuIElOVkFMSURfVkFMVUUgZXJyb3IgaXMgZ2VuZXJhdGVkLgoKICAgIElmIE5WX2dwdV9tdWx0aWNhc3QgaXMgc3VwcG9ydGVkLCBhbiBJTlZBTElEX1ZBTFVFIGVycm9yIGlzIGdlbmVyYXRlZCBpZiA8c2lnbmFsR3B1PiAKICAgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBNVUxUSUNBU1RfR1BVU19OVi4gT3RoZXJ3aXNlLCBhbiBJTlZBTElEX1ZBTFVFIGVycm9yIGlzIAogICAgZ2VuZXJhdGVkIGlmIDxzaWduYWxHcHU+ICE9IDAuCgogICAgVGhlIGNvbW1hbmQKCiAgICAgIHZvaWQgV2FpdFNlbWFwaG9yZXVpNjROVlgodWludCB3YWl0R3B1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplaSBmZW5jZU9iamVjdENvdW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50ICpzZW1hcGhvcmVBcnJheSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0ICpmZW5jZVZhbHVlQXJyYXkpOwoKICAgIGluc2VydHMgYSB3YWl0IGNvbW1hbmQgaW50byB0aGUgR0wgc2VydmVyIGNvbW1hbmQgc3RyZWFtIG9mIGEgc3BlY2lmaWVkIEdQVSA8d2FpdEdwdT4gCiAgICBmb3IgZWFjaCBvZiB0aGUgPGZlbmNlT2JqZWN0Q291bnQ+IHByb2dyZXNzIGZlbmNlIG9iamVjdHMgaW4gPHNlbWFwaG9yZUFycmF5PiB3aGljaCAKICAgIGJsb2NrcyA8d2FpdEdwdT4gdW50aWwgYWxsIGZlbmNlIG9iamVjdHMgcmVhY2ggb3IgZXhjZWVkIHRoZSBhc3NvY2lhdGVkIGZlbmNlIHZhbHVlIAogICAgaW4gPGZlbmNlVmFsdWVBcnJheT4uCgogICAgSWYgYSB2YWx1ZSBpbiA8c2VtYXBob3JlQXJyYXk+IGlzIG5vdCB0aGUgbmFtZSBvZiBhIHNlbWFwaG9yZSBvYmplY3QsIAogICAgYW4gSU5WQUxJRF9WQUxVRSBlcnJvciBpcyBnZW5lcmF0ZWQuCgogICAgVGhlIGNvbW1hbmQKCiAgICAgIHZvaWQgQ2xpZW50V2FpdFNlbWFwaG9yZXVpNjROVlgoc2l6ZWkgZmVuY2VPYmplY3RDb3VudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludCAqc2VtYXBob3JlQXJyYXksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NCAqZmVuY2VWYWx1ZUFycmF5KTsKCiAgICBibG9ja3MgdGhlIENQVSB1bnRpbCBlYWNoIG9mIHRoZSA8ZmVuY2VPYmplY3RDb3VudD4gZmVuY2Ugb2JqZWN0cyBpbiBhIAogICAgc3BlY2lmaWVkIGFycmF5IDxzZW1hcGhvcmVBcnJheT4gcmVhY2hlcyB0aGUgY29ycmVzcG9uZGluZyBmZW5jZSB2YWx1ZSAKICAgIGluIDxmZW5jZVZhbHVlQXJyYXk+LCByZXNwZWN0aXZlbHkuIAoKICAgIElmIGEgdmFsdWUgaW4gPHNlbWFwaG9yZUFycmF5PiBpcyBub3QgdGhlIG5hbWUgb2YgYSBzZW1hcGhvcmUgb2JqZWN0LCAKICAgIGFuIElOVkFMSURfVkFMVUUgZXJyb3IgaXMgZ2VuZXJhdGVkLgogIAogICAgVGhlIGNvbW1hbmRzIFNpZ25hbFNlbWFwaG9yZXVpNjROVlgsIFdhaXRTZW1hcGhvcmV1aTY0TlZYIGFuZCAKICAgIENsaWVudFdhaXRTZW1hcGhvcmV1aTY0TlZYIGFjY2VwdCBzZW1hcGhvcmUgb2JqZWN0IG5hbWVzIGFzIGlucHV0IGluIAogICAgPHNlbWFwaG9yZUFycmF5PiB0aGF0IHdlcmUgY3JlYXRlZCBieSBDcmVhdGVQcm9ncmVzc0ZlbmNlTlZYIG9yIGltcG9ydGVkCiAgICBmcm9tIGEgaGFuZGxlIG9mIHRoZSB0eXBlIEhBTkRMRV9UWVBFX0QzRDEyX0ZFTkNFX0VYVC4gCiAgICBJZiBhIHZhbHVlIGluIDxzZW1hcGhvcmVBcnJheT4gaXMgbm90IHRoZSBuYW1lIG9mIHN1Y2ggYSBzZW1hcGhvcmUgb2JqZWN0LCAKICAgIGFuIElOVkFMSURfVkFMVUUgZXJyb3IgaXMgZ2VuZXJhdGVkLgogICAgCiAgICBUaGUgY29tbWFuZAoKICAgICAgYm9vbGVhbiBJc1NlbWFwaG9yZUVYVCh1aW50IHNlbWFwaG9yZSk7CgogICAgY2FuIGJlIHVzZWQgd2l0aCBwcm9ncmVzcyBmZW5jZSBzZW1hcGhvcmVzIGFuZCByZXR1cm5zIFRSVUUgaWYgPHNlbWFwaG9yZT4KICAgIGlzIHRoZSBuYW1lIG9mIGEgc2VtYXBob3JlIGFzIGRlZmluZWQgaW4gRVhUX2V4dGVybmFsX29iamVjdHMuCgpJc3N1ZXMKCiAgICAxKSBBcmUgVnVsa2FuIHNlbWFwaG9yZXMgaW1wb3J0ZWQgdmlhIHRoZSBHTF9FWFRfbWVtb3J5X29iamVjdF93aW4zMiBzdXBwb3J0ZWQKICAgICAgIGJ5IEdMX05WWF9wcm9ncmVzc19mZW5jZSBhcyBpbnB1dCBwYXJhbWV0ZXJzPwoKICAgICAgIFJFU09MVkVEOiBOby4gQXMgVnVsa2FuIHNlbWFwaG9yZXMgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHByb2dyZXNzIGZlbmNlCiAgICAgICBvcGVyYXRpb24sIHRoZXNlIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb2dyZXNzIGZlbmNlIHNlbWFwaG9yZXMuCgpSZXZpc2lvbiBIaXN0b3J5CgogICAgUmV2aXNpb24gMSwgMjAxOC0wOC0xNCAoUmFsZiBCaWVybWFubikKICAgICAgICAtIEluaXRpYWwgc3BlY2lmaWNhdGlvbiBwcm9wb3NhbC4KCiAgICBSZXZpc2lvbiAyLCAyMDE4LTA4LTE1IChSYWxmIEJpZXJtYW5uKQogICAgICAgIC0gQWRkaW5nIFZ1bGthbiBzZW1hcGhvcmUgbGltaXRhdGlvbiB0byBJc3N1ZXMuCg==