LyoNCiAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMy4wDQogKiBDb3B5cmlnaHQgKEMpIDIwMjAgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZg0KICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4NCiAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8NCiAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mDQogKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sDQogKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCiAqDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwNCiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKg0KICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTDQogKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1INCiAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUg0KICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4NCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKg0KICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcNCiAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcw0KICoNCiAqIDEgdGFiID09IDQgc3BhY2VzIQ0KICovDQoNCg0KLyoNCiAqIENyZWF0ZXMgYWxsIHRoZSBkZW1vIGFwcGxpY2F0aW9uIHRhc2tzLCB0aGVuIHN0YXJ0cyB0aGUgc2NoZWR1bGVyLiAgVGhlIFdFQg0KICogZG9jdW1lbnRhdGlvbiBwcm92aWRlcyBtb3JlIGRldGFpbHMgb2YgdGhlIHN0YW5kYXJkIGRlbW8gYXBwbGljYXRpb24gdGFza3MNCiAqICh3aGljaCBqdXN0IGV4aXN0IHRvIHRlc3QgdGhlIGtlcm5lbCBwb3J0IGFuZCBwcm92aWRlIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZQ0KICogZWFjaCBGcmVlUlRPUyBBUEkgZnVuY3Rpb24pLg0KICoNCiAqIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBkZW1vIHRhc2tzLCB0aGUgZm9sbG93aW5nIHRhc2tzIGFuZCB0ZXN0cyBhcmUNCiAqIGRlZmluZWQgYW5kL29yIGNyZWF0ZWQgd2l0aGluIHRoaXMgZmlsZToNCiAqDQogKiAiQ2hlY2siIHRhc2sgLSBUaGlzIG9ubHkgZXhlY3V0ZXMgZXZlcnkgZml2ZSBzZWNvbmRzIGJ1dCBoYXMgdGhlIGhpZ2hlc3QNCiAqIHByaW9yaXR5IHNvIGlzIGd1YXJhbnRlZWQgdG8gZ2V0IHByb2Nlc3NvciB0aW1lLiAgSXRzIG1haW4gZnVuY3Rpb24gaXMgdG8NCiAqIGNoZWNrIHRoYXQgYWxsIHRoZSBzdGFuZGFyZCBkZW1vIHRhc2tzIGFyZSBzdGlsbCBvcGVyYXRpb25hbC4gVGhlIGNoZWNrIHRhc2sNCiAqIHdpbGwgdG9nZ2xlIExFRCAzIChQQjExKSBldmVyeSBmaXZlIHNlY29uZHMgc28gbG9uZyBhcyBubyBlcnJvcnMgaGF2ZSBiZWVuDQogKiBkZXRlY3RlZC4gIFRoZSB0b2dnbGUgcmF0ZSB3aWxsIGluY3JlYXNlIHRvIGhhbGYgYSBzZWNvbmQgaWYgYW4gZXJyb3IgaGFzDQogKiBiZWVuIGZvdW5kIGluIGFueSB0YXNrLg0KICoNCiAqICJFY2hvIiB0YXNrIC0gVGhpcyBpcyBhIHZlcnkgYmFzaWMgdGFzayB0aGF0IHNpbXBseSBlY2hvZXMgYW55IGNoYXJhY3RlcnMNCiAqIHJlY2VpdmVkIG9uIENPTTAgKFVTQVJUMSkuICBUaGlzIGNhbiBiZSB0ZXN0ZWQgYnkgdHJhbnNtaXR0aW5nIGEgdGV4dCBmaWxlDQogKiBmcm9tIGEgZHVtYiB0ZXJtaW5hbCB0byB0aGUgU1RNMzIgVVNBUlQgdGhlbiBvYnNlcnZpbmcgb3IgY2FwdHVyaW5nIHRoZSB0ZXh0DQogKiB0aGF0IGlzIGVjaG9lZCBiYWNrLiAgTWlzc2luZyBjaGFyYWN0ZXJzIHdpbGwgYmUgYWxsIHRoZSBtb3JlIG9idmlvdXMgaWYgdGhlDQogKiBmaWxlIGNvbnRhaW5zIGEgc2ltcGxlIHJlcGVhdGluZyBzdHJpbmcgb2YgZml4ZWQgd2lkdGguDQogKg0KICogQ3VycmVudGx5IHRoaXMgZGVtbyBkb2VzIG5vdCBpbmNsdWRlIGludGVycnVwdCBuZXN0aW5nIGV4YW1wbGVzLiAgSGlnaA0KICogZnJlcXVlbmN5IHRpbWVyIGFuZCBzaW1wbGVyIG5lc3RpbmcgZXhhbXBsZXMgY2FuIGJlIGZvdW5kIGluIG1vc3QgQ29ydGV4LU0zDQogKiBkZW1vIGFwcGxpY2F0aW9ucy4NCiAqDQogKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5pdGlhbGlzZSwgc2V0IGFuZCBjbGVhciBMRUQgb3V0cHV0cyBhcmUgbm9ybWFsbHkNCiAqIGRlZmluZWQgaW4gcGFydGVzdC5jLiAgVGhpcyBkZW1vIGluY2x1ZGVzIHR3byBwYXJ0ZXN0IGZpbGVzLCBvbmUgdGhhdCBpcw0KICogY29uZmlndXJlZCBmb3IgdXNlIHdpdGggdGhlIEtlaWwgTUNCU1RNMzIgZXZhbHVhdGlvbiBib2FyZCAoY2FsbGVkDQogKiBQYXJUZXN0X01DQlNUTTMyLmMpIGFuZCBvbmUgdGhhdCBpcyBjb25maWd1cmVkIGZvciB1c2Ugd2l0aCB0aGUgb2ZmaWNpYWwNCiAqIFNUIEV2YWwgYm9hcmQgKGNhbGxlZCBQYXJUZXN0X1NUX0V2YWwuYykuICBPbmUgb25lIG9mIHRoZXNlIGZpbGVzIHNob3VsZCBiZQ0KICogaW5jbHVkZWQgaW4gdGhlIGJ1aWxkIGF0IGFueSBvbmUgdGltZSwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBoYXJkd2FyZQ0KICogYWN0dWFsbHkgYmVpbmcgdXNlZC4NCiAqLw0KDQovKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCg0KLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkZyZWVSVE9TLmgiDQojaW5jbHVkZSAidGFzay5oIg0KI2luY2x1ZGUgInF1ZXVlLmgiDQoNCi8qIExpYnJhcnkgaW5jbHVkZXMuICovDQojaW5jbHVkZSAic3RtMzJmMTB4X2l0LmgiDQoNCi8qIERlbW8gYXBwIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkJsb2NrUS5oIg0KI2luY2x1ZGUgImludGVnZXIuaCINCiNpbmNsdWRlICJmbGFzaC5oIg0KI2luY2x1ZGUgInBhcnRlc3QuaCINCiNpbmNsdWRlICJzZW10ZXN0LmgiDQojaW5jbHVkZSAiR2VuUVRlc3QuaCINCiNpbmNsdWRlICJRUGVlay5oIg0KI2luY2x1ZGUgInJlY211dGV4LmgiDQoNCi8qIERyaXZlciBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJTVE0zMl9VU0FSVC5oIg0KDQoNCi8qIFRoZSB0aW1lIGJldHdlZW4gY3ljbGVzIG9mIHRoZSAnY2hlY2snIHRhc2sgLSB3aGljaCBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlDQpjaGVjayB0YXNrIGhhcyBkZXRlY3RlZCBhbiBlcnJvciBvciBub3QuICovDQojZGVmaW5lIG1haW5DSEVDS19ERUxBWV9OT19FUlJPUgkJCSggKCBUaWNrVHlwZV90ICkgNTAwMCAvIHBvcnRUSUNLX1BFUklPRF9NUyApDQojZGVmaW5lIG1haW5DSEVDS19ERUxBWV9FUlJPUgkJCQkoICggVGlja1R5cGVfdCApIDUwMCAvIHBvcnRUSUNLX1BFUklPRF9NUyApDQoNCi8qIFRoZSBMRUQgY29udHJvbGxlZCBieSB0aGUgJ2NoZWNrJyB0YXNrLiAqLw0KI2RlZmluZSBtYWluQ0hFQ0tfTEVECQkJCQkJKCAzICkNCg0KLyogVGFzayBwcmlvcml0aWVzLiAqLw0KI2RlZmluZSBtYWluU0VNX1RFU1RfUFJJT1JJVFkJCQkJKCB0c2tJRExFX1BSSU9SSVRZICsgMSApDQojZGVmaW5lIG1haW5CTE9DS19RX1BSSU9SSVRZCQkJCSggdHNrSURMRV9QUklPUklUWSArIDIgKQ0KI2RlZmluZSBtYWluQ0hFQ0tfVEFTS19QUklPUklUWQkJCQkoIHRza0lETEVfUFJJT1JJVFkgKyAzICkNCiNkZWZpbmUgbWFpbkZMQVNIX1RBU0tfUFJJT1JJVFkJCQkJKCB0c2tJRExFX1BSSU9SSVRZICsgMiApDQojZGVmaW5lIG1haW5FQ0hPX1RBU0tfUFJJT1JJVFkJCQkJKCB0c2tJRExFX1BSSU9SSVRZICsgMSApDQojZGVmaW5lIG1haW5JTlRFR0VSX1RBU0tfUFJJT1JJVFkgICAgICAgICAgICggdHNrSURMRV9QUklPUklUWSApDQojZGVmaW5lIG1haW5HRU5fUVVFVUVfVEFTS19QUklPUklUWQkJCSggdHNrSURMRV9QUklPUklUWSApDQoNCi8qIENPTSBwb3J0IGFuZCBiYXVkIHJhdGUgdXNlZCBieSB0aGUgZWNobyB0YXNrLiAqLw0KI2RlZmluZSBtYWluQ09NMAkJCQkJCQkoIDAgKQ0KI2RlZmluZSBtYWluQkFVRF9SQVRFCQkJCQkJKCAxMTUyMDAgKQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoNCiAqIENvbmZpZ3VyZSB0aGUgaGFyZHdhcmUgZm9yIHRoZSBkZW1vLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEhhcmR3YXJlKCB2b2lkICk7DQoNCi8qIFRoZSAnY2hlY2snIHRhc2sgYXMgZGVzY3JpYmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLiAqLw0Kc3RhdGljIHZvaWQgcHJ2Q2hlY2tUYXNrKCB2b2lkICpwdlBhcmFtZXRlcnMgKTsNCg0KLyogQSBzaW1wbGUgdGFzayB0aGF0IGVjaG9lcyBhbGwgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcmUgcmVjZWl2ZWQgb24gQ09NMA0KKFVTQVJUMSkuICovDQpzdGF0aWMgdm9pZCBwcnZVU0FSVEVjaG9UYXNrKCB2b2lkICpwdlBhcmFtZXRlcnMgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCmludCBtYWluKCB2b2lkICkNCnsNCiNpZmRlZiBERUJVRw0KICBkZWJ1ZygpOw0KI2VuZGlmDQoNCgkvKiBTZXQgdXAgdGhlIGNsb2NrcyBhbmQgbWVtb3J5IGludGVyZmFjZS4gKi8NCglwcnZTZXR1cEhhcmR3YXJlKCk7DQoNCgkvKiBTdGFydCB0aGUgc3RhbmRhcmQgZGVtbyB0YXNrcy4gIFRoZXNlIGFyZSBqdXN0IGhlcmUgdG8gZXhlcmNpc2UgdGhlDQoJa2VybmVsIHBvcnQgYW5kIHByb3ZpZGUgZXhhbXBsZXMgb2YgaG93IHRoZSBGcmVlUlRPUyBBUEkgY2FuIGJlIHVzZWQuICovDQoJdlN0YXJ0QmxvY2tpbmdRdWV1ZVRhc2tzKCBtYWluQkxPQ0tfUV9QUklPUklUWSApOw0KICAgIHZTdGFydFNlbWFwaG9yZVRhc2tzKCBtYWluU0VNX1RFU1RfUFJJT1JJVFkgKTsNCiAgICB2U3RhcnRJbnRlZ2VyTWF0aFRhc2tzKCBtYWluSU5URUdFUl9UQVNLX1BSSU9SSVRZICk7DQogICAgdlN0YXJ0R2VuZXJpY1F1ZXVlVGFza3MoIG1haW5HRU5fUVVFVUVfVEFTS19QUklPUklUWSApOw0KCXZTdGFydExFREZsYXNoVGFza3MoIG1haW5GTEFTSF9UQVNLX1BSSU9SSVRZICk7DQogICAgdlN0YXJ0UXVldWVQZWVrVGFza3MoKTsNCiAgICB2U3RhcnRSZWN1cnNpdmVNdXRleFRhc2tzKCk7DQoNCgkvKiBDcmVhdGUgdGhlICdlY2hvJyB0YXNrLCB3aGljaCBpcyBhbHNvIGRlZmluZWQgd2l0aGluIHRoaXMgZmlsZS4gKi8NCgl4VGFza0NyZWF0ZSggcHJ2VVNBUlRFY2hvVGFzaywgIkVjaG8iLCBjb25maWdNSU5JTUFMX1NUQUNLX1NJWkUsIE5VTEwsIG1haW5FQ0hPX1RBU0tfUFJJT1JJVFksIE5VTEwgKTsNCg0KCS8qIENyZWF0ZSB0aGUgJ2NoZWNrJyB0YXNrLCB3aGljaCBpcyBhbHNvIGRlZmluZWQgd2l0aGluIHRoaXMgZmlsZS4gKi8NCgl4VGFza0NyZWF0ZSggcHJ2Q2hlY2tUYXNrLCAiQ2hlY2siLCBjb25maWdNSU5JTUFMX1NUQUNLX1NJWkUsIE5VTEwsIG1haW5DSEVDS19UQVNLX1BSSU9SSVRZLCBOVUxMICk7DQoNCiAgICAvKiBTdGFydCB0aGUgc2NoZWR1bGVyLiAqLw0KCXZUYXNrU3RhcnRTY2hlZHVsZXIoKTsNCg0KICAgIC8qIFdpbGwgb25seSBnZXQgaGVyZSBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBjcmVhdGUgdGhlIGlkbGUNCiAgICB0YXNrLiAgVGhlIGlkbGUgdGFzayBpcyBjcmVhdGVkIHdpdGhpbiB2VGFza1N0YXJ0U2NoZWR1bGVyKCkuICovDQoJZm9yKCA7OyApOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIERlc2NyaWJlZCBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4gKi8NCnN0YXRpYyB2b2lkIHBydkNoZWNrVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICkNCnsNClRpY2tUeXBlX3QgeExhc3RFeGVjdXRpb25UaW1lOw0KdW5zaWduZWQgbG9uZyB1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX05PX0VSUk9SOw0KDQoJLyogSnVzdCB0byByZW1vdmUgdGhlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdGhlIHVudXNlZCBwYXJhbWV0ZXIuICovDQoJKCB2b2lkICkgcHZQYXJhbWV0ZXJzOw0KDQoJLyogSW5pdGlhbGlzZSB0aGUgdmFyaWFibGUgdXNlZCB0byBjb250cm9sIG91ciBpdGVyYXRpb24gcmF0ZSBwcmlvciB0bw0KCWl0cyBmaXJzdCB1c2UuICovDQoJeExhc3RFeGVjdXRpb25UaW1lID0geFRhc2tHZXRUaWNrQ291bnQoKTsNCg0KCWZvciggOzsgKQ0KCXsNCgkJLyogV2FpdCB1bnRpbCBpdCBpcyB0aW1lIHRvIHJ1biB0aGUgdGVzdHMgYWdhaW4uICovDQoJCXZUYXNrRGVsYXlVbnRpbCggJnhMYXN0RXhlY3V0aW9uVGltZSwgdWxUaWNrc1RvV2FpdCApOw0KDQoJCS8qIEhhcyBhbiBlcnJvciBiZWVuIGZvdW5kIGluIGFueSB0YXNrPyAqLw0KCQlpZiggeEFyZUdlbmVyaWNRdWV1ZVRhc2tzU3RpbGxSdW5uaW5nKCkgIT0gcGRUUlVFICkNCgkJew0KCQkJLyogUmVkdWNlIHRoZSB0aW1lIGJldHdlZW4gY3ljbGVzIG9mIHRoaXMgdGFzayAtIHdoaWNoIGhhcyB0aGUNCgkJCWVmZmVjdCBvZiBpbmNyZWFzaW5nIHRoZSByYXRlIGF0IHdoaWNoIHRoZSAnY2hlY2snIExFRCB0b2dnbGVzIHRvDQoJCQlpbmRpY2F0ZSB0aGUgZXhpc3RlbmNlIG9mIGFuIGVycm9yIHRvIGFuIG9ic2VydmVyLiAqLw0KCQkJdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9FUlJPUjsNCgkJfQ0KCQllbHNlIGlmKCB4QXJlUXVldWVQZWVrVGFza3NTdGlsbFJ1bm5pbmcoKSAhPSBwZFRSVUUgKQ0KCQl7DQoJCQl1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX0VSUk9SOw0KCQl9DQoJCWVsc2UgaWYoIHhBcmVCbG9ja2luZ1F1ZXVlc1N0aWxsUnVubmluZygpICE9IHBkVFJVRSApDQoJCXsNCgkJCXVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfRVJST1I7DQoJCX0NCgkJZWxzZSBpZiggeEFyZVNlbWFwaG9yZVRhc2tzU3RpbGxSdW5uaW5nKCkgIT0gcGRUUlVFICkNCgkJew0KCQkJdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9FUlJPUjsNCgkJfQ0KCQllbHNlIGlmKCB4QXJlSW50ZWdlck1hdGhzVGFza1N0aWxsUnVubmluZygpICE9IHBkVFJVRSApDQoJCXsNCgkJCXVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfRVJST1I7DQoJCX0NCgkJZWxzZSBpZiggeEFyZVJlY3Vyc2l2ZU11dGV4VGFza3NTdGlsbFJ1bm5pbmcoKSAhPSBwZFRSVUUgKQ0KCQl7DQoJCQl1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX0VSUk9SOw0KCQl9DQoNCgkJdlBhclRlc3RUb2dnbGVMRUQoIG1haW5DSEVDS19MRUQgKTsNCgl9DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogRGVzY3JpYmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLiAqLw0Kc3RhdGljIHZvaWQgcHJ2VVNBUlRFY2hvVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICkNCnsNCnNpZ25lZCBjaGFyIGNDaGFyOw0KDQovKiBTdHJpbmcgZGVjbGFyZWQgc3RhdGljIHRvIGVuc3VyZSBpdCBkb2VzIG5vdCBlbmQgdXAgb24gdGhlIHN0YWNrLCBubyBtYXR0ZXINCndoYXQgdGhlIG9wdGltaXNhdGlvbiBsZXZlbC4gKi8NCnN0YXRpYyBjb25zdCBjaGFyICpwY0xvbmdpc2hTdHJpbmcgPQ0KIkFCQkEgd2FzIGEgU3dlZGlzaCBwb3AgbXVzaWMgZ3JvdXAgZm9ybWVkIGluIFN0b2NraG9sbSBpbiAxOTcyLCBjb25zaXN0aW5nIG9mIEFubmktRnJpZCBGcmlkYSBMeW5nc3RhZCwgIg0KIkJq9nJuIFVsdmFldXMsIEJlbm55IEFuZGVyc3NvbiBhbmQgQWduZXRoYSBG5Gx0c2tvZy4gVGhyb3VnaG91dCB0aGUgYmFuZCdzIGV4aXN0ZW5jZSwgRuRsdHNrb2cgYW5kIFVsdmFldXMgIg0KIndlcmUgYSBtYXJyaWVkIGNvdXBsZSwgYXMgd2VyZSBMeW5nc3RhZCBhbmQgQW5kZXJzc29uIC0gYWx0aG91Z2ggYm90aCBjb3VwbGVzIGxhdGVyIGRpdm9yY2VkLiBUaGV5IGJlY2FtZSBvbmUgIg0KIm9mIHRoZSBtb3N0IGNvbW1lcmNpYWxseSBzdWNjZXNzZnVsIGFjdHMgaW4gdGhlIGhpc3Rvcnkgb2YgcG9wdWxhciBtdXNpYywgYW5kIHRoZXkgdG9wcGVkIHRoZSBjaGFydHMgd29ybGR3aWRlICINCiJmcm9tIDE5NzIgdG8gMTk4My4gIEFCQkEgZ2FpbmVkIGludGVybmF0aW9uYWwgcG9wdWxhcml0eSBlbXBsb3lpbmcgY2F0Y2h5IHNvbmcgaG9va3MsIHNpbXBsZSBseXJpY3MsIHNvdW5kICINCiJlZmZlY3RzIChyZXZlcmIsIHBoYXNpbmcpIGFuZCBhIFdhbGwgb2YgU291bmQgYWNoaWV2ZWQgYnkgb3ZlcmR1YmJpbmcgdGhlIGZlbWFsZSBzaW5nZXJzJyB2b2ljZXMgaW4gbXVsdGlwbGUgIg0KImhhcm1vbmllcy4gQXMgdGhlaXIgcG9wdWxhcml0eSBncmV3LCB0aGV5IHdlcmUgc291Z2h0IGFmdGVyIHRvIHRvdXIgRXVyb3BlLCBBdXN0cmFsaWEsIGFuZCBOb3J0aCBBbWVyaWNhLCBkcmF3aW5nICINCiJjcm93ZHMgb2YgYXJkZW50IGZhbnMsIG5vdGFibHkgaW4gQXVzdHJhbGlhLiBUb3VyaW5nIGJlY2FtZSBhIGNvbnRlbnRpb3VzIGlzc3VlLCBiZWluZyBwYXJ0aWN1bGFybHkgY3VtYmVyc29tZSBmb3IgIg0KIkbkbHRza29nLCBidXQgdGhleSBjb250aW51ZWQgdG8gcmVsZWFzZSBzdHVkaW8gYWxidW1zIHRvIHdpZGVzcHJlYWQgY29tbWVyY2lhbCBzdWNjZXNzLiBBdCB0aGUgaGVpZ2h0IG9mIHRoZWlyICINCiJwb3B1bGFyaXR5LCBob3dldmVyLCBib3RoIHJlbGF0aW9uc2hpcHMgYmVnYW4gc3VmZmVyaW5nIHN0cmFpbiB0aGF0IGxlZCB1bHRpbWF0ZWx5IHRvIHRoZSBjb2xsYXBzZSBvZiBmaXJzdCB0aGUgIg0KIlVsdmFldXMtRuRsdHNrb2cgbWFycmlhZ2UgKGluIDE5NzkpIGFuZCB0aGVuIG9mIHRoZSBBbmRlcnNzb24tTHluZ3N0YWQgbWFycmlhZ2UgaW4gMTk4MS4gSW4gdGhlIGxhdGUgMTk3MHMgYW5kIGVhcmx5ICINCiIxOTgwcyB0aGVzZSByZWxhdGlvbnNoaXAgY2hhbmdlcyBiZWdhbiBtYW5pZmVzdGluZyBpbiB0aGUgZ3JvdXAncyBtdXNpYywgYXMgdGhleSBwcm9kdWNlZCBtb3JlIHRob3VnaHRmdWwsICINCiJpbnRyb3NwZWN0aXZlIGx5cmljcyB3aXRoIGRpZmZlcmVudCBjb21wb3NpdGlvbnMuIjsNCg0KCS8qIEp1c3QgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuICovDQoJKCB2b2lkICkgcHZQYXJhbWV0ZXJzOw0KDQoJLyogSW5pdGlhbGlzZSBDT00wLCB3aGljaCBpcyBVU0FSVDEgYWNjb3JkaW5nIHRvIHRoZSBTVE0zMiBsaWJyYXJpZXMuICovDQoJbENPTVBvcnRJbml0KCBtYWluQ09NMCwgbWFpbkJBVURfUkFURSApOw0KDQoJLyogVHJ5IHNlbmRpbmcgb3V0IGEgc3RyaW5nIGFsbCBpbiBvbmUgZ28sIGFzIGEgdmVyeSBiYXNpYyB0ZXN0IG9mIHRoZQ0KICAgIGxTZXJpYWxQdXRTdHJpbmcoKSBmdW5jdGlvbi4gKi8NCiAgICBsU2VyaWFsUHV0U3RyaW5nKCBtYWluQ09NMCwgcGNMb25naXNoU3RyaW5nLCBzdHJsZW4oIHBjTG9uZ2lzaFN0cmluZyApICk7DQoNCglmb3IoIDs7ICkNCgl7DQoJCS8qIEJsb2NrIHRvIHdhaXQgZm9yIGEgY2hhcmFjdGVyIHRvIGJlIHJlY2VpdmVkIG9uIENPTTAuICovDQoJCXhTZXJpYWxHZXRDaGFyKCBtYWluQ09NMCwgJmNDaGFyLCBwb3J0TUFYX0RFTEFZICk7DQoNCgkJLyogV3JpdGUgdGhlIHJlY2VpdmVkIGNoYXJhY3RlciBiYWNrIHRvIENPTTAuICovDQoJCXhTZXJpYWxQdXRDaGFyKCBtYWluQ09NMCwgY0NoYXIsIDAgKTsNCgl9DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBIYXJkd2FyZSggdm9pZCApDQp7DQoJLyogUkNDIHN5c3RlbSByZXNldChmb3IgZGVidWcgcHVycG9zZSkuICovDQoJUkNDX0RlSW5pdCAoKTsNCg0KICAgIC8qIEVuYWJsZSBIU0UuICovDQoJUkNDX0hTRUNvbmZpZyggUkNDX0hTRV9PTiApOw0KDQoJLyogV2FpdCB0aWxsIEhTRSBpcyByZWFkeS4gKi8NCgl3aGlsZSAoUkNDX0dldEZsYWdTdGF0dXMoUkNDX0ZMQUdfSFNFUkRZKSA9PSBSRVNFVCk7DQoNCiAgICAvKiBIQ0xLID0gU1lTQ0xLLiAqLw0KCVJDQ19IQ0xLQ29uZmlnKCBSQ0NfU1lTQ0xLX0RpdjEgKTsNCg0KICAgIC8qIFBDTEsyICA9IEhDTEsuICovDQoJUkNDX1BDTEsyQ29uZmlnKCBSQ0NfSENMS19EaXYxICk7DQoNCiAgICAvKiBQQ0xLMSAgPSBIQ0xLLzIuICovDQoJUkNDX1BDTEsxQ29uZmlnKCBSQ0NfSENMS19EaXYyICk7DQoNCgkvKiBBRENDTEsgPSBQQ0xLMi80LiAqLw0KCVJDQ19BRENDTEtDb25maWcoIFJDQ19QQ0xLMl9EaXY0ICk7DQoNCiAgICAvKiBGbGFzaCAyIHdhaXQgc3RhdGUuICovDQoJKiggdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAgKiApMHg0MDAyMjAwMCA9IDB4MDE7DQoNCgkvKiBQTExDTEsgPSA4TUh6ICogOSA9IDcyIE1IeiAqLw0KCVJDQ19QTExDb25maWcoIFJDQ19QTExTb3VyY2VfSFNFX0RpdjEsIFJDQ19QTExNdWxfOSApOw0KDQogICAgLyogRW5hYmxlIFBMTC4gKi8NCglSQ0NfUExMQ21kKCBFTkFCTEUgKTsNCg0KCS8qIFdhaXQgdGlsbCBQTEwgaXMgcmVhZHkuICovDQoJd2hpbGUgKFJDQ19HZXRGbGFnU3RhdHVzKFJDQ19GTEFHX1BMTFJEWSkgPT0gUkVTRVQpOw0KDQoJLyogU2VsZWN0IFBMTCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLiAqLw0KCVJDQ19TWVNDTEtDb25maWcgKFJDQ19TWVNDTEtTb3VyY2VfUExMQ0xLKTsNCg0KCS8qIFdhaXQgdGlsbCBQTEwgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLiAqLw0KCXdoaWxlIChSQ0NfR2V0U1lTQ0xLU291cmNlKCkgIT0gMHgwOCk7DQoNCgkvKiBFbmFibGUgR1BJT0EsIEdQSU9CLCBHUElPQywgR1BJT0QsIEdQSU9FIGFuZCBBRklPIGNsb2NrcyAqLw0KCVJDQ19BUEIyUGVyaXBoQ2xvY2tDbWQoCVJDQ19BUEIyUGVyaXBoX0dQSU9BIHwgUkNDX0FQQjJQZXJpcGhfR1BJT0IgfFJDQ19BUEIyUGVyaXBoX0dQSU9DDQoJCQkJCQkJfCBSQ0NfQVBCMlBlcmlwaF9HUElPRCB8IFJDQ19BUEIyUGVyaXBoX0dQSU9FIHwgUkNDX0FQQjJQZXJpcGhfQUZJTywgRU5BQkxFICk7DQoNCgkvKiBTZXQgdGhlIFZlY3RvciBUYWJsZSBiYXNlIGFkZHJlc3MgYXQgMHgwODAwMDAwMC4gKi8NCglOVklDX1NldFZlY3RvclRhYmxlKCBOVklDX1ZlY3RUYWJfRkxBU0gsIDB4MCApOw0KDQoJTlZJQ19Qcmlvcml0eUdyb3VwQ29uZmlnKCBOVklDX1ByaW9yaXR5R3JvdXBfNCApOw0KDQoJLyogQ29uZmlndXJlIEhDTEsgY2xvY2sgYXMgU3lzVGljayBjbG9jayBzb3VyY2UuICovDQoJU3lzVGlja19DTEtTb3VyY2VDb25maWcoIFN5c1RpY2tfQ0xLU291cmNlX0hDTEsgKTsNCg0KCS8qIEluaXRpYWxpc2UgdGhlIElPIHVzZWQgZm9yIHRoZSBMRUQgb3V0cHV0cy4gKi8NCgl2UGFyVGVzdEluaXRpYWxpc2UoKTsNCg0KCS8qIFNQSTIgUGVyaXBoIGNsb2NrIGVuYWJsZSAqLw0KCVJDQ19BUEIxUGVyaXBoQ2xvY2tDbWQoIFJDQ19BUEIxUGVyaXBoX1NQSTIsIEVOQUJMRSApOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnZvaWQgdkFwcGxpY2F0aW9uU3RhY2tPdmVyZmxvd0hvb2soIFRhc2tIYW5kbGVfdCBweFRhc2ssIGNoYXIgKnBjVGFza05hbWUgKQ0Kew0KCS8qIFRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgY2FsbGVkIGlmIGEgdGFzayBvdmVyZmxvd3MgaXRzIHN0YWNrLiAgIElmIHRoZQ0KCXBhcmFtZXRlcnMgYXJlIGNvcnJ1cHQgdGhlbiBpbnNwZWN0IHB4Q3VycmVudFRDQiB0byBmaW5kIHdoaWNoIHdhcyB0aGUNCglvZmZlbmRpbmcgdGFzay4gKi8NCg0KCSggdm9pZCApIHB4VGFzazsNCgkoIHZvaWQgKSBwY1Rhc2tOYW1lOw0KDQoJZm9yKCA7OyApOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnZvaWQgYXNzZXJ0X2ZhaWxlZCggdW5zaWduZWQgY2hhciAqcHVjRmlsZSwgdW5zaWduZWQgbG9uZyB1bExpbmUgKQ0Kew0KCSggdm9pZCApIHB1Y0ZpbGU7DQoJKCB2b2lkICkgdWxMaW5lOw0KDQoJZm9yKCA7OyApOw0KfQ0KDQo=