LyoKICogIGFybWJvb3QgLSBTdGFydHVwIENvZGUgZm9yIE9NUDI0MjAvQVJNMTEzNiBDUFUtY29yZQogKgogKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgIFRleGFzIEluc3RydW1lbnRzCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDEJTWFyaXVzIEdy9mdlciA8bWFnQHN5c2dvLmRlPgogKiAgQ29weXJpZ2h0IChjKSAyMDAyCUFsZXggWvxwa2UgPGF6dUBzeXNnby5kZT4KICogIENvcHlyaWdodCAoYykgMjAwMglHYXJ5IEplbm5lam9obiA8Z2pAZGVueC5kZT4KICogIENvcHlyaWdodCAoYykgMjAwMwlSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CiAqICBDb3B5cmlnaHQgKGMpIDIwMDMJS3NoaXRpaiA8a3NoaXRpakB0aS5jb20+CiAqICBDb3B5cmlnaHQgKGMpIDIwMDQJSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29uZmlnLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KCi5nbG9ibCBfc3RhcnQKX3N0YXJ0OgoJYglyZXNldAogCWxkcglwYywgX2hhbmcKCWxkcglwYywgX2hhbmcKCWxkcglwYywgX2hhbmcKCWxkcglwYywgX2hhbmcKCWxkcglwYywgX2hhbmcKCWxkcglwYywgX2hhbmcKCWxkcglwYywgX2hhbmcKCl9oYW5nOgogCS53b3JkIGRvX2hhbmcKCgkud29yZCAweDEyMzQ1Njc4Cgkud29yZCAweDEyMzQ1Njc4Cgkud29yZCAweDEyMzQ1Njc4Cgkud29yZCAweDEyMzQ1Njc4Cgkud29yZCAweDEyMzQ1Njc4Cgkud29yZCAweDEyMzQ1Njc4Cgkud29yZCAweDEyMzQ1Njc4IC8qIG5vdyAxNio0PTY0ICovCgouZ2xvYmFsIF9lbmRfdmVjdApfZW5kX3ZlY3Q6CgoJLmJhbGlnbmwgMTYsMHhkZWFkYmVlZgovKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBTdGFydHVwIENvZGUgKHJlc2V0IHZlY3RvcikKICoKICogZG8gaW1wb3J0YW50IGluaXQgb25seSBpZiB3ZSBkb24ndCBzdGFydCBmcm9tIG1lbW9yeSEKICogc2V0dXAgTWVtb3J5IGFuZCBib2FyZCBzcGVjaWZpYyBiaXRzIHByaW9yIHRvIHJlbG9jYXRpb24uCiAqIHJlbG9jYXRlIGFybWJvb3QgdG8gcmFtCiAqIHNldHVwIHN0YWNrCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKX1RFWFRfQkFTRToKCS53b3JkCVRFWFRfQkFTRQoKI2lmbmRlZiBTVEFDS19CQVNFCiNkZWZpbmUgU1RBQ0tfQkFTRSBURVhUX0JBU0UKI2VuZGlmCgkKX1NUQUNLX0JBU0U6CiAgICAud29yZCAgIFNUQUNLX0JBU0UKCi5nbG9ibCBfYXJtYm9vdF9zdGFydApfYXJtYm9vdF9zdGFydDoKCS53b3JkIF9zdGFydAoKLyoKICogVGhlc2UgYXJlIGRlZmluZWQgaW4gdGhlIGJvYXJkLXNwZWNpZmljIGxpbmtlciBzY3JpcHQuCiAqLwouZ2xvYmwgX2Jzc19zdGFydApfYnNzX3N0YXJ0OgoJLndvcmQgX19ic3Nfc3RhcnQKCi5nbG9ibCBfYnNzX2VuZApfYnNzX2VuZDoKCS53b3JkIF9lbmQKCi8qCiAqIHRoZSBhY3R1YWwgcmVzZXQgY29kZQogKi8KCnJlc2V0OgoJLyoKCSAqIHNldCB0aGUgY3B1IHRvIFNWQzMyIG1vZGUKCSAqLwoJbXJzCXIwLGNwc3IKCWJpYwlyMCxyMCwjMHgxZgoJb3JyCXIwLHIwLCMweGQzCgltc3IJY3BzcixyMAoKCS8qIENvcHkgdmVjdG9ycyB0byBtYXNrIFJPTSBpbmRpcmVjdCBhZGRyICovCglhZHIgICAgIHIwLCBfc3RhcnQgICAgICAgICAgICAgIC8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCglhZGQgICAgIHIwLCByMCwgIzQJCQkJLyogc2tpcCByZXNldCB2ZWN0b3IJCQkqLwoJbW92ICAgICByMiwgIzY0ICAgICAgICAgICAgICAgICAvKiByMiA8LSBzaXplIHRvIGNvcHkgICovCglhZGQgICAgIHIyLCByMCwgcjIgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCgltb3YgICAgIHIxLCAjU1JBTV9PRkZTRVQwICAgICAgICAgLyogYnVpbGQgdmVjdCBhZGRyICovCgltb3YgICAgIHIzLCAjU1JBTV9PRkZTRVQxCglhZGQgICAgIHIxLCByMSwgcjMKCW1vdiAgICAgcjMsICNTUkFNX09GRlNFVDIKCWFkZCAgICAgcjEsIHIxLCByMwpuZXh0OgoJbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLwoJc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLwoJY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLwoJYm5lICAgICBuZXh0ICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVudGlsIGVxdWFsICovCgoJYmwJY3B5X2Nsa19jb2RlICAgICAgICAgICAgLyogcHV0IGRwbGwgYWRqdXN0IGNvZGUgYmVoaW5kIHZlY3RvcnMgKi8KCgkvKiB0aGUgbWFzayBST00gY29kZSBzaG91bGQgaGF2ZSBQTEwgYW5kIG90aGVycyBzdGFibGUgKi8KCWJsICBjcHVfaW5pdF9jcml0CgpyZWxvY2F0ZToJCQkJLyogcmVsb2NhdGUgVS1Cb290IHRvIFJBTQkgICAgKi8KCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLwoJbGRyCXIxLCBfVEVYVF9CQVNFCQkvKiB0ZXN0IGlmIHdlIHJ1biBmcm9tIGZsYXNoIG9yIFJBTSAqLwoJY21wIHIwLCByMSAgICAgICAgICAgICAgICAgIAkvKiBubyBuZWVkIHRvIHJlbG9jYXRlIGlmIFhJUCAgICAgICAqLwoJYmVxIHN0YWNrX3NldHVwCQkJLyogc2tpcCB0eHQgY3B5IGlmIFhJUChTUkFNLCBTRFJBTSkgKi8KCglsZHIJcjIsIF9hcm1ib290X3N0YXJ0CglsZHIJcjMsIF9ic3Nfc3RhcnQKCXN1YglyMiwgcjMsIHIyCQkvKiByMiA8LSBzaXplIG9mIGFybWJvb3QgICAgICAgICAgICAqLwoJYWRkCXIyLCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCgpjb3B5X2xvb3A6CglsZG1pYQlyMCEsIHtyMy1yMTB9CQkvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLwoJc3RtaWEJcjEhLCB7cjMtcjEwfQkJLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlZWUgW3IyXSAgICAqLwoJYmxlCWNvcHlfbG9vcAoKCS8qIFNldCB1cCB0aGUgc3RhY2sJCQkJCQkgICAgKi8Kc3RhY2tfc2V0dXA6CglsZHIJcjAsIF9TVEFDS19CQVNFCQkvKiB1cHBlciAxMjggS2lCOiByZWxvY2F0ZWQgdWJvb3QgICAqLwoJc3ViCXNwLCByMCwgIzEyOAkJLyogbGVhdmUgMzIgd29yZHMgZm9yIGFib3J0LXN0YWNrICAgKi8KCWFuZAlzcCwgc3AsICN+NwkJLyogOCBieXRlIGFsaW5nZWQgZm9yIChsZHIvc3RyKWQgICAgKi8KCgkvKiBDbGVhciBCU1MgKGlmIGFueSkuICBJcyBiZWxvdyB0eCAod2F0Y2ggbG9hZCBhZGRyIC0gbmVlZCBzcGFjZSkgICovCmNsZWFyX2JzczoKCWxkcglyMCwgX2Jzc19zdGFydAkJLyogZmluZCBzdGFydCBvZiBic3Mgc2VnbWVudCAgICAgICAgKi8KCWxkcglyMSwgX2Jzc19lbmQJCS8qIHN0b3AgaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCgltb3YgCXIyLCAjMHgwMDAwMDAwMAkJLyogY2xlYXIgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgKi8KY2xic3NfbDoKCXN0cglyMiwgW3IwXQkJLyogY2xlYXIgQlNTIGxvY2F0aW9uICAgICAgICAgICAgICAgKi8KCWNtcAlyMCwgcjEJCQkvKiBhcmUgd2UgYXQgdGhlIGVuZCB5ZXQgICAgICAgICAgICAqLwoJYWRkCXIwLCByMCwgIzQJCS8qIGluY3JlbWVudCBjbGVhciBpbmRleCBwb2ludGVyICAgICovCglibmUJY2xic3NfbCAgICAgICAgICAgICAgICAgLyoga2VlcCBjbGVhcmluZyB0aWxsIGF0IGVuZCAgICAgICAgKi8KCglsZHIJcGMsIF9zdGFydF9hcm1ib290CS8qIGp1bXAgdG8gQyBjb2RlICAgICAgICAgICAgICAgICAgICovCgpfc3RhcnRfYXJtYm9vdDoJLndvcmQgc3RhcnRfYXJtYm9vdAoKCi8qCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENQVV9pbml0X2NyaXRpY2FsIHJlZ2lzdGVycwogKgogKiBzZXR1cCBpbXBvcnRhbnQgcmVnaXN0ZXJzCiAqIHNldHVwIG1lbW9yeSB0aW1pbmcKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCmNwdV9pbml0X2NyaXQ6CgkvKgoJICogSW52YWxpZGF0ZSBMMSBJL0QKCSAqLwogICAgICAgIG1vdglyMCwgIzAgICAgICAgICAgICAgICAgIC8qIHNldCB1cCBmb3IgTUNSICovCiAgICAgICAgbWNyCXAxNSwgMCwgcjAsIGM4LCBjNywgMCAgLyogaW52YWxpZGF0ZSBUTEJzICovCiAgICAgICAgbWNyCXAxNSwgMCwgcjAsIGM3LCBjNSwgMSAgLyogaW52YWxpZGF0ZSBpY2FjaGUgKi8KCgkvKiBJbnZhbGlkZSBMMiBjYWNoZSAoZ3AgZGV2aWNlIGNhbGwgcG9pbnQpCgkgKiAtIHdhcm5pbmcsIHRoaXMgbWF5IGhhdmUgaXNzdWVzIG9uIEVNVS9IUyBkZXZpY2VzCgkgKiB0aGlzIGNhbGwgY2FuIGNvcnJ1cHQgcjAtcjUKCSAqLwoJbW92IHIxMiwgIzB4MQkJQCBzZXQgdXAgdG8gaW52YWxpZGUgTDIKLyoKICogVE9ETzogTmVlZCB0byByZXZlcnQgYmFjayBvbiBHUCBkZXZpY2UuCiAqLwovKgpzbWk6IAkud29yZCAweEUxNjAwMDcwCUAgQ2FsbCBTTUkgbW9uaXRvcgoqLwoJLyoKCSAqIGRpc2FibGUgTU1VIHN0dWZmIGFuZCBjYWNoZXMKCSAqLwoJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAoJYmljCXIwLCByMCwgIzB4MDAwMDIwMDAJQCBjbGVhciBiaXRzIDEzICgtLVYtKQoJYmljCXIwLCByMCwgIzB4MDAwMDAwMDcJQCBjbGVhciBiaXRzIDI6MCAoLUNBTSkKCW9ycglyMCwgcjAsICMweDAwMDAwMDAyCUAgc2V0IGJpdCAxICgtLUEtKSBBbGlnbgojaWZuZGVmIENPTkZJR19JQ0FDSEVfT0ZGCglvcnIJcjAsIHIwLCAjMHgwMDAwMTgwMAlAIHNldCBiaXQgMTEsMTIgKC0tLUkgWi0tLSkgQlRCLEktQ2FjaGUKI2VuZGlmCgltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCgoJLyoKICAgICAgICAgKiBKdW1wIHRvIGJvYXJkIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLi4uIFRoZSBNYXNrIFJPTSB3aWxsIGhhdmUgYWxyZWFkeSBpbml0aWFsaXplZAogICAgICAgICAqIGJhc2ljIG1lbW9yeS4gIEdvIGhlcmUgdG8gYnVtcCB1cCBjbG9jayByYXRlIGFuZCBoYW5kbGUgd2FrZSB1cCBjb25kaXRpb25zLgoJICovCglhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KCWNtcCAgICAgcjAsIHIxICAgICAgICAgICAgICAgICAgLyogcGFzcyBvbiBpbmZvIGFib3V0IHNraXBwaW5nIHNvbWUgaW5pdCBwb3J0aW9ucyAqLwoJbW92ZXEgICByMCwjMHgxICAgICAgICAgICAgICAgICAvKiBmbGFnIHRvIHNraXAgcHJjbSBhbmQgc2RyYyBzZXR1cCAqLwoJbW92bmUgICByMCwjMHgwCgoJbW92CWlwLCBsciAgICAgICAgICAvKiBwZXJzZXZlcmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KCWJsCWxvd2xldmVsX2luaXQgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLwoJbW92CWxyLCBpcCAgICAgICAgICAvKiByZXN0b3JlIGxpbmsgKi8KCW1vdglwYywgbHIgICAgICAgICAgLyogYmFjayB0byBteSBjYWxsZXIgKi8KCi8qCiAqIGV4Y2VwdGlvbiBoYW5kbGVyCiAqLwogCS5hbGlnbiAgNQpkb19oYW5nOgoJbGRyCXNwLCBfVEVYVF9CQVNFCQkvKiB1c2UgMzIgd29yZHMgYWJvcnQgc3RhY2sgKi8KICAgCWJsCWhhbmcJCQkvKiBoYW5nIGFuZCBuZXZlciByZXR1cm4gKi8KCg==