MC4xMAogICogRml4IGEgYnVnIGluIGpzb25fb2JqZWN0X2dldF9pbnQoKSwgd2hpY2ggd291bGQgaW5jb3JyZWN0bHkgcmV0dXJuIDAKICAgIHdoZW4gY2FsbGVkIG9uIGEgc3RyaW5nIHR5cGUgb2JqZWN0LgogICAgRXJpYyBIYXN6bGFraWV3aWN6CiAgKiBBZGQgYSBqc29uX3R5cGVfdG9fbmFtZSgpIGZ1bmN0aW9uLgogICAgRXJpYyBIYXN6bGFraWV3aWN6CiAgKiBBZGQgYSBqc29uX3Rva2VuZXJfcGFyc2VfdmVyYm9zZSgpIGZ1bmN0aW9uLgogICAgSmVoaWFoIEN6ZWJvdGFyCiAgKiBJbXByb3ZlIHN1cHBvcnQgZm9yIG51bGwgYnl0ZXMgd2l0aGluIEpTT04gc3RyaW5ncy4KICAgIEplaGlhaCBDemVib3RhcgogICogRml4IGZpbGUgZGVzY3JpcHRvciBsZWFrIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzIGluIGpzb25fdXRpbAogICAgWmFjaGFyeSBCbGFpciwgemFja19ibGFpciBhdCBob3RtYWlsIGRvdCBjb20KICAqIEFkZCBpbnQ2NCBzdXBwb3J0LiBUd28gbmV3IGZ1bmN0aW9ucyBqc29uX29iamVjdF9uZXRfaW50NjQgYW5kCiAgICBqc29uX29iamVjdF9nZXRfaW50NjQuIEJpbmFyeSBjb21wYXRpYmlsaXR5IHByZXNlcnZlZC4KICAgIEVyaWMgSGFzemxha2lld2ljeiwgRUhBU1pMQSBhdCB0cmFuc3VuaW9uIGNvbQogICAgUnVpIE1pZ3VlbCBTaWx2YSBTZWFicmEsIHJtcyBhdCAxNDA3IGRvdCBvcmcKICAqIEZpeCBzdWJ0bGUgYnVnIGluIGxpbmtoYXNoIHdoZXJlIGxvb2t1cCBjb3VsZCBoYW5nIGFmdGVyIGFsbCBzbG90cwogICAgd2VyZSBmaWxsZWQgdGhlbiBzdWNjZXNzaXZlbHkgZnJlZWQuCiAgICBTcG90dGVkIGJ5IEplYW4tTWFyYyBOYXVkLCBqIGRhc2ggbSBhdCBuZXd0cmF4dGVjaCBkb3QgY29tCiAgKiBNYWtlIGpzb25fb2JqZWN0X2Zyb21fZmlsZSB0YWtlIGNvbnN0IGNoYXIgKmZpbGVuYW1lCiAgICBTcG90dGVkIGJ5IFZpa3JhbSBSYWogViwgdnNhZ2FyIGF0IGF0dGludGVyYWN0aXZlIGRvdCBjb20KICAqIEFkZCBoYW5kbGluZyBvZiBzdXJyb2dhdGUgcGFpcnMgKGpzb25fdG9rZW5lci5jLCB0ZXN0NC5jLCBNYWtlZmlsZS5hbSkKICAgIEJyZW50IE1pbGxlciwgYmRtaWxsZXIgYXQgeWFob28gZGFzaCBpbmMgZG90IGNvbQogICogQ29ycmVjdGlvbiB0byBjb21tZW50IGRlc2NyaWJpbmcgcHJpbnRidWZfbWVtYXBwZW5kIGluIHByaW50YnVmLmgKICAgIEJyZW50IE1pbGxlciwgYmRtaWxsZXIgYXQgeWFob28gZGFzaCBpbmMgZG90IGNvbQoKMC45CiAgKiBBZGQgUkVBRE1FLmh0bWwgUkVBRE1FLVdJTjMyLmh0bWwgY29uZmlnLmgud2luMzIgdG8gTWFrZWZpbGUuYW0KICAgIE1pY2hhZWwgQ2xhcmssIDxtaWNoYWVsQG1ldGFwYXJhZGlnbS5jb20+CiAgKiBBZGQgY29uc3QgcXVhbGlmaWVyIHRvIHRoZSBqc29uX3Rva2VuZXJfcGFyc2UgZnVuY3Rpb25zCiAgICBFcmljIEhhc3psYWtpZXdpY3osIEVIQVNaTEEgYXQgdHJhbnN1bmlvbiBkb3QgY29tCiAgKiBSZW5hbWUgbWluIGFuZCBtYXggc28gd2UgY2FuIG5ldmVyIGNsYXNoIHdpdGggQyBvciBDKysgc3RkIGxpYnJhcnkKICAgIElhbiBBdGhhLCB0aGF0aGEgYXQgeWFob28gZGFzaCBpbmMgZG90IGNvbQogICogRml4IGFueSBub3RpY2VhYmxlIHNwZWxsaW5nIG9yIGdyYW1tYXIgZXJyb3JzLgogICogTWFrZSBzdXJlIGV2ZXJ5IHZhX3N0YXJ0IGhhcyBhIHZhX2VuZC4KICAqIENoZWNrIGFsbCBwb2ludGVycyBmb3IgdmFsaWRpdHkuCiAgICBFcmlrIEhvdmxhbmQsIGVyaWsgYXQgaG92bGFuZCBkb3Qgb3JnCiAgKiBGaXgganNvbl9vYmplY3RfZ2V0X2Jvb2xlYW4gdG8gcmV0dXJuIGZhbHNlIGZvciBlbXB0eSBzdHJpbmcKICAgIFNwb3R0ZWQgYnkgVml0YWx5IEtydWdsaWtvdiwgVml0YWx5IGRvdCBLcnVnbGlrb3YgYXQgcGFsbSBkb3QgY29tCiAgKiBvcHRpbWl6YXRpb25zIHRvIGpzb25fdG9rZW5lcl9wYXJzZV9leCgpLCBwcmludGJ1Zl9tZW1hcHBlbmQoKQogICAgQnJlbnQgTWlsbGVyLCBiZG1pbGxlciBhdCB5YWhvbyBkYXNoIGluYyBkb3QgY29tCiAgKiBEaXNhYmxlIFJFRkNPVU5UX0RFQlVHIGJ5IGRlZmF1bHQgaW4ganNvbl9vYmplY3QuYwogICogRG9uJ3QgdXNlIHRoaXMgYXMgYSB2YXJpYWJsZSwgc28gd2UgY2FuIGNvbXBpbGUgd2l0aCBhIEMrKyBjb21waWxlcgogICogQWRkIGNhc3RzIGZyb20gdm9pZCogdG8gdHlwZSBvZiBhc3NpZ25tZW50IHdoZW4gdXNpbmcgbWFsbG9jIAogICogQWRkICNpZmRlZiBfX2NwbHVzcGx1cyBndWFyZHMgdG8gYWxsIG9mIHRoZSBoZWFkZXJzCiAgKiBBZGQgdHlwZWRlZnMgZm9yIGpzb25fb2JqZWN0LCBqc29uX3Rva2VuZXIsIGFycmF5X2xpc3QsIHByaW50YnVmLCBsaF90YWJsZQogICAgTWljaGFlbCBDbGFyaywgPG1pY2hhZWxAbWV0YXBhcmFkaWdtLmNvbT4KICAqIE51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSBmaXguIEZpeCBqc29uX29iamVjdF9nZXRfYm9vbGVhbiBzdHJsZW4gdGVzdAogICAgdG8gbm90IHJldHVybiBUUlVFIGZvciB6ZXJvIGxlbmd0aCBzdHJpbmcuIFJlbW92ZSByZWR1bmRhbnQgaW5jbHVkZXMuCiAgICBFcmlrIEhvdmxhbmQsIGVyaWsgYXQgaG92bGFuZCBkb3Qgb3JnCiAgKiBGaXhlZCB3YXJuaW5nIHJlcG9ydGVkIGJ5IGFkZGluZyAtV3N0cmljdC1wcm90b3R5cGVzCiAgICAtV29sZC1zdHlsZS1kZWZpbml0aW9uIHRvIHRoZSBjb21waWxhdGluIGZsYWdzLgogICAgRG90YW4gQmFyYWssIGRvdGFuYmEgYXQgZ21haWwgZG90IGNvbQogICogQWRkIGNvbnN0IGNvcnJlY3RuZXNzIHRvIHB1YmxpYyBpbnRlcmZhY2VzCiAgICBHZXJhcmQgS3JvbCwgZyBkb3QgYyBkb3Qga3JvbCBhdCBzdHVkZW50IGRvdCB0dWRlbGZ0IGRvdCBubAoKMC44CiAgKiBBZGQgdmFfZW5kIGZvciBldmVyeSB2YV9zdGFydAogICAgRG90YW4gQmFyYWssIGRvdGFuYmEgYXQgZ21haWwgZG90IGNvbQogICogQWRkIG1hY3JvcyB0byBlbmFibGUgY29tcGlsaW5nIG91dCBkZWJ1ZyBjb2RlCiAgICBHZW9mZnJleSBZb3VuZywgZ2VvZmYgYXQgbW9kcGVybGNvb2tib29rIGRvdCBvcmcKICAqIEZpeCBidWcgd2l0aCB1c2Ugb2YgY2FwaXRhbCBFIGluIG51bWJlcnMgd2l0aCBleHBvbmVudHMKICAgIE1hdGV1c3ogTG9za290LCBtYXRldXN6IGF0IGxvc2tvdCBkb3QgbmV0CiAgKiBBZGQgc3RkZGVmLmggaW5jbHVkZQogICogUGF0Y2ggYWxsb3dzIGZvciBqc29uLWMgY29tcGlsZSB3aXRoIC1XZXJyb3IgYW5kIG5vdCBmYWlsIGR1ZSB0bwogICAgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zCiAgICBHZW9mZnJleSBZb3VuZywgZ2VvZmYgYXQgbW9kcGVybGNvb2tib29rIGRvdCBvcmcKCjAuNwogICogQWRkIGVzY2FwaW5nIG9mIGJhY2tzbGFzaCB0byBqc29uIG91dHB1dAogICogQWRkIGVzY2FwaW5nIG9mIGZvd2FyZCBzbGFzaCBvbiB0b2tlbml6aW5nIGFuZCBvdXRwdXQKICAqIENoYW5nZXMgdG8gaW50ZXJuYWwgdG9rZW5pemVyIGZyb20gdXNpbmcgcmVjdXJzaW9uIHRvCiAgICB1c2luZyBhIGRlcHRoIHN0YXRlIHN0cnVjdHVyZSB0byBhbGxvdyBpbmNyZW1lbnRhbCBwYXJzaW5nCgowLjYKICAqIEZpeCBidWcgaW4gZXNjYXBpbmcgb2YgY29udHJvbCBjaGFyYWN0ZXJzCiAgICBKb2hhbiBCavZya2x1bmQsIGpvaGJqbzA5IGF0IGt0aCBkb3Qgc2UKICAqIFJlbW92ZSBpbmNsdWRlICJjb25maWcuaCIgZnJvbSBoZWFkZXJzIChzaG91bGQgb25seQogICAgYmUgaW5jbHVkZWQgZnJvbSAuYyBmaWxlcykKICAgIE1pY2hhZWwgQ2xhcmsgPG1pY2hhZWxAbWV0YXBhcmFkaWdtLmNvbT4KCjAuNQogICogTWFrZSBoZWFkZXJzIEMrKyBjb21wYXRpYmxlIGJ5IGNoYW5nZSAqdGhpcyB0byAqb2JqCiAgKiBBZGQgaWZkZWYgQysrIGV4dGVybiAiQyIgdG8gaGVhZGVycwogICogVXNlIHNpbXBsZXIgZGVmaW5pdGlvbiBvZiBtaW4gYW5kIG1heCBpbiBiaXRzLmgKICAgIExhcnJ5IExhbnNpbmcsIGxsYW5zaW5nIGF0IGZ1enp5bmVyZCBkb3QgY29tCgogICogUmVtb3ZlIGF1dG9tYWtlIDEuNiByZXF1aXJlbWVudAogICogTW92ZSBhdXRvZ2VuIGNvbW1hbmRzIGludG8gYXV0b2dlbi5zaC4gVXBkYXRlIFJFQURNRQogICogUmVtb3ZlIGVycm9yIHBvaW50ZXIgc3BlY2lhbCBjYXNlIGZvciBXaW5kb3dzCiAgKiBDaGFuZ2UgbGljZW5zZSBmcm9tIExHUEwgdG8gTUlUCiAgICBNaWNoYWVsIENsYXJrIDxtaWNoYWVsQG1ldGFwYXJhZGlnbS5jb20+CgowLjQKICAqIEZpeCBhZGRpdGlvbmFsIGVycm9yIGNhc2UgaW4gb2JqZWN0IHBhcnNpbmcKICAqIEFkZCBiYWNrIHNpZ24gcmV2ZXJzYWwgaW4gbmVzdGVkIG9iamVjdCBwYXJzZSBhcyBlcnJvciBwb2ludGVyCiAgICB2YWx1ZSBpcyBuZWdhdGl2ZSwgd2hpbGUgZXJyb3IgdmFsdWUgaXMgcG9zaXRpdmUuCiAgICBNaWNoYWVsIENsYXJrIDxtaWNoYWVsQG1ldGFwYXJhZGlnbS5jb20+CgowLjMKICAqIGZpeCBwb2ludGVyIGFyaXRobWV0aWMgYnVnIGZvciBlcnJvciBwb2ludGVyIGNoZWNrIGluIGlzX2Vycm9yKCkgbWFjcm8KICAqIGZpeCB0eXBlIHBhc3NlZCB0byBwcmludGJ1Zl9tZW1hcHBlbmQgaW4ganNvbl90b2tlbmVyCiAgKiB1cGRhdGUgYXV0b3Rvb2xzIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMgaW4gUkVBRE1FCiAgICBNaWNoYWVsIENsYXJrIDxtaWNoYWVsQG1ldGFwYXJhZGlnbS5jb20+CgowLjIKICAqIHByaW50YnVmLmMgLSBDLiBXYXRmb3JkIChjaHJpc3RvcGhlci53YXRmb3JkQGdtYWlsLmNvbSkKICAgIEFkZGVkIGEgV2luMzIvV2luNjQgY29tcGxpYW50IGltcGxlbWVudGF0aW9uIG9mIHZhc3ByaW50ZgogICogZGVidWcuYyAtIEMuIFdhdGZvcmQgKGNocmlzdG9waGVyLndhdGZvcmRAZ21haWwuY29tKQogICAgUmVtb3ZlZCB1c2FnZSBvZiB2c3lzbG9nIG9uIFdpbjMyL1dpbjY0IHN5c3RlbXMsIG5lZWRzIHRvIGJlIGhhbmRsZWQKICAgIGJ5IGEgY29uZmlndXJlIHNjcmlwdAogICoganNvbl9vYmplY3QuYyAtIEMuIFdhdGZvcmQgKGNocmlzdG9waGVyLndhdGZvcmRAZ21haWwuY29tKQogICAgQWRkZWQgc2NvcGUgb3BlcmF0b3IgdG8gd3JhcCB1c2FnZSBvZiBqc29uX29iamVjdF9vYmplY3RfZm9yZWFjaCwgdGhpcwogICAgbmVlZHMgdG8gYmUgcmV0aG91Z2h0IHRvIGJlIG1vcmUgQU5TSSBDIGZyaWVuZGx5CiAgKiBqc29uX29iamVjdC5oIC0gQy4gV2F0Zm9yZCAoY2hyaXN0b3BoZXIud2F0Zm9yZEBnbWFpbC5jb20pCiAgICBBZGRlZCBNaWNyb3NvZnQgQyBmcmllbmRseSB2ZXJzaW9uIG9mIGpzb25fb2JqZWN0X29iamVjdF9mb3JlYWNoCiAgKiBqc29uX3Rva2VuZXIuYyAtIEMuIFdhdGZvcmQgKGNocmlzdG9waGVyLndhdGZvcmRAZ21haWwuY29tKQogICAgQWRkZWQgYSBXaW4zMi9XaW42NCBjb21wbGlhbnQgaW1wbGVtZW50YXRpb24gb2Ygc3RybmR1cAogICoganNvbl91dGlsLmMgLSBDLiBXYXRmb3JkIChjaHJpc3RvcGhlci53YXRmb3JkQGdtYWlsLmNvbSkKICAgIEFkZGVkIGNhc3QgYW5kIG1hc2sgdG8gc3VmZmljZSBzaXplX3Qgdi4gdW5zaWduZWQgaW50IGNvbnZlcnNpb24KICAgIGNvcnJlY3RuZXNzIAogICoganNvbl90b2tlbmVyLmMgLSBzaWduIHJldmVyc2FsIGlzc3VlIG9uIGVycm9yIGluZm8gZm9yIG5lc3RlZCBvYmplY3QgcGFyc2UKICAgIHNwb3R0ZWQgYnkgSm9oYW4gQmr2cmtsdW5kIChqb2hiam8wOSBhdCBrdGguc2UpCiAgKiBqc29uX29iamVjdC5jIC0gZXNjYXBlICIgaW4ganNvbl9lc2NhcGVfc3RyCiAgKiBDaGFuZ2UgdG8gYXV0b21ha2UgYW5kIGxpYnRvb2wgdG8gYnVpbGQgc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyeQogICAgTWljaGFlbCBDbGFyayA8bWljaGFlbEBtZXRhcGFyYWRpZ20uY29tPgoJCjAuMQogICogaW5pdGlhbCByZWxlYXNlCg==